|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) l3 O, H- V8 _" D$ K
/ ]3 M8 N: P6 {& G$ s6 d: b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 A* M7 g6 {. n#include <unistd.h>
' e5 H6 z8 e" D3 D8 h#include <sys/mman.h>9 c/ m8 t2 }( j! n% n
#include <sys/types.h>, A% ^7 o4 T- _% P* }% D* Z
#include <fcntl.h>0 j1 h' e+ }. B1 p
. M! }+ j! Y0 y$ r1 X
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 e& ^# m, v" z7 C6 W9 D6 e; ]* A$ v
typedef struct. r- O9 [* Z: ]" M
{
; I: D( N% n- J1 q( l unsigned int a;
6 q0 j4 } _6 C* r& V& K: G unsigned int b;
! Z- W! y+ B. A( A unsigned int packet_cout;4 W. L9 X5 \( q& ~! B* A: g2 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( @9 u" v5 H5 ?, J8 U
- K) R% ?( f/ W4 Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% O' u3 j4 |: C! P7 {% X
unsigned int count_copy = 0;+ `+ d2 ?! ^3 P% g
$ q# ]3 c/ ]- m6 U6 ~/ V
' Z* w; i' @# x6 h/ Cint main()* d! i. E6 u6 J, g. L
{
4 l% l! c9 e) C$ e; _. x pRX_MSG_PROTOCOL pshreRAM = NULL;+ J( A+ H! L. n, L/ d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( U# b' F" k/ P
( a4 r1 h, D s: k while(1)
. T) y$ z& l3 @# u7 o {$ M U9 X9 R% V) E
read_MSG_buffer(pshreRAM);: v5 _ p& B( p4 Z
} - D! ?- B+ c$ ~2 A3 t1 x: B0 ?
}
* G! p9 D# k7 Q4 @" P$ m! k- U
$ t: b* h; P. xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. F9 x& S4 ]3 Z8 `0 a. F{9 _1 p2 ]2 r E8 q+ u2 ]) w/ q
RX_MSG_PROTOCOL buf;( \% @0 p' n- r6 R& `! F m
* g$ f. n4 i. L4 o' Z2 Q buf.a = pshreRAM->a;
/ `$ O1 A. [4 _2 M; m- O buf.b = pshreRAM->b;# M* _+ T7 Y0 D6 ~- q2 j( @. |
buf.packet_cout = pshreRAM->packet_cout;9 Q$ Y* @! X+ [' q& `3 f8 B; B
$ M5 [0 E5 p+ l1 l if(buf.packet_cout != count_copy)
3 G2 g+ ], ?3 D! t9 Q {
$ G3 Q }/ o/ Q1 K) X* h8 p3 G/ ?# o% F printf("a is %d\n", buf.a);1 n( @( x% y5 j
printf("b is %d\n", buf.b);
7 U. V1 E( F: B- i* S/ k& \9 V/ c printf("count is %d\n", buf.packet_cout);! w7 l* d) v* j: l2 e5 `& Y
count_copy = buf.packet_cout;6 R: g; n# ^2 L0 k/ i7 N
}
4 K; p& A/ N5 f; q' w& Q else# i0 \- `* T9 W0 @2 z5 X/ d# Y ?
{8 j3 u+ C; U2 j: x& Q7 W; ^9 I
printf("No effective message!");
! e/ J) q4 l4 l/ D5 V: { }
1 L, r0 I/ c2 r- ~- l$ U" M2 T}5 y5 f L6 B- I
/ g: ~* \8 o7 E5 A& X0 H
8 V- E( Q0 |2 N- o! O# _, K9 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: V$ {0 k! h; B- l0 v' u) B" i
使用下面代码,对内存使用了mmap函数后:
# a$ I* w7 m6 M#include <stdio.h>6 ?! H3 K5 A* d: a8 [6 m
#include <unistd.h>
. Y* h6 O5 e% ^0 ^& T7 B#include <sys/mman.h>
% y1 w; Z' W. n, d$ W3 }#include <sys/types.h>; k5 K; [, z& C) C- a! p
#include <fcntl.h>2 |& A4 T+ B$ H5 m
# b! {) H" M% X1 t7 I
#define SHAER_RAM_BASE_ADDR (0x80000000) N. X; f+ u4 t4 l1 E. `7 U
#define SHAER_RAM_SIZE (0x20000) 1 A7 u0 I7 h/ u! C8 U N/ K8 ^; f
$ M9 n: V: g* \2 W" }typedef struct
/ E6 A! x+ E7 h9 l; a4 Y; Y* Z{
8 K3 J5 j5 t( P( c( o( X) } unsigned int a;# h# @7 g- G0 \3 J* g( E A1 ~/ I
unsigned int b;
( S: d9 _& B, w) I4 {* @ unsigned int packet_cout;3 M! `, J: t) G+ f% b4 O% |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ x. D/ A; T$ s7 d1 [+ f
1 c E8 e$ T% K5 {, _ w* Z3 evoid read_MSG_buffer(int *baseaddr);& x2 a% p; m2 t8 k9 t6 W5 B
unsigned int count_copy = 0;: h J. _$ w3 U: O
! L [0 G" w- t0 F
int main()) l0 z! l( b) r. C+ q: L
{
$ a! ]- [" k- u int fd;
. l( V* E1 ^: Y! M; q int *mem = NULL;
% Z" N# g" d% N( M9 V
/ Y4 `6 }$ ^$ c9 o* Q if((fd = open("/dev/mem", O_RDWR)) <0): h3 @3 B# M e
{0 v5 B/ Y. A2 Z; m6 w! ^4 O
perror("open error");6 k5 v' L# }; d- b0 i
return -1;5 T' }3 R9 w8 ]1 j
}, G. Z1 n {; O* N# F8 J, J
- {+ \* g& y( \4 k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( x/ I. P7 w( |# ?8 R ?
2 ~8 g2 J' R# l while(1)* Y0 R: M% P+ i' ^$ S
{
1 F/ L1 m" N2 v6 P read_MSG_buffer(mem);
0 V! L" h7 F9 I2 v/ F- }* O3 N; K2 a }
' M& u- V6 ?* n4 W2 r8 `: r3 N( ~}/ @6 `& o7 C: T. ^. K! Q
) u7 b2 H3 V/ F; p- R- R: a# u
void read_MSG_buffer(int *baseaddr), @! q% u: ]; N" E) t* ^
{
/ S9 R- B1 P4 l. N pRX_MSG_PROTOCOL pshreRAM = NULL;/ u& e- j8 H' t; V
+ | p) ?0 I- v* ]8 X pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- n7 L, w' m, Z/ B1 I1 Z7 i& S/ y8 s9 O7 \% U& m0 P$ C
if(pshreRAM->packet_cout != count_copy)
" k/ ]% @, b5 Z' e {3 N) s; s- Z- z+ g+ C. c5 x
printf("a is %d\n", pshreRAM->a);
- U7 L( e3 C# h: y7 T printf("b is %d\n", pshreRAM->b);3 @8 O. ^5 Z8 N2 T/ V
printf("count is %d\n", pshreRAM->packet_cout);( l0 _7 J2 m0 k; w
count_copy = pshreRAM->packet_cout;5 ?; b G1 ]0 s9 [0 N* }- M
}
+ _5 q9 I, f! G( P2 o; {% S else
+ P! j$ t$ a; }6 _% S) o {" O. r: r5 H; e3 v6 m
printf("No effective message!\n");
1 `2 r0 f: _5 G* |$ C4 S0 U! S }
/ l- c/ Q: [" H- N+ }, c}6 @2 ~+ Z( T0 o4 R4 [5 a
2 r1 z& a6 {/ i8 a" @2 Z* R* F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( B5 z0 E8 Z, r+ |' ~, X3 }" d
1 a9 J' r. E; L$ |7 G- A/ n
& O( f. f! z+ h, K! F6 J
3 @# E) b8 y- L( ?5 I! w) I2 N6 b7 C/ R
|
|