|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % u/ q8 s" S0 c% D& K
+ u, v0 H. H* n w S0 v* bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 V3 G' c& f; K7 Q+ s( J#include <unistd.h>2 `5 y* A" S: C; C! d9 m! G
#include <sys/mman.h>
- z0 x4 }8 s' p#include <sys/types.h>+ D! E% ?) p! A8 k0 e1 t1 [
#include <fcntl.h>& g6 K' ]/ r( Y. [7 q
' k/ C: C8 T. h% b
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 l% R% D1 C9 N: a; b' Z- n4 P* G5 Z" n
typedef struct
( T3 `4 k/ _" X, H{/ I! d+ L* e9 U' r# B8 C0 g
unsigned int a;% o& a) [, Z6 ]- w/ H
unsigned int b;
4 ~, P& a: K; G' J% s unsigned int packet_cout;2 c: b7 H; W& e: @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) S: V+ Q4 o+ B U! ?2 u# b) d' Y5 Q9 Z- ^3 b% T! p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: b9 [8 `5 D1 \
unsigned int count_copy = 0;
. ~: A+ X( i: L6 K* ~2 {' e2 I2 n8 ?3 B* H) ]' O8 ^6 H% R
4 L1 b; g$ } M7 aint main()
2 j" n( W9 H' d/ f; w; s7 F; C: M) V{
( T! E: g/ o' v: V2 f( w8 X7 W pRX_MSG_PROTOCOL pshreRAM = NULL;
' u/ e: }; s$ _$ d; }9 B$ f: l pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! E4 \' i; _; S$ ]( M5 F$ {
& d% c+ C9 l$ e, i) k1 \
while(1)! s4 G5 K$ L' I7 Y4 E9 e. Q4 P
{' Q% ^7 H+ q% ^1 ^9 u/ j: f! _9 A
read_MSG_buffer(pshreRAM);
; P1 o8 ~) R# a* C }
c, P' I2 B: a6 a9 P* T}
; [4 p5 m- W% d6 T: w4 t. o. @4 H5 K" ?( ^" C; M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, v" o F1 E _$ \{
2 j* `; Y4 v" N) g RX_MSG_PROTOCOL buf;
& w: B4 M# H! e0 j
" C0 _* g% ^* ] buf.a = pshreRAM->a;3 R% x2 G9 G7 a% C6 l* L( O- R1 Q
buf.b = pshreRAM->b;
! T3 b7 e3 `9 ?6 H- B- r9 y# f buf.packet_cout = pshreRAM->packet_cout;
% e2 z* g5 |* @$ A
# F; E( f, \3 b4 i" n$ U# T if(buf.packet_cout != count_copy)
1 s# e; N# } d6 d- L0 f, Z) ^, {& f {5 J3 h. s" v( Y
printf("a is %d\n", buf.a);
* A9 V$ k3 h4 A* L9 y printf("b is %d\n", buf.b);7 O6 \; m0 s8 M+ J K5 c) h5 B
printf("count is %d\n", buf.packet_cout);: P) t9 x0 I6 W0 { a4 v
count_copy = buf.packet_cout;
) h4 T- l- _. u, y }
# C9 O [* j+ S7 H6 O7 f- E else. w2 g+ }# u @7 x K5 K$ ^# ^
{
2 @* i9 Y" c" [7 m) h printf("No effective message!");
3 k6 b+ B1 E! u3 t% U# l4 V }& [+ A: p% P2 U0 [% Z( z
}
) D, a8 Y4 p4 o
* R6 ~$ }$ |: j B6 B- Y; U8 h4 s5 ]4 q4 Q! X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" O5 V A8 U) D" E
使用下面代码,对内存使用了mmap函数后:& g/ W/ w3 s% {. w/ }+ I: K. L- B
#include <stdio.h>5 D7 a# i$ R' Y6 d
#include <unistd.h>
) ^4 k& t. m2 Y4 Z#include <sys/mman.h>
% q/ W' |1 z( R; A4 b#include <sys/types.h>' {% V0 U. C2 g4 p
#include <fcntl.h>1 p% ]/ l9 R, a: h( b
\# a6 M. j9 M* u! N#define SHAER_RAM_BASE_ADDR (0x80000000)2 }8 _8 J2 a) d- ^$ L6 n
#define SHAER_RAM_SIZE (0x20000)
( e) U! X: B1 h9 \* j/ a' F9 X. w) D
typedef struct
3 U& I }2 h- ?6 H2 R: H( g{
& j& R* Z' G _2 Q+ o U unsigned int a;
. c. x% H Z0 h+ e unsigned int b;5 i! w! m5 N$ o7 p3 g9 T* }
unsigned int packet_cout;
( L6 O6 _0 {6 d7 ?2 \" C/ j* p, t" p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. c) y0 q2 y/ s
& P. O- v2 n3 [6 s7 H/ V
void read_MSG_buffer(int *baseaddr);
0 ]. w) u% V* G8 g' }1 B; _unsigned int count_copy = 0;
9 Y3 ^5 d" w6 G8 b
7 J# U# e+ R+ l3 l; z9 T; Vint main()
: G$ w8 ?: j2 U$ J3 v5 W{8 w' n, p! N( u3 T$ H' T( z
int fd;- x0 c/ X: D: _% A
int *mem = NULL;% r1 r1 L* C! n+ E, A
0 o/ P0 w9 Q& U3 f2 Z! Y% O% v
if((fd = open("/dev/mem", O_RDWR)) <0) @8 T& m' b) u7 d0 v0 v
{
5 u, z2 B: z/ l% f5 U perror("open error");) _. D8 t1 B2 @1 `, Q$ r5 K
return -1;
: g. A: ?& p t, v& n4 H }% }2 a @- ~% T) u. C
4 _# a. e( ]! ~9 v mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ I3 j& T9 Z4 P" I
5 }, [+ ]1 H8 N, Q6 R: C while(1)4 h7 U) X( X9 N* e
{' _+ P9 v* Y" c
read_MSG_buffer(mem);- B: w6 J j. m/ `* V7 r& I+ A) d
} 3 {- y! [9 L, p9 G9 N
}
+ S; A4 {' q9 D6 r% g2 G
1 V$ S$ Z1 M! k! Zvoid read_MSG_buffer(int *baseaddr)
8 y" [/ h/ E& Y3 C. k8 B4 Y* n{
& V O8 {+ \3 J _2 X% r pRX_MSG_PROTOCOL pshreRAM = NULL;+ s1 C4 b! [% U& _. J
9 ?; V* J- S2 `. \6 i V pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 S( m2 d9 Q9 `! J( c9 A
& H+ c& C; K" { if(pshreRAM->packet_cout != count_copy)" x' @# `5 G+ }) a. J+ S
{. g: S2 T& |' {7 ~
printf("a is %d\n", pshreRAM->a);& z2 T4 }3 L3 L6 {9 \" R
printf("b is %d\n", pshreRAM->b);7 g& Z& N* ~: H# e
printf("count is %d\n", pshreRAM->packet_cout);& W" |8 a$ j# I, {& ?2 o
count_copy = pshreRAM->packet_cout;
1 [6 R6 w( b" U6 y, R( ^ }6 v7 p3 r, i1 T; P4 m6 e2 }
else
) C0 b* n& m: Q& U {
) A9 n- ~5 F0 ]/ i. n. k printf("No effective message!\n");
$ j" w C6 b9 ?) ^ }5 }* {" o$ H% X* c4 K" Q
}
. K" \1 }! d4 h6 r" Z
( D, H j3 J/ a4 m$ x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 C( }5 Q& G/ A
9 f! V* N6 E t8 Q% X: b6 |( l
Z: q* C/ @( ?2 {) ~6 [& ?; Y+ A8 e- P+ x7 ^
- l. m/ W/ D# _3 Q( Q+ T, q |
|