2 C0 _9 ]; T: p* I: q3 eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 b' D; t/ O$ Z7 }# n: z! | N
#include <unistd.h> ! x! }, O8 y6 m6 Q8 Q: a; J#include <sys/mman.h>5 m. u, h3 u p4 @9 c
#include <sys/types.h>: c! R6 W* W: F( J5 J5 I* S/ b
#include <fcntl.h>; d+ F0 m7 M+ J- l. f, W
& H& q) L& j! h0 \( f+ X( |#define SHAER_RAM_BASE_ADDR (0x80000000) " ^: s2 x. e" V 7 d/ y3 W) ?+ c% {6 Z5 Ltypedef struct* J- F+ Z; Z1 w5 S+ ]
{ # L4 I1 q3 A [ g( ^2 l unsigned int a; 1 m" w+ ?3 z/ b8 J' U* ~% o8 }4 C unsigned int b; 3 g5 G. l# o( T {. ^1 M+ l unsigned int packet_cout;. Y0 X5 J6 [8 Z/ u/ |9 } n9 H+ l* l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 F% a U1 M& q8 f
4 V# g2 t4 ^6 ^4 }3 B8 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); / u- V* q& ^+ c* Sunsigned int count_copy = 0; ; p" e h7 V* ?7 Q! ` ; Y8 W7 S" {7 j0 q) t0 D' ]( U+ J7 t# d, _2 s0 X& H
int main() * x l2 i# q0 {8 F( ]{ ( P0 c9 j) _: G9 m. X pRX_MSG_PROTOCOL pshreRAM = NULL; * o4 i- f) r2 I6 J) h$ }% C3 @ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; 3 Z( t1 ?( q' _' {4 v+ B. @% J6 n, }$ x% d% y0 F
while(1)6 D, d) D9 r$ l ]
{ / Q9 ?3 X% \! x. R6 S+ Y- }( b read_MSG_buffer(pshreRAM); 3 ]5 a7 f2 ?; t" u1 ^ } / Y6 y- W5 a$ ^. \ M} % X/ b1 W5 t" Z ^0 p 4 y1 M) B2 B9 Y/ `# \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ `" o9 m( ]7 o/ }% q
{ ! ^+ l, ?& { p RX_MSG_PROTOCOL buf; ; n5 a* s) v4 E' Q 4 W) K. s9 U" D, [; w+ Z. ?, | buf.a = pshreRAM->a;; S$ T$ v1 X3 ]
buf.b = pshreRAM->b;9 ?6 g' Z2 }2 o$ D
buf.packet_cout = pshreRAM->packet_cout; $ ?; W; B+ s, S $ r7 u# X; n6 A9 x8 _: d. @ if(buf.packet_cout != count_copy)5 @( X/ x Q/ n% u5 |& m
{* J2 g: D7 t( y' f
printf("a is %d\n", buf.a);0 ~' b0 H3 v$ _- Z! E0 b2 m. {0 _7 n
printf("b is %d\n", buf.b);7 c$ ] G5 a9 h. w- K( o( A
printf("count is %d\n", buf.packet_cout);4 `* H1 `: o L; c% S K
count_copy = buf.packet_cout;6 [- n( Z: I( \
} 4 m( D0 l$ ~, `/ m |& ^" o- {: x- a else 1 N# h- n5 B% b( W$ |; C. u { 5 ~) V: {( L9 K2 f0 \: ^0 X printf("No effective message!"); 3 Y: Q& Z) D+ R } 1 @1 I$ K; m9 F F. G}/ F P" ?2 r8 H1 m: _7 l
! q) N3 K. p8 c0 B5 O. I : X( N& }. y# J3 ~" s. u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: D; q3 k4 m( U! [+ f
使用下面代码,对内存使用了mmap函数后: / u( ]1 ~3 p7 K0 e7 Z6 ~#include <stdio.h>! o I6 \0 s% W9 l+ f" M5 }: \) m
#include <unistd.h>" I3 g5 o3 u* @+ a% J
#include <sys/mman.h>; ~- ]0 V5 Z& P( A, n |* `4 u
#include <sys/types.h> ! i4 h; W( Z/ m#include <fcntl.h> * ]: R F& y8 Q0 Z' J" ~5 m% r* i8 ?6 O9 L4 b
#define SHAER_RAM_BASE_ADDR (0x80000000) 1 ?6 v v3 X$ R5 ~0 X; i* |#define SHAER_RAM_SIZE (0x20000) / y3 F' q* C( A. p+ ^" z$ U, Y9 `
- @5 [* K6 g3 t$ G
typedef struct , r- P7 e: i2 Z( h0 z' V{. Q6 w* b7 ? ^7 [
unsigned int a; ; f ~ R, @" W/ W# R" H+ [ unsigned int b; . e& ~8 v/ U( C7 q) k1 W unsigned int packet_cout; 7 ?* x" P! s: I2 j, i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- V5 P( f2 M& Q; _% f' x
( |) \$ p9 E7 N& q' P
void read_MSG_buffer(int *baseaddr);% V" _9 I$ z8 P! Z. I( w' N$ w
unsigned int count_copy = 0; . y, L ~1 b4 n% x 5 O! T" `, x6 N" \$ uint main()7 o2 `3 F7 C O: l% Z1 t0 y
{ d T+ w3 j- W* O& i) Q
int fd;/ W; R% _) \( J1 J
int *mem = NULL; 7 o8 B, w7 k' G5 C& w+ P& i6 q* Y+ J+ g, S" [8 L. ?- c
if((fd = open("/dev/mem", O_RDWR)) <0)1 |# s i2 Z9 {7 [+ B
{ % i" J: V8 z$ H e" N perror("open error");/ G0 T; R& A3 Z1 c
return -1;6 v+ t* g) Q+ y+ N2 }
} 3 k& Z/ C4 G: z3 N; l8 `* U" U 9 k3 Q4 L- P. d6 G+ s" c mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 2 J6 f" L3 F! f5 s( X/ @. i% B5 | 0 f0 j8 p# ^6 Y7 H5 D% |% u! G% \; R while(1) $ K: P" g7 w: q0 \: H6 w- h6 i { 5 N# s# f7 P4 I, u% F read_MSG_buffer(mem); , L. o: { q7 s) x. { } ( q8 n+ q' ]1 m: @3 @2 ^6 e( A
} $ q) D: R! J' P7 p! I0 l 8 m0 e5 a' u8 l# t% a+ D: _void read_MSG_buffer(int *baseaddr)# Z/ S; v W! o+ F1 U) t
{# u' D' i' i: @% Y( k6 D
pRX_MSG_PROTOCOL pshreRAM = NULL;# j$ c9 w4 ~ c+ B0 J
+ B* h" q4 h& ~" n" t4 ^/ W pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 B7 g& g0 M, s* n
. U/ c/ x/ f( S* F% \$ y
if(pshreRAM->packet_cout != count_copy)3 E [+ |5 H5 I, Y+ D9 @
{ & x8 d' }' l9 D" \* q printf("a is %d\n", pshreRAM->a); : s2 w: Q1 {7 q. [! A printf("b is %d\n", pshreRAM->b); $ Y$ z' A- H" ?4 `6 L printf("count is %d\n", pshreRAM->packet_cout);! a7 d/ l) @# i; X$ U& e) v
count_copy = pshreRAM->packet_cout; ' o: J6 u. o+ ]8 u; ^ }1 T( Z4 r& d/ B' D1 X7 `- \! j( o
else W1 R3 b' n, Q) h1 o2 }" p' t6 \1 A
{& ]+ ^$ n3 ?3 v) d
printf("No effective message!\n"); % t# l& N0 C& e @2 ~- e" i0 ^ }; H z7 {( Q, d7 z: ~% l
}; a0 r% }- N% y d- L3 `1 o
B6 m6 K3 m. a) Y0 L; j( N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& L% k6 E. D4 G
- x3 e( `) Q. q7 K' v
& {. _) P' o$ L* I/ H2 U & ~ u. H$ T7 x J7 ^, T# y ; s6 P* }1 \0 G* [0 u5 S' g