|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' ?" s& h$ h5 j% u
' h# |3 V l0 q, kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, W e' {5 t( y9 A! s#include <unistd.h>
" s0 v$ R4 I5 P- c. ]. N#include <sys/mman.h>
/ c, B {1 F$ P! x+ K& b- w. W#include <sys/types.h>
W$ H3 ?- v# e& w) w! ^#include <fcntl.h>' O6 N) c8 Z$ G+ B$ Z, |, q- i
8 _# Z' i7 o. F3 Y
#define SHAER_RAM_BASE_ADDR (0x80000000) % Q6 p8 u: \, z# K. E. o2 _* ?
6 W0 b [- p: m$ ?7 m
typedef struct
* \& z& a$ E. N/ \$ Q4 k{: z+ Z j' E7 e" G ^/ }
unsigned int a;
, F4 q4 \! p; ]) k* \, t unsigned int b;
) g# S& L1 R7 I( i( T6 m unsigned int packet_cout;7 V+ R5 l7 P" F9 t. a3 z7 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 A, ^' b; c3 Z; R
3 M5 o7 L1 j6 p0 ?6 {) o: J7 `% Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' X6 `, y$ S( n* q) d8 p
unsigned int count_copy = 0;
" V* s0 ^& M9 _2 K8 \7 ?- D3 y# P' `$ m( {; S: l; d4 S6 h+ o; C3 S
. x3 h2 u$ K: i- M' \6 wint main()8 R. t( R w: P8 x/ R
{/ P" g! A* {; y% a5 I* ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
, A) q- J7 E7 O6 } pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 k9 a1 w9 W" K3 F3 r/ _; |
1 s! X8 e: _. @' S7 q! i( Q while(1)- x/ a9 P1 A" q. ~2 Q' J; P
{0 ^2 z8 `8 M4 q! I6 W, X
read_MSG_buffer(pshreRAM);6 t+ \6 _& J2 [; a* W0 p0 I
} , j- Q; i) l& R7 r6 d/ B
}
% z' W/ \" @# t
" ]- o8 ]& F) fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' s" k* {( [* u4 F1 r" ~% B7 \) J8 j{
; m! D( K7 z, q RX_MSG_PROTOCOL buf;* e' N0 M8 p+ H& |
& i; B9 `+ _% O) l5 H9 C buf.a = pshreRAM->a;
7 i. s0 n |- ~/ Q7 Z. w buf.b = pshreRAM->b;
% Q# Y2 B1 }, e, z buf.packet_cout = pshreRAM->packet_cout;
1 m/ ]' i" e/ s L, I& G+ S5 s# J
if(buf.packet_cout != count_copy)% {: w- {9 z3 D! `: j
{
4 X& a$ M) Z, O9 W8 R; n) ~ printf("a is %d\n", buf.a);3 x* X: X' m( L& j2 C$ \
printf("b is %d\n", buf.b);( }* |0 Q6 L# X2 @, N
printf("count is %d\n", buf.packet_cout);
9 v; x3 @: i0 X) y' h( u' [" \6 e count_copy = buf.packet_cout;
( R* R- p' z: l4 L" T2 \: m8 p, d9 F }
! G( o! D: F( K& F3 R W) @ else
3 h& a, `# m. H* q {
0 C1 @- w: S9 ^& V# e% j" S printf("No effective message!");+ ?% D6 J8 [! ?; k0 r
}
$ A" U# w5 I/ U. Y" Z5 N2 N, _}% v& k2 N3 E. d: |
& u5 r( W1 p- z# h s; V3 K
5 R3 C! L4 Y+ S5 h% x! W但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 w1 j I: }& A& z% }, F
使用下面代码,对内存使用了mmap函数后:
+ d( L5 H" v( I% v2 A2 x#include <stdio.h>2 h9 q/ j! G: k& w* x# z
#include <unistd.h>
' g8 b3 \, }2 z5 j. S#include <sys/mman.h>1 X" D% l6 S. q9 K& f
#include <sys/types.h>
2 ~7 a4 R4 ~3 I; k% h$ v#include <fcntl.h>1 W( \7 A4 `& B1 k
( H1 h7 r$ }, o0 [( E+ K
#define SHAER_RAM_BASE_ADDR (0x80000000)/ L! b" L# B# ^7 k' v3 |3 O( h7 N
#define SHAER_RAM_SIZE (0x20000) ; C$ }. s1 j8 o# y: M
! m( ~) y* y- Q# Ztypedef struct$ v- l. B, g( W8 ]& F& a* x5 M
{ N. w5 W: h: E
unsigned int a;7 @: B9 g* S3 f5 b
unsigned int b;
& w- _; Q. _1 T, w P& k( z unsigned int packet_cout;7 K1 r0 `+ W$ N. l7 I) s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! e& h5 R+ m! t* U8 `
9 z. i0 h; A2 t2 B1 zvoid read_MSG_buffer(int *baseaddr);/ k& Y& j- {3 \9 x
unsigned int count_copy = 0;) M$ y% Q u# C( f2 K* G
4 g q8 ~6 p5 O( k4 P. B) K
int main()
7 R. o( c- \4 ], S- M{
0 z; i" P8 j# Z) H2 [; }& _ int fd;0 n1 ^ c, y" o& Y! |
int *mem = NULL;
( V+ ?3 O) T: |8 F6 m& H0 G4 x# L& g+ B+ t. {% P: p
if((fd = open("/dev/mem", O_RDWR)) <0)
& q2 s+ `9 K7 Z$ a5 v; T( w {
" }: M4 r! K5 i6 Z- e' j( ^$ @8 e perror("open error");6 o- {, F6 {) U! K
return -1;$ @( M6 ~- f% k. a" k% ^) O8 i
}6 `6 m( @% g/ G( E$ V4 i5 W2 O
* R& F B5 r9 ~+ L7 a& t: |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; q, e4 p0 j& c/ ~- C. o. b, X
0 Y! ?0 Q' w& b, c; g5 J% A8 B while(1)0 @4 x( B4 \5 T
{
O+ x0 @8 s& W( y5 R; t( f read_MSG_buffer(mem);
) @( l" C4 ^, B, ?3 g& m- t" j }
2 a' L4 H7 k6 T! `* |} B8 I- f* J8 ?: _7 m
; N5 M7 F6 B* x: e% Lvoid read_MSG_buffer(int *baseaddr)
$ O* b) A9 r2 c8 ?3 E{
\' Z3 `' b: U1 I A1 C3 E pRX_MSG_PROTOCOL pshreRAM = NULL;
; j* I# p- D. n: O# U" b' [
* H4 p |. ^1 P1 K2 x! q3 @ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* q% M2 o2 G; a: p( P
, }: t0 ?: Y7 U! r if(pshreRAM->packet_cout != count_copy)
8 |. @9 }+ T: {& @- p1 \ {4 j* t/ i. K: V& R( N
printf("a is %d\n", pshreRAM->a);
; O% ?! l _2 H! U0 x printf("b is %d\n", pshreRAM->b);
0 ?" Z6 q2 I+ O4 G9 K printf("count is %d\n", pshreRAM->packet_cout);9 ?: | w: \! r. |& q0 `/ i7 Q$ u
count_copy = pshreRAM->packet_cout;% l7 P* ?: `% o7 L' K
}9 L |0 f7 @* w3 ~' d J3 q
else3 }; S3 N8 f+ \
{7 `4 z; h! n3 \) x5 x* y5 L
printf("No effective message!\n");2 x" w: s P6 O4 b5 y# M0 h$ Q
}
% r* @. w' b5 [5 i" X# W}* _3 C! G) X2 ~- h3 h( P
2 v3 S4 N3 B0 C. e- Y: r* k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( j$ N) u2 a5 c9 J6 E% Y7 E
/ f0 k3 k+ i7 l
' A4 L+ v0 L5 m) i/ j4 o* G2 w0 T4 s' c" O( u
r/ S/ T" p& i2 \( M |
|