8 N0 R: `6 }4 c: a) w& t" @9 F#define SHAER_RAM_BASE_ADDR (0x80000000) $ X3 A& s9 d9 v6 C
) H- C( w. k1 D6 g$ \) T
typedef struct ! W n$ x& m" L* R% M2 n# S( Z{. h7 M& R, s7 W* a A. C0 x
unsigned int a; o& u, n2 n i" x {; V unsigned int b; ' m" W5 [- E* p0 w, C unsigned int packet_cout; 2 Y% }. R- l3 f q% z! y3 W6 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; # G C- h1 j# X/ j T L% B9 K. f- q8 m. Z$ N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& T" k$ y1 Q9 I6 L" {8 w
unsigned int count_copy = 0;7 C: p5 w/ Q$ s; q/ `* l
+ W. K+ u T1 W% O8 | ~, h
: \9 o& B8 I, J1 k; ^
int main()4 }3 K7 f& \6 e' W) J: i1 h
{" d" G& E9 U, j- e* L5 {& B
pRX_MSG_PROTOCOL pshreRAM = NULL; 9 V$ | j4 |$ P2 g! _( { pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; 5 B0 d0 `# d {0 R; [& i: U. R. |$ A3 v- e9 C! a
while(1) ( z! p9 _$ X7 W {' D3 ^2 N) ]) r: u. c* H# i
read_MSG_buffer(pshreRAM); 1 q# f2 S" r7 B } / l h& T: W2 e; D9 |3 g4 o
}" B+ e6 Z2 {, x5 I
7 R1 _ m7 s; I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ ~: A+ x1 S1 h* W
{ ( ]0 w$ K' t2 R( ]$ x% C s1 a RX_MSG_PROTOCOL buf; 9 z7 }% j; J& B% L& n4 r2 y3 N ' j0 r# o/ |5 K$ v6 L7 m$ {. O
buf.a = pshreRAM->a;6 [; W0 ^( Y( T+ ^" }
buf.b = pshreRAM->b; " ]7 b6 Q/ t* `' ? buf.packet_cout = pshreRAM->packet_cout;3 ~( H/ u; V$ W$ K9 H* N
8 P- D4 q; q- Y8 q+ C8 P4 l
if(buf.packet_cout != count_copy) 3 [9 c' ?$ f- A {8 t8 v" P7 V, c$ p" n
printf("a is %d\n", buf.a);) I; W% Q, ]6 [% A6 j, C
printf("b is %d\n", buf.b);( J2 O0 \* b3 T2 w4 ~4 F1 W
printf("count is %d\n", buf.packet_cout); ; E2 u/ S: [8 m: r9 z5 R6 ]+ O count_copy = buf.packet_cout; - ^: E9 g" u: Q+ |! P) ^9 x/ M1 ? } 2 ]& {6 c5 j* g" i# k1 ^& M else. o! u* {3 ^" [5 m, I
{ ) K8 p3 o, _( m: h4 d" r; T% { printf("No effective message!"); 1 k2 m) G6 K4 i$ r3 p6 f } - |& R1 `! _- y}7 q- k/ E# }0 l4 I7 ~% k
* T# [& F2 p: {" x5 v* r* q' u
, W/ O* D) R/ z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 ! c5 F7 I! g% @4 [使用下面代码,对内存使用了mmap函数后:) v: c% K$ y Q
#include <stdio.h> E9 r( o* n7 c/ l7 i
#include <unistd.h> 9 v G# z/ O. G. f; W+ k#include <sys/mman.h>' l( m" e4 Q- d: q' ]# M
#include <sys/types.h> ^- ?8 y# T) [$ f
#include <fcntl.h> ) x n' C/ J& f& y* ] + c: n0 \) O$ g, [8 {7 w% O#define SHAER_RAM_BASE_ADDR (0x80000000)3 ~6 s& }' S% c* ^1 o8 B
#define SHAER_RAM_SIZE (0x20000) 9 P6 I% Z* t* ]* a2 s
2 o. C/ a+ F4 Q; H# P9 ftypedef struct ; h, C! K1 T3 V{ ! w6 ~/ s0 A. i6 y) E) Z- J. q unsigned int a; 7 @/ y. r6 j, b9 W3 K unsigned int b; 7 R: w+ W- @% Z1 p unsigned int packet_cout; $ e2 D5 U+ U. J9 E5 U2 M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ S+ [! Y2 n/ l( o' H" m7 g
) j; `, H, {' }. H2 dvoid read_MSG_buffer(int *baseaddr); ) M( z+ L# c! q! p W& qunsigned int count_copy = 0; " L `' R _! J3 E j% a 9 P$ i' i7 m9 sint main()% Z3 v0 E# u" T$ {
{ 7 o9 `- D0 s) h4 J5 ?9 B I int fd; ( |6 o3 u# z% l3 @9 Z int *mem = NULL; 5 z) @: W/ X6 H8 W" L) w: M9 m9 G" B/ p' Y% l
if((fd = open("/dev/mem", O_RDWR)) <0)# M# f7 n- T6 I% I; P R
{7 I! M; a+ E# b3 K9 W1 K/ C
perror("open error");# G+ R$ V( @& c. w& I! K
return -1;4 F }, d$ ? A! T
} 6 r& o0 A, t8 u 8 m- d, D- y$ `0 }/ h) s
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); ' G8 J* V/ ^0 t, [ 2 i" |/ e5 v$ V! Z1 p while(1)" r" C6 M% z* V% @- V
{ - o+ |4 i. u/ S# M: X- C+ V read_MSG_buffer(mem);1 N; s# [0 Q: a% U2 F! R5 A0 d U8 X; I
} & R# A3 I3 S o4 Z
} s+ _8 m9 F% S c3 J) I$ |- j2 \ 9 Z! v: B# H. u% R: A5 c, Y/ `void read_MSG_buffer(int *baseaddr)0 O7 ?7 P3 B3 b! K/ B' g6 I
{ 5 @9 \7 G& M1 ?9 x pRX_MSG_PROTOCOL pshreRAM = NULL; : M! e! O; m/ ^: p, P* B* h" s0 O" W; W7 E9 U' f' A
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; * ^6 Q# m) r' X- ^/ e8 H6 j, W% L& m' i' n& y
if(pshreRAM->packet_cout != count_copy) 6 Z. ^4 l( c- G { 3 _/ t: }2 k$ `2 r printf("a is %d\n", pshreRAM->a); * P, J. w: a% x0 P$ _ printf("b is %d\n", pshreRAM->b); h) T2 R& C! C9 Z0 ]; \, d
printf("count is %d\n", pshreRAM->packet_cout);4 x' F7 [# [: \8 u; I
count_copy = pshreRAM->packet_cout; 1 P! N* l$ [" @' t/ J0 Y } 3 P3 V& M0 ] b0 K" | else " Q- ^6 E6 ?; a& h( B, x# p {6 e% z! U, `2 Z4 z! T! t
printf("No effective message!\n"); : |2 i) B! q; {. J } / s% u: J2 q0 F& w6 |} 7 U' f- g+ t/ S! A; P9 ^) @9 P& h" j. j6 [3 q) v( C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 B8 W5 t7 y$ H$ R k7 Q! N5 X2 _
Z% S( s: u& |: I" E/ V* i