- N" G7 R" Y; ~#define SHAER_RAM_BASE_ADDR (0x80000000) , w0 y! D L$ T% F* W+ T$ @( z( B1 N0 ^5 r( f
typedef struct 3 T& n# r% T! l! E- H N{ + ?* ?7 ` H; G- k& A7 H2 z% y. p unsigned int a; / u7 _9 g- a1 Z; D* Z8 _/ c8 ^ unsigned int b;$ Y/ i: c! ^; L [# \
unsigned int packet_cout; " W' \% v4 i7 ^- |# A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; % r4 q* p# Y8 d) e, F4 D$ p& c+ C* I) c8 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 J2 `/ S, O) V6 @& b! C
unsigned int count_copy = 0; " K1 c; K. t J0 O- ?8 k3 U% s" p$ G
+ q) H1 W q: m8 f* Q9 kint main() 1 [9 U0 c. y' P( u: g5 I9 d! @{ 8 T8 K2 }4 z' n) o V pRX_MSG_PROTOCOL pshreRAM = NULL; # o0 t0 Z! | l* P3 L' [+ L" \* A pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; 1 Q( A: l8 v* q6 m . S, v3 b% A: g# y, W* s' R5 r while(1) y) V. E, S: i, K4 r" r @
{7 n6 B: W2 I- w" Q9 `# H+ p" h1 s& `8 A# ?
read_MSG_buffer(pshreRAM); # h8 b; J; W# S2 ] } 4 s' w+ g3 H( B# B4 f! z b
}( G& r$ N9 |! X1 O @$ H- U
X* f: u0 g& C7 T' {5 p* ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ _& ?; l4 x0 v; X) j
{. h2 y/ m5 q% X
RX_MSG_PROTOCOL buf;9 k/ f' J d3 S
7 w7 T( M, _0 @
buf.a = pshreRAM->a; 6 S, Z2 B* d- X9 r- t buf.b = pshreRAM->b;/ P) t7 A5 @# P3 G3 a: [) H+ ?" B8 k
buf.packet_cout = pshreRAM->packet_cout; % p" }/ m( q1 Z: z9 [+ g j/ y : E$ ?3 \7 e7 K7 X% X5 h6 F' H if(buf.packet_cout != count_copy)0 F: C5 ^$ v2 p$ s7 n
{ # C$ e7 x% l! r- i; A0 w* [ printf("a is %d\n", buf.a); 7 [, D2 m% [+ `* q9 I6 M9 y1 k printf("b is %d\n", buf.b); n/ p: D4 C7 @( w7 G
printf("count is %d\n", buf.packet_cout);" ?: X i3 e2 i. L
count_copy = buf.packet_cout;& X/ N. }" }1 Z2 V0 M
} " Y0 M' W/ x3 U6 d r else 3 a1 F: W0 Y: l6 `! Y& f. ] { / W' y! J" n+ R" O+ A% w printf("No effective message!");* i8 {4 X( [2 r
}* `8 P5 m, k A$ Q) t
} ' u! F0 A0 }& e( q% T5 ~- v4 g) _+ X% T1 v
4 d: p1 T8 K$ p* Y" Q, m+ V1 E+ o但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 4 U7 {6 h& ?& f) Z3 ^使用下面代码,对内存使用了mmap函数后: * i; r1 B0 p& l0 n* p, n#include <stdio.h> - w. h+ e. B7 N9 x- a; x#include <unistd.h># @2 U! Q C3 r5 d& t
#include <sys/mman.h># m z) i' T3 f
#include <sys/types.h>/ L, c1 {. c* i1 Q
#include <fcntl.h>) G: z V/ b3 a
1 N2 b& T w S. I
#define SHAER_RAM_BASE_ADDR (0x80000000)- w0 x" p; J5 L& @1 a
#define SHAER_RAM_SIZE (0x20000) / I# J- @+ n+ x5 v x
8 T8 ^ Z. P! f8 Q' ]typedef struct , i- ~) h( ^0 w! Z{; f7 u1 {9 v% X. e+ k" X. b
unsigned int a;/ E9 J8 k5 Y( ~) e, e
unsigned int b;1 P" `' s- u5 [, ?/ v- p2 Z
unsigned int packet_cout; / p. e5 O, P; A4 k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; ! `& s& f: i8 B' @& o: H: Y: T9 b( y
void read_MSG_buffer(int *baseaddr);0 r. k" V \% h0 B( q) V" c
unsigned int count_copy = 0; $ N ^9 a3 ]2 Z% J+ x" b 6 x1 j2 R$ w0 j6 N% g2 Qint main() , X3 ~! o, Z( h" P: H0 Z9 Y( m{' o( C! m# i" D( U
int fd;. B9 l( \' G2 r5 {& U& h2 U5 ?
int *mem = NULL;& P/ p- D# E, |/ b
( M/ i* [# V* c5 ~
if((fd = open("/dev/mem", O_RDWR)) <0) 3 `) g/ e* o. H$ s. [" u {* Z2 Y1 {7 k# B) I4 q
perror("open error");* i, r5 _9 r8 [7 x6 b3 H
return -1; + l: h( |8 }7 V% G2 o5 {0 H5 K } 5 C5 A" O t U/ g& B. B C* w3 ^: ?% ]: x- u; S mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! z6 D* l1 y5 t4 \
- ?6 a2 o) V' _( {7 o
while(1)2 g5 N5 |' d1 D' q: ]
{- l/ f G. L, P4 m* _/ q
read_MSG_buffer(mem); / \1 I- q" R9 i } , M" h9 z$ U$ V0 J' k4 k# a}* [5 n0 Z4 a, d( i) x: G6 D
% @" n. c5 d' f. D$ G) ]void read_MSG_buffer(int *baseaddr)9 ]0 ` X& ~0 o" a
{' F$ V8 f. r. Z) ?4 Z+ O, k Q& Q
pRX_MSG_PROTOCOL pshreRAM = NULL;2 c8 |9 W l* J: m
( s# Q6 ^; ?3 m' W( b0 S pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 ~. Q7 |8 |5 C
4 [1 O! q0 y% |
if(pshreRAM->packet_cout != count_copy) ; c3 H( j5 V9 a" ] { : r. t" q' G% Y$ t printf("a is %d\n", pshreRAM->a); % Q+ l% I4 W1 a- Y printf("b is %d\n", pshreRAM->b);5 z% i3 c9 Z2 r. g6 b c! v
printf("count is %d\n", pshreRAM->packet_cout); : z! [. T4 u# c- } count_copy = pshreRAM->packet_cout; 3 k- h3 ~7 o2 D5 _3 O5 M6 S6 N } ) W* ?/ g. a# i- b0 i& i, ^ else- v" v h% W+ q# O) s( ^) B
{! b" _2 X. c- X+ G, O6 `
printf("No effective message!\n"); + q0 @: Y+ Z. A8 r1 K }8 p! {# n! f! S2 W7 W+ W
}' l4 j1 W ^3 [5 L; \; [
; N; d. r. ]0 F! {" r7 V; Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ K' j/ M! D M
% I& |! p+ f1 m3 s& ^1 i8 Y/ r9 R3 O. ~! m' Y
1 U# s# }+ q |7 x7 Y r7 Z