嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 V5 k! H8 }! S! t4 x0 I* {
- z& n6 g4 c. }, n+ ^" W. {) E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- h1 u. _* y0 ^5 {" s \0 ^4 U4 E
#include <unistd.h>
9 [4 y% Y+ `) d, v0 z% [2 w, Z2 G
#include <sys/mman.h>
6 w1 M. c( Y3 B& J9 g9 o- x
#include <sys/types.h>
( G0 u6 @) j1 A- U. c; y2 h
#include <fcntl.h>
- \- }- ]6 T3 p
/ W. W. O( Y3 ~6 z/ c% k. }; b6 u
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 g4 U& E( O, I+ k, f; _
: \: |% k4 i- ?4 j. m8 l
typedef struct
$ ]! u9 Y" Z; E* }+ m$ s: j# e" v, \
{
* c% U$ P1 Z( X2 i$ C5 A. J& V( N
unsigned int a;
% y' Y# S) }' e3 s7 \* ]; ]7 A% `4 Y
unsigned int b;
) j' U) b: I3 R
unsigned int packet_cout;
, D0 i: h# Y# |* G4 {) _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( B" f: G8 \; F1 F
- Z( `( e# { L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 M1 o. g1 g, G8 g
unsigned int count_copy = 0;
x7 T2 k# B' Z- w2 Q
' ^$ y8 C6 O- n9 v4 E5 K G: ]
" X+ H T: x! k9 u9 f- F5 U2 [
int main()
" ~+ r/ w. U2 O8 V- |# Z
{
5 V; H8 E- k5 `% L* q1 W
pRX_MSG_PROTOCOL pshreRAM = NULL;
) M/ T' @* R& H# o
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 ]" R( o; T" l, g" b" i. X
& ~# f# m5 i7 g$ w
while(1)
0 K' S2 C" c& [- H0 Y
{
; {0 h0 h6 C! u ?6 o4 g/ J
read_MSG_buffer(pshreRAM);
" N5 R* h$ @: D6 L+ O4 |: U8 a1 e
}
, i; O2 @7 z# ~+ }
}
9 f, C5 `! H/ P: \# d
0 | O" }1 q6 o, d8 m+ x& \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 v5 S8 O9 f# s$ m& E9 }) j3 l6 y
{
; ]5 d7 j& b* W* p" s
RX_MSG_PROTOCOL buf;
1 A6 h% U: b. m/ U `: D
2 q6 [8 q0 |$ s
buf.a = pshreRAM->a;
& f9 W# ^2 E4 J' p$ ?
buf.b = pshreRAM->b;
& M, @: E, \ R" K7 Y' B
buf.packet_cout = pshreRAM->packet_cout;
9 E: x0 P" ? X" E6 y* I
; z; {* l5 w) j' v
if(buf.packet_cout != count_copy)
" C0 w! u/ k' T" P
{
; O! Q( Q0 w, q8 B6 K
printf("a is %d\n", buf.a);
8 R6 w3 y0 M: W+ W2 i6 n
printf("b is %d\n", buf.b);
# v$ d) L- x4 q5 ^
printf("count is %d\n", buf.packet_cout);
# @' A1 y0 G: C+ T5 f' \
count_copy = buf.packet_cout;
: B9 ^8 U5 W) }* w3 d2 p
}
2 j' ]0 G+ v3 R/ `, I% i' P
else
. ~0 m: [5 Q0 Z0 S: F/ w
{
" I. m$ |6 n7 e, u* |0 L" ]
printf("No effective message!");
# \$ V8 \1 o' `1 s& B
}
' ^5 H- v( O3 x% C4 _
}
T0 h2 n$ j4 ]* Y& n+ q5 d4 }' x
% y# \: _3 Z% B1 c V% C( i9 }( S6 j
9 d1 e* M) u9 C6 D. I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. ^& B' x) r( o( c
使用下面代码,对内存使用了mmap函数后:
7 n) l& O' l8 |( b- L
#include <stdio.h>
: |+ s4 E) l: o X9 Y9 L
#include <unistd.h>
+ H! Q5 ^; B3 t. G
#include <sys/mman.h>
9 f/ o9 \/ }/ ?( N( ]2 h
#include <sys/types.h>
: T; I4 n9 z$ [/ K+ x. S# ^
#include <fcntl.h>
+ k: M1 a; d! a5 |5 U- }
! h( {8 d, M3 ~, F' \
#define SHAER_RAM_BASE_ADDR (0x80000000)
* Y+ u& P/ [# u% ]. o
#define SHAER_RAM_SIZE (0x20000)
1 T. J3 V( l) g: p" E6 C( T4 z
/ G( N# H3 k0 ?
typedef struct
" _. c/ j# Q* v$ s7 Q; P2 d
{
7 R5 b/ E) n; ^7 v* F/ D# c! i
unsigned int a;
" \. ^$ o1 x8 `" |0 c- u
unsigned int b;
) R: B0 b. u E- b! J/ B: B
unsigned int packet_cout;
1 Z" G0 p9 Q" t" k7 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% \* o# L! r4 ~. T8 f
$ z! U( x7 p, I2 Q, t% d1 o
void read_MSG_buffer(int *baseaddr);
1 V8 P. U) {( y
unsigned int count_copy = 0;
% J$ n" M$ G% s* H9 R* j- o* Z
7 @! B* X, e! o/ X p
int main()
; @# f7 A6 Q" O2 {
{
$ \6 A" s8 o5 f4 h/ N% q
int fd;
' z4 s& H- L, _" R9 Y
int *mem = NULL;
6 x l' U, s+ {
* o& f1 E% ?9 F" S9 P: I
if((fd = open("/dev/mem", O_RDWR)) <0)
& {% r! E8 `* k
{
, I. Q6 H+ [' h0 g# S/ U
perror("open error");
! Y7 L0 K0 S+ o9 \5 M
return -1;
6 D: r, J+ _ O$ @ j
}
4 K- N! t7 Y& \1 }& C# ^
' e F4 N4 G% q. x! w
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: s9 \. d+ f# b
9 F( Y: V, C% V; N: j5 n
while(1)
8 N. x" v) `8 K2 e
{
# V( {: e0 u' C8 n8 v* ]
read_MSG_buffer(mem);
6 V- ^- H' L4 V3 L. R3 t, D. I
}
$ G" O6 ~/ |& q3 S
}
" \, ^* g" V3 K2 S
$ h, L2 C* T$ T
void read_MSG_buffer(int *baseaddr)
u( r' e3 ~: W! f, I9 ` u
{
- R R: g \8 k% G1 D& z
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 I( d9 A8 u, k" H8 r( n! w: h
* d- l% t, n. j2 ]+ F9 {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; y9 t3 A$ z( }2 |
, G% b9 K1 f6 W8 m
if(pshreRAM->packet_cout != count_copy)
! j; v( m" V( `& i2 C: A E% C
{
9 t/ m0 V5 G/ }
printf("a is %d\n", pshreRAM->a);
9 R e6 o; @, K' S3 U6 C) K: W
printf("b is %d\n", pshreRAM->b);
. ^* D5 I6 Y- g
printf("count is %d\n", pshreRAM->packet_cout);
7 v( b: A9 n' h, x8 L$ N: M" l
count_copy = pshreRAM->packet_cout;
. C* s/ M3 v& l3 d7 k% N% l
}
: m5 c2 J8 |/ S/ K
else
3 ^2 h Z% Y( a! Z
{
! p! Z5 C+ Q @* J
printf("No effective message!\n");
# G6 ]0 w2 ]: p/ \+ H9 k( a- d
}
2 S9 n u7 L2 n1 F5 f
}
% W: G6 e2 m W; I" g4 D t
1 P8 H, {( ]( _# B/ f- M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) x) }6 S% } n& _
" D: o! S! q* A! b" D% P
3 ?' n. z/ S$ L) P+ _% C: G7 p
. ]" e% U: v2 R* y
4 g+ u9 f g9 A g
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4