9 V1 o# O9 u9 D% O; T( A k, W, s hOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> $ L% M% j, O O#include <unistd.h> , \& I' s% d! Y( `# w#include <sys/mman.h>+ j' h9 x2 m; h/ ? [# N8 g' i) F
#include <sys/types.h> & x& E/ _* ]6 m#include <fcntl.h>4 E6 E& t$ @7 g/ F
" h( ]' x+ [$ f: f8 A* n9 i. l) z& a
#define SHAER_RAM_BASE_ADDR (0x80000000) # P- u/ b% i; ~ v8 u* E
4 s6 F0 J0 H2 W |$ r% @: h: I+ u
typedef struct5 _0 S' A/ @7 X
{+ N; k S- Y% G2 w
unsigned int a;% t# m" h9 _7 a; X& M& q
unsigned int b; ) n9 k1 I* o+ I( u unsigned int packet_cout;/ W! U' Z6 X3 W5 a1 p. c! B# z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 I% h! l0 E4 } d# E
# M' u1 |# h1 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) W2 u; k( F: ^9 ^/ J7 v5 m* U
unsigned int count_copy = 0;- L+ A' j* O7 s9 T B5 Q9 {
# p1 @$ j( D7 G7 z. ^4 y
! `/ R" r6 S' c5 b# w. r
int main()8 e2 U$ p$ K: K
{& o; F. h5 f' u4 I7 h1 \; @( ]0 ?
pRX_MSG_PROTOCOL pshreRAM = NULL;1 ^" ]* v! ^. p/ b$ s @
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; + b2 b3 \6 P3 m- [' d$ A5 |0 H+ [/ l2 [
while(1)3 g: x2 j% k% A8 s4 y9 \
{6 O% Q% a( B) |+ q% `" q+ ~ n5 h
read_MSG_buffer(pshreRAM); 3 {$ ]9 d2 Z2 U. S% m8 X' ~ } 1 v. U0 h0 w' {" D2 s' K8 A} 5 y D9 ~% |. Z6 N+ p( S ; s) f8 W; D" ?% pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) ( e4 p# ^) S6 a9 m, V{ : ]: d" b8 C, W8 E RX_MSG_PROTOCOL buf; 2 Y0 L: t) {# B+ Z( T 4 z0 H# K- c* q6 M; p+ B! | buf.a = pshreRAM->a; " v7 y- F# e& D- F buf.b = pshreRAM->b; 9 }" N1 w( w, h buf.packet_cout = pshreRAM->packet_cout; # S; P: [- U* T3 u 8 {# `# @. ^9 N1 u3 i2 C if(buf.packet_cout != count_copy) 0 B9 h( U* a; o) `% r { ) d9 _6 t9 H. V printf("a is %d\n", buf.a); 8 H4 I# C" ]9 m2 @ printf("b is %d\n", buf.b); : B7 @. g8 p% B8 m N printf("count is %d\n", buf.packet_cout); 8 t! u3 p4 j K& O6 ] count_copy = buf.packet_cout;" C9 `6 K: U1 O5 ?2 x
}2 e; g- b6 E+ Q3 T& L4 ^$ h
else 9 F. ^9 u1 E+ I) I% O {* R4 \3 }- b5 X$ ?
printf("No effective message!"); . d/ A- e9 C- V0 u0 p) P }1 t/ H6 |" v3 f t# d/ L
} " \% f$ |6 T( S/ F' i7 D1 X : z+ B+ u3 L/ T# z$ c: u% x4 U+ i1 L+ N, k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 ) ?5 }$ ~: v! m4 k9 o7 ?使用下面代码,对内存使用了mmap函数后: ! \6 c C6 e# ]0 o9 q% L, N7 v#include <stdio.h>+ p: \- [- ^7 {- J; z, k8 l
#include <unistd.h>8 O7 c5 g; w# y8 m; @+ N2 M1 c
#include <sys/mman.h>$ \) V: v" N" S
#include <sys/types.h> 9 F5 U1 g8 O6 |) H#include <fcntl.h> : y: P4 m6 r$ g1 p: ?4 o + B& e2 X1 @3 n5 L& A#define SHAER_RAM_BASE_ADDR (0x80000000) ) b/ D0 v d1 M5 j- p1 P/ u#define SHAER_RAM_SIZE (0x20000) & s" F8 q- v0 M9 _& b% Y
5 D' F! a' k' [( y3 dtypedef struct; U, K d; R$ Z& N
{ % M/ s* c& x4 }( ?5 r unsigned int a; 3 w1 x) V+ _" g unsigned int b; + G- {8 Y: j& c) I, q4 J/ ?, K; T unsigned int packet_cout; * t9 u/ l+ o7 d/ G5 t( Z/ ~% N- p6 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; I' X; ~" [8 z I) G3 T
9 k' B$ v4 h k7 S! ?! h! Uvoid read_MSG_buffer(int *baseaddr); ! B0 i; N$ s h$ r f9 sunsigned int count_copy = 0; ' ^) l# B( x0 m5 M9 t' f1 \& Z$ _. G" U3 A, S8 t+ Q
int main()$ U" ]7 O* L: }9 B0 f& q D8 H
{ ; `1 ~! ]+ _. I9 w5 x( x8 x/ j2 p int fd; + J+ Q, `7 c1 Z {" [/ S6 F int *mem = NULL; 4 G9 _$ F1 Q* n0 ~" y X1 } , D, B: z) x& Y$ O+ C; K4 b if((fd = open("/dev/mem", O_RDWR)) <0) / w. p: \/ y5 Y* I { , Q! i5 E+ u1 o3 e3 } perror("open error"); l+ p) x+ R! u
return -1; # G+ @4 k2 k' p, f1 ], T$ Z5 c' I& U5 @ } # p% D% I. h' l/ e0 x1 q8 [; y( J% { ( M$ q; [2 d2 m+ U% e5 { mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - j* S2 {6 f; D1 y, X W, S; {* o4 A, D, h& @ while(1) 0 Z+ ~) t2 Q' c3 ?$ F {+ ~$ P* M/ K7 r: A( b$ n- k) |
read_MSG_buffer(mem); 6 A$ }) ?7 y0 z% Z } ' a7 n: y/ j" o9 U9 i% |} 9 l4 d4 D8 A( r; G @7 y% N8 ?2 H* S' [4 @8 @' }
void read_MSG_buffer(int *baseaddr) E9 [1 I5 E- g( O7 D' M0 F{$ @+ E1 ]6 k% O' ~) v/ g+ ^
pRX_MSG_PROTOCOL pshreRAM = NULL;( [$ b) X+ B) c& V/ W0 n2 t- y
/ s3 p+ {" a) Z) W, d pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 X0 X) d8 M4 Y. ?9 C
' N; o2 U3 y# X/ {% @, l3 G# D
if(pshreRAM->packet_cout != count_copy)5 K4 W+ h9 {9 R3 f) ^ K& X& `: x
{4 R# @, w) Z, w
printf("a is %d\n", pshreRAM->a); : s+ ^% l: z+ x8 C; T* M printf("b is %d\n", pshreRAM->b); 3 z7 {; `& z8 F! o, ]6 y printf("count is %d\n", pshreRAM->packet_cout); # [/ r) i/ P: k: D0 ^ B9 [ count_copy = pshreRAM->packet_cout;: I5 e1 G7 m/ b/ k j
}% u6 r) p/ z2 a- F; P. A
else( ]: {9 X. F9 `# L5 Z f* H
{5 z# O L8 q# v. B2 D
printf("No effective message!\n"); / p+ H8 I M. c) j | }! {7 y @' m* j- n- Q& I
}. b6 e+ A p6 l0 g4 b _
" R! v& Z/ I, Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? : ~$ j; u' x& C0 \$ A- G2 F n: ^5 d. _2 h( n6 J8 W+ P6 k1 z2 k