|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * h6 I& _# k2 Y
0 q* P3 o! V) W9 I" f" o8 p JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" j! T. M9 v" P# B! \& i1 E#include <unistd.h>
7 y; l( O+ A' ^# B) J#include <sys/mman.h>) A4 L4 Y4 f- d8 h
#include <sys/types.h>
# X8 T$ z" `/ P' ]5 U7 O0 T* b#include <fcntl.h>% N. X5 c; u, f) _& Y
2 `& d( F+ T! q( V! U3 w#define SHAER_RAM_BASE_ADDR (0x80000000) - z! F/ q: e' ]/ l
: r6 X/ z! S5 _8 j( h# @
typedef struct
% e5 X: v% R% O$ w5 s w9 R{$ ]' ~6 R5 `4 L% i4 v
unsigned int a;$ d; H8 d8 m( b+ i1 k! j! M0 r6 i
unsigned int b;
+ Z3 Z" [# f4 v4 M unsigned int packet_cout;: ?/ V- i% O9 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 G1 K& \& Y' c3 S# r l+ V1 ]" l) [/ f: h% z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% s; `) R2 b/ a) Uunsigned int count_copy = 0;
% d, x/ O: q- l7 N0 Q* ^! p0 x# Q. ^! e1 Q
5 b( z K$ ]7 A* Z' D) Gint main()
$ X/ i t; ?# J" t{
2 ]0 V7 N' D2 M6 _ pRX_MSG_PROTOCOL pshreRAM = NULL;
! j3 u. X7 d/ A2 C9 U pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 W/ V/ Q7 {5 P7 d
( l& f( f% i4 ~ while(1)% D7 K- }8 J/ Q& l" Q( T
{# g& M# _* \; P/ Z' f
read_MSG_buffer(pshreRAM);
) D6 j0 O7 v8 Q3 s) P! R9 Z/ ~ }
$ w; x1 P* N8 Q2 u$ w0 r0 ~}
8 \" p4 T0 [: w1 A3 G6 a% X' Z1 u4 }8 y5 _7 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 C" b. B+ G8 T0 R0 B+ e
{
" Q8 O1 Q" T& @( Z$ u( g RX_MSG_PROTOCOL buf;
0 ]! T8 Q3 o8 H* S6 N( A, y/ \ $ s# s% g9 I: \
buf.a = pshreRAM->a;5 S* {4 x8 H- h& {& t
buf.b = pshreRAM->b;
8 e/ S6 p3 }. H) m: Q buf.packet_cout = pshreRAM->packet_cout;
3 ^* ^. _6 L: `2 b5 Y0 [ : w% L* k9 K5 `4 E3 A" Q! }- a
if(buf.packet_cout != count_copy)
2 w7 _# O/ h& q7 X' Y) {* h {
/ A* e& S5 r$ t# _, k" @) y printf("a is %d\n", buf.a);
) k6 e6 l$ N5 i: }% h) P. \* r) o printf("b is %d\n", buf.b);
9 T" d- G, c$ o: S$ C" @ printf("count is %d\n", buf.packet_cout);
; n# Y# ?& p6 V0 x: v5 w9 Y count_copy = buf.packet_cout;
& A. _+ i) V6 D }
1 _% _8 T" Y ~* r5 A" d else/ X. |. L0 [- `# \; e/ D. a: R
{
8 j1 K/ q' Q# ^/ K" o printf("No effective message!");
1 o4 w. r* H | }2 q, E8 b) ?5 J! o; [7 W
}
: i& W2 @& U- @; l" C) _0 A5 H0 [; @/ F
% A% [: _: y) S# |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! o5 h F+ O& o, b9 V
使用下面代码,对内存使用了mmap函数后:( h: U1 m% T/ s' ]* X
#include <stdio.h>
# p: e" _0 ]/ f7 F& V6 D! k#include <unistd.h>
5 }' O/ C6 ]6 {/ U#include <sys/mman.h>
% w/ I/ ~: n8 m( u( Q8 C7 w+ ~#include <sys/types.h>
9 r. P, z2 w+ k8 H! @" a. X7 m# o( ?! `#include <fcntl.h>% t, H5 M3 v& v- s0 ~$ a
0 w' B. ~1 g9 L% u( W' {5 J( V#define SHAER_RAM_BASE_ADDR (0x80000000)8 z$ w6 z$ o' N8 a: Q7 h
#define SHAER_RAM_SIZE (0x20000)
& V b( f! X0 \3 M8 Z4 T4 G/ O) d. U+ [4 w' c
typedef struct, |. ?# N* K: ~
{: F3 c4 u! z) f5 s& R
unsigned int a;
' I/ f$ L; b9 ?! B4 e6 Z unsigned int b;8 T' ?% J( E7 y3 z& i
unsigned int packet_cout;+ @3 }; H( ]( N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 K6 ?2 J. u, A( K
5 s8 ]" \/ j+ kvoid read_MSG_buffer(int *baseaddr);6 i3 q9 |5 \! ~8 {
unsigned int count_copy = 0;" g0 @( P8 N: X9 h- K% ^3 ~
9 a; G0 G' a6 W- w
int main()- _- L( j/ G: S" I7 q. x2 _
{7 E! S D' \' y- D' E+ ^7 w
int fd;8 A* f$ R8 P% ?7 n7 U
int *mem = NULL;
9 x" u2 t! @0 Q8 N8 V X2 d
6 W5 e. E% B8 Y: | if((fd = open("/dev/mem", O_RDWR)) <0)
0 S2 E% P4 L1 D3 Q; [# { {& o% A! E& @3 o# o9 I
perror("open error");$ b, r, N- L0 [# [6 K
return -1;# B% E5 ]5 ?$ C1 \# B0 V
}9 n5 c' T/ F0 R7 \
7 b4 o+ `. t5 h$ _! V- ~" E
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 J: A ?1 P: f% n; W2 f
( P- s! M/ B" F% J) r' J. D7 p while(1)
( {9 n- Y x7 f+ b9 t" D% A' q! b {5 E2 B* i2 ~: r0 N
read_MSG_buffer(mem);
+ g. g: A1 H q4 T+ G3 l } ' Q4 N( ]& J, Q3 F! E
}
* b0 A) I9 p* S9 R9 j1 ^" [; U
% `3 q& {7 B5 b# h( fvoid read_MSG_buffer(int *baseaddr)
( t( X) B+ r' \3 l% Z/ C{" m' l0 H- i9 M& Z0 J$ }1 ?
pRX_MSG_PROTOCOL pshreRAM = NULL;- A9 s4 I6 C S2 K( w/ {7 L5 K
; V) A! |. k6 m# }( Z( G: M pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 e( C. ~/ }+ `
7 e6 b g- x% \
if(pshreRAM->packet_cout != count_copy)
; I/ d H6 J: S& V* n9 R% V {/ |% B: O. B- l$ B
printf("a is %d\n", pshreRAM->a);
' I/ a# P3 s/ z! w" E: F printf("b is %d\n", pshreRAM->b);( J Q* n# [, ?( V
printf("count is %d\n", pshreRAM->packet_cout);( h6 T% E( m! u5 Q: X" H/ t. T' p
count_copy = pshreRAM->packet_cout;* i, h# c! z; \; V
}
( q* b; u; }( [* P: W else$ ?6 ?, k6 f6 s4 }) m0 K
{
6 L. h! G' \9 q printf("No effective message!\n");! \( V9 L8 r3 v" I4 v
}
# w2 w6 I0 R w- h' n}
5 Z7 W* r* Y7 Z. n1 s* p$ Z$ }8 `: E. v" E; Z$ R# z* u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! g) ^. s$ O" T% V: k
& u @0 w8 F/ D' r- G9 X. C7 e+ X9 N/ ^" O5 ^9 t, K3 h0 P# u
; m B% M' i# q
* g. b9 b, O5 x
|
|