|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 M0 H' T2 x9 [
$ Z- J7 H: u) [0 ]$ n# ~OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 k$ e/ P0 q# G& P
#include <unistd.h>" Z* P) C) y" R1 R
#include <sys/mman.h>
' }% _& R+ [3 v0 B4 R#include <sys/types.h>! l1 P- D M/ M7 j- Y: E7 k) W
#include <fcntl.h>
7 c; Z- R4 l; a- y& p: i* c1 X# R
% Q1 s+ _7 w/ L( X! k" x: j#define SHAER_RAM_BASE_ADDR (0x80000000) / V& d3 x( U: L+ ?! z8 h4 r
. [# c+ G2 A. |8 P
typedef struct+ n1 M4 ?) F, x2 }" U9 ~2 K
{& Z2 o. `0 J2 X/ J& M4 M2 Y& a! X
unsigned int a;" L% N9 V0 V" X! }2 x5 ^! I0 x
unsigned int b;
' U) f3 i- }7 l- D& i8 n unsigned int packet_cout;
$ ]2 |# B+ U7 ~$ D$ p4 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! ?, V0 k6 L1 H( U! }. i7 R
8 r" k+ f, ~! N/ W3 j8 D. yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* P d9 {+ ^4 @2 J$ M' Q3 ?
unsigned int count_copy = 0;
$ a7 y3 ]# S7 l. x: Y g7 D
& [( L+ Z8 N" c7 G. @5 ?5 x" p& G! @. A% Z
int main()% n* }/ i+ v. g6 I6 f6 V$ d, C
{# @* }# O3 o/ @( u
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 Y, p' ~# z) `: B" o) R# ]+ l pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% U% Q. }/ ?% V9 E: i6 E2 w
7 n5 i4 n1 B% F* _9 g while(1)
) D3 p. h1 P- f {
+ q' }4 v6 Q$ C7 z. G read_MSG_buffer(pshreRAM);
, `4 ? ?0 Q8 Q) ] }
' p' r# w5 D: R% X5 x}
( ^' h$ Z$ E, G* `+ F# X& h. |4 O
3 }7 g+ g+ T* \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 @( y9 s/ W* k* h0 S+ d: M9 o3 W
{
. M8 f- k4 e# @; V- F RX_MSG_PROTOCOL buf;0 A- K4 T: E9 q/ ~
7 [! H5 R T3 y; A buf.a = pshreRAM->a;
9 A& _* H, v7 u buf.b = pshreRAM->b;- ~9 b: E, M {$ F2 H
buf.packet_cout = pshreRAM->packet_cout;
, j$ ?2 S3 D, p
( w" }5 x+ W5 C- i/ @0 V5 [ if(buf.packet_cout != count_copy): A# f/ R G8 s( r9 i
{/ u# i. l9 K1 M5 {0 Y7 N3 [' b4 A
printf("a is %d\n", buf.a);
U1 V* ]" t$ Z ~ printf("b is %d\n", buf.b);
# b* `, V0 x- e( f J7 k printf("count is %d\n", buf.packet_cout);
9 U ^3 z% o$ x/ n& G count_copy = buf.packet_cout;. k$ N: V1 ?$ Z% Q4 ^. A7 J( k3 k- K
}8 G$ n- U2 M* j
else
$ L( u3 F# w7 p6 U" Q {
1 ^! m) t4 ^+ y. L! C" }& I$ c printf("No effective message!");& ?4 }2 S E% M/ E
}0 Z" h0 u8 I- B2 f+ }, t/ m5 m/ t5 S
}
" T9 k( t) Q; |" D0 M* R; e
3 D& E! O4 H" Q+ V! K# y& r4 Y r q. ?6 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ T# G/ \$ }; z3 {" r0 b; ~7 ~使用下面代码,对内存使用了mmap函数后:
& }+ G+ P0 v( u* T#include <stdio.h>
3 j c; c. g2 t% @#include <unistd.h>
o9 z/ m! A! q#include <sys/mman.h>2 [9 a R6 ?' d5 N
#include <sys/types.h>
/ I3 m/ {* E' q }% e9 ?2 M( }#include <fcntl.h>
, R! M9 d% @5 B& S. H
# K; W* \; K! E5 ]# Z) z& x#define SHAER_RAM_BASE_ADDR (0x80000000)
0 m/ H' B U# B g, J#define SHAER_RAM_SIZE (0x20000) 0 ~. m2 T# F6 U
' V3 E2 {6 f. m2 h' W% q7 N. N- ptypedef struct K$ S8 L+ q0 W/ y& O" A
{
/ }0 _$ M- l3 j$ m1 { T1 E, i unsigned int a;& a. \: o% { J' X' j/ o
unsigned int b;
- M) ?0 n* s+ N6 H7 S: ~8 ` unsigned int packet_cout;
5 c6 `6 f, S' M1 S6 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 L; B5 b" u( J% M" h4 G4 b1 m7 P# Z- G6 L/ H6 }- P2 S
void read_MSG_buffer(int *baseaddr);
( V" f+ w5 e( R; p" `unsigned int count_copy = 0;; Y- h, l; n! K( b% C& |7 a: S
" [+ V3 M2 V# {) jint main()
- J, H; n1 G7 V$ l6 N{3 o/ c8 J$ {# S! ?
int fd;
" p) }$ Q0 H" m) S! H" G) M7 h3 w+ X8 k int *mem = NULL;
: Y+ h7 y; |. X( z3 \1 K* D9 ^
if((fd = open("/dev/mem", O_RDWR)) <0)
. I; o) R. i- K9 e' k8 l. T {8 m: y8 l( F' S, Z: e$ V5 t7 b
perror("open error");
6 L, q* [1 }% B5 E1 p7 L: m# `) `0 p return -1;& q8 U* F6 q4 y
}
; u" l+ i6 T5 J m$ t$ V# b8 W% w
$ M: f5 p% G8 A6 L8 q mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! j( E. u$ z7 w: h& a* J4 Y4 d5 z5 p
# l& `9 a1 n$ F. ~* u/ a while(1)
3 ?7 y5 a6 e+ ]5 S5 T {, [' G+ g' d7 u1 c% V
read_MSG_buffer(mem);0 F# M0 \: g2 M
}
5 N3 `2 L6 d- {9 j/ C% m- z% O3 j5 p}7 X7 j6 A/ d0 F% a
3 `9 J" L' X zvoid read_MSG_buffer(int *baseaddr)
v3 F5 w) P4 ~' R4 h{. H: M8 T2 x5 E+ F
pRX_MSG_PROTOCOL pshreRAM = NULL;" e6 z) [; m. n3 Z
( K+ i3 J8 r8 R" q! v( Q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% ^- a( V. J* `) O# X2 {8 O" i/ v( c W0 N# v5 P) ~" u
if(pshreRAM->packet_cout != count_copy)+ M5 ^$ Y- S+ A, p
{
5 S B( d6 h1 _6 Z {6 Z printf("a is %d\n", pshreRAM->a);
% E) L- L. a2 W( e1 _ V* c printf("b is %d\n", pshreRAM->b);
* o; w! h0 J- \ printf("count is %d\n", pshreRAM->packet_cout);1 P6 @& ]9 Z; u$ q( K
count_copy = pshreRAM->packet_cout;
7 @) c& [' A( T( E, U }- |2 L: A5 x6 g) t/ j- s9 ^! F
else5 l. t4 Y# H: @" V4 O: m" u( L* c% |4 \/ T
{
! l5 N. g4 t# z+ Q% { printf("No effective message!\n");. G& @4 u2 d* A8 b) E% m" S3 c, k: z% i
}
/ H& G) H! L, u2 P7 x$ \}
1 V ?: s. ^" }
) P2 B- K' M$ R- k+ r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 L$ v9 u% D/ ^3 m4 s
/ e) x* [: B& m1 F3 x& v5 {: M. n. k$ c+ N+ q9 E. L& _
% G1 _' O0 O1 ] `5 ]
7 V6 u2 [8 {) k4 K, C# A+ ^
|
|