|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * ]" e& D3 \2 c
|" H7 X* L# A; z- Q& POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! y& l" z* C6 {0 M4 p+ |; `#include <unistd.h>; |0 |0 }+ |5 C- ^1 r
#include <sys/mman.h>( T! b' u* V+ X! }* Y8 B% J
#include <sys/types.h>
$ J6 m' D; ^- s u+ v#include <fcntl.h>
1 X( J7 k: ?" N4 V5 W6 W+ d
4 l% E+ Q8 }2 Y- s7 V G#define SHAER_RAM_BASE_ADDR (0x80000000) # I% h Y: i) M( k; J
* Y$ k' [) L( r! gtypedef struct8 K! \( Q1 E0 W: Z
{
. b7 Y* G3 t: ]3 ^& R unsigned int a;
' R. ]4 W V) c1 Y) t0 @3 b unsigned int b;+ |& T. ?" P% E/ g( A
unsigned int packet_cout;9 Y+ `0 ~) R; u: m! r9 c3 z* w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 r3 q. h+ x4 t7 \% ]- \: X6 c6 Q
$ l5 ^5 u- L2 s1 Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. H' E9 R, o8 N" ~unsigned int count_copy = 0;9 I+ R/ m! Y, c
* ]& K) a% R8 t3 ?5 N, ~. s
1 h& y6 G+ w6 R; p4 m% {1 _int main()
3 Y& R# n$ N; E9 A f0 B{6 P$ ]- Q2 l" Q" V
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 n4 Q/ C" _" C+ n+ L pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 m; S, `9 X1 D3 c7 s7 }# |% N3 k; f; @( P( p" K8 G6 R
while(1)
) c: N$ W! F- a8 l {
0 J3 S7 ]) R/ K; a0 H. C( E/ | read_MSG_buffer(pshreRAM);: v; T6 J1 M; b( S5 @
}
7 P" k ^) x* k- x6 T}
: F0 B2 i$ h1 i4 r, j; t* V+ t8 }: P" g5 H* m- a) U7 e7 k' B- N0 Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 f# B) c7 h6 @
{
: F; |! B, S1 @% M# Z RX_MSG_PROTOCOL buf;# r0 U( H) h. c' L; D% K
. }) g0 H) P2 z2 P buf.a = pshreRAM->a;
1 B6 \ N9 k1 S( ~ buf.b = pshreRAM->b;$ z2 Y! p% _2 W
buf.packet_cout = pshreRAM->packet_cout;5 y. R- K) C' t9 p
5 ]: e! ?5 i" \, l: t if(buf.packet_cout != count_copy)1 U! c# q5 w! B+ u* G* H2 n
{' t, Q+ {1 T- O/ G9 D L2 l7 W0 B
printf("a is %d\n", buf.a); |+ \- G6 l9 k2 C) T
printf("b is %d\n", buf.b);, p n; g/ @ ?' v
printf("count is %d\n", buf.packet_cout);
- O0 g" I9 A/ L u7 C: ^: E count_copy = buf.packet_cout;( t" h# O2 y% r
}, u& Z: U- B- W/ ? t( x- l
else
! O, z. z, v% j; T {" k5 L0 M6 r. r! u( x
printf("No effective message!");
0 g% l7 L6 ~2 d M4 e }4 ^- Z3 ]- V+ s0 n5 T' H& c
}
% U+ N* w$ X3 n7 M9 y2 V' @
; R4 q9 S2 U& }2 o' t6 _2 ]* V4 Y$ h0 c, |8 p4 H1 [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ c) D" c2 l: K- F
使用下面代码,对内存使用了mmap函数后: j) G- u7 r9 D! y6 D7 Q
#include <stdio.h>
$ N* \4 ?1 s6 T. U$ K8 Y2 r# n! W#include <unistd.h>( w3 {) u' x, v1 I. T
#include <sys/mman.h>3 m/ a7 I' U$ W/ J
#include <sys/types.h>
6 o$ k% T# K5 d7 u/ e8 S+ `, x#include <fcntl.h>
* N% d8 Y, A9 u# Q; A
! { x1 _8 r' o#define SHAER_RAM_BASE_ADDR (0x80000000)! f* l0 E. m% ]1 d2 D. g
#define SHAER_RAM_SIZE (0x20000) & \8 t7 [- j3 O
& p$ I; V/ X( }3 o; P) Q6 Y
typedef struct
$ ~' I5 c: |% _3 ^' Z{1 P. U; {& F- H& d' d5 q1 f* N
unsigned int a;1 V" e% g6 v( j0 @0 [7 |4 ^
unsigned int b;
0 M. r/ O T' |( G, R6 S unsigned int packet_cout;) P# v" M+ g) ~. p1 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; V1 ~& K; L: z" l" U5 l9 C) P3 S
8 i/ O6 [1 C, q" _7 wvoid read_MSG_buffer(int *baseaddr);
" N( e) G. n7 sunsigned int count_copy = 0;' g0 Y& G. O* x
( e8 H; z& o1 u& i4 u. pint main()
' G0 Q: N _( B, T5 g$ [* T{
2 c1 i! X5 x/ w6 A2 y) X int fd;. x2 s: [+ R' o! ^" `3 @- _
int *mem = NULL;
# a. {! S! a$ s# r( _
: }$ m1 V3 [# Y! w8 ] if((fd = open("/dev/mem", O_RDWR)) <0)5 E1 B" u [+ W8 @, B5 s' ?2 J
{1 T! |1 R# g. a9 f
perror("open error");& k+ o, `- ]6 Q7 q/ ^' |
return -1;7 [$ j$ [0 r$ h7 \1 M9 U( x
}
4 \; n4 x* o; N) W
) Z: `2 t( m" T: `$ B+ O mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 G1 a+ [* c0 r3 y- `0 U
3 l. \, F1 k4 Z while(1)
5 p6 s( R, b2 W {) b2 S }& F) {5 q5 C8 f' f
read_MSG_buffer(mem);
" I. f( W$ x3 V7 ~! p# | }
I' [: U! N/ s/ \* v/ \% I}6 V! c. J+ e3 _ p
6 Z& N2 d; }1 D. V. T& e8 `
void read_MSG_buffer(int *baseaddr)% C3 R8 T( R w f
{
2 d" V; g5 ~8 J% p: l pRX_MSG_PROTOCOL pshreRAM = NULL;0 I; P- B8 Q N
+ Q @2 A: | u, ~2 j& ~! o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, A. z" Z1 I- g
8 h3 ]0 P* _/ _; G. F if(pshreRAM->packet_cout != count_copy)
8 Q+ Q+ K1 C8 B3 v4 [ C {. f7 j2 E0 ?: ?# X4 S1 {2 M
printf("a is %d\n", pshreRAM->a);
W8 P% i3 p- g+ V printf("b is %d\n", pshreRAM->b);
# U% I* A* |" X {6 K& D printf("count is %d\n", pshreRAM->packet_cout);
9 ^5 p$ `- K: Y3 w count_copy = pshreRAM->packet_cout;
+ H% _3 z7 c, |$ \: v) T }9 v2 R) P, N+ z$ o
else
3 i3 n( M' {3 i! I4 \ {
: I" N# \2 }0 |! a printf("No effective message!\n"); L. d$ W0 e8 X9 ^: M# N
}
+ v0 V8 j W" I9 g' L}8 B0 {% F1 D3 d7 F( S
4 e x5 E# s( A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 X0 K6 g9 n% \
& e& m+ m- Y" G% n+ b! U( S% B0 Z0 K. \. A$ Q5 o1 R
9 _) t e% o9 G+ b+ ~
6 y% T2 W- b) E3 @6 Y# D; j
|
|