|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , R, q4 h5 p4 I0 g3 |
3 Y, J6 ^8 b. d: B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- v: {9 J7 K) j) i( W
#include <unistd.h>
* c: P& i8 V" e7 l& O% M: V3 ^% F#include <sys/mman.h>
' t8 b5 ~. H s. w#include <sys/types.h>
3 Z- X9 X, S$ \$ s; V/ G3 G#include <fcntl.h>. h* ~. i" @0 f+ Q0 e
`5 j# F+ V2 W5 k* F
#define SHAER_RAM_BASE_ADDR (0x80000000) # e4 b5 m7 M& h' }6 d% e: [4 }8 K! @
1 H5 o" L' r1 D2 itypedef struct
& o6 ^$ Q. d. G: \& t{6 v2 e" ~ |1 |4 c! _
unsigned int a;) }$ T; ^% w8 J; e5 q
unsigned int b;; J3 G7 z7 }, k d- J
unsigned int packet_cout;" p1 `) ~/ |) L" K: s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 X- Y0 S/ _. l. i9 A! ^+ t3 N8 `' R) h# Y5 I% S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( ^) x: t: e ?* k1 e
unsigned int count_copy = 0;
/ r: \+ g- }. I" p F3 o# X( O
- C' k/ q3 @' D2 X4 [4 ]7 ~* n& _/ z, }
int main()7 x/ s& s9 W2 f7 p$ R! ^
{
$ E8 |8 {, N' k# N' n5 e( D, q) ] pRX_MSG_PROTOCOL pshreRAM = NULL;8 |. r t3 i- ^
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 C$ [1 H+ U/ Y0 b. o, H7 z7 `: M# v1 N. Z5 \
while(1)
7 G* ~6 }4 M+ J5 k {6 K! g! a% L, h& b
read_MSG_buffer(pshreRAM);
' o6 A+ R2 Y; h' S- K% z. X }
6 s3 p; x' f9 ? k7 ]+ ~+ q} S! Z- k2 x' W- e" ]4 a1 h
; J8 u. {: @# P0 s' Y5 t$ W; g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ ?0 b) w0 {0 l& t{9 }" E" N0 X3 I
RX_MSG_PROTOCOL buf;
5 o2 ~3 [* U$ X) e8 K
, ~, D+ m9 [& V. p6 U" o2 S; ^4 K buf.a = pshreRAM->a;
; I1 X; o& C4 L buf.b = pshreRAM->b;0 \( V, T; h, y5 \+ Z6 N8 O+ p8 _
buf.packet_cout = pshreRAM->packet_cout;
' w3 ~0 B$ _1 Z% h" ~3 a / `2 s' j9 [4 ~" r
if(buf.packet_cout != count_copy)$ {4 S5 G B$ R; i- @- v+ t
{
2 {! Y& q* ^3 W- r* c printf("a is %d\n", buf.a);
L. Y& V( K8 @5 F+ B- U( r printf("b is %d\n", buf.b);
7 F8 A" X$ q+ i# B* k, w+ L printf("count is %d\n", buf.packet_cout);
( p$ C. G9 ^2 ~6 ~9 g count_copy = buf.packet_cout;8 @2 k. Y# m5 H( F$ f3 I( x
}, {! G$ W! b) Z- d- E
else% W1 E$ u# \' m
{
3 N8 W: D/ v. @+ f% U B7 H) D( S printf("No effective message!");
, P1 }, f, y/ r0 [& n2 l }
- i; `# X1 @; z: _}
9 w" S) p+ H$ J$ E$ |8 x" C; i9 k' C K1 r
& h6 e2 c3 \3 V2 e; O& F& F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% n! K+ {8 N+ p) n( _
使用下面代码,对内存使用了mmap函数后:8 b* d( n) f$ i4 F' W
#include <stdio.h>9 M y5 y4 s, M
#include <unistd.h>$ y8 m0 l( W2 B0 ^. D- }* d
#include <sys/mman.h>
- E; a, K' `; i! F) {' R4 @' f#include <sys/types.h>" R; Y8 y2 o5 z
#include <fcntl.h>1 l0 r6 }: |* H+ B
W3 o8 n" Z3 d#define SHAER_RAM_BASE_ADDR (0x80000000)
7 R; ~+ S; p2 c/ y O; r/ U#define SHAER_RAM_SIZE (0x20000) 1 R2 x* f1 b1 I" e; u
9 N- D2 I. q+ p
typedef struct
: C9 Z7 h) y4 w6 X$ j9 F0 r3 l0 ~{' | t$ J0 Y, `4 u
unsigned int a;
( H: H+ S: Q* w% G8 i3 J0 N; \ unsigned int b;
6 f0 h' C: g( p8 W+ j1 _ Q3 G unsigned int packet_cout;
e5 k; `! k) ~; K& X+ m5 t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, Y5 o( d, [, H/ t/ G- m
1 P- n% Z, Y8 y2 f. ]; t) uvoid read_MSG_buffer(int *baseaddr);1 |# v( Q" l- N9 v% C% y6 V* _, |
unsigned int count_copy = 0;- S+ a/ U2 a N; ~9 F
8 k$ D; Q2 y% x# l3 Y3 a2 V) v
int main()6 u ? h- S. k6 A+ Q: `- y4 C+ X
{
1 Z/ Q- B f9 p( s1 m. N$ E int fd;% ~% L$ z+ f1 Q. B9 t/ a( n
int *mem = NULL;
: |% f) j# q0 s) T
) A" G; n) f9 D/ h if((fd = open("/dev/mem", O_RDWR)) <0)
$ q1 u: b6 t" R! p7 J+ C { \% s# Y; ?% E3 G2 ^$ H
perror("open error");
. h. R q) u, [ return -1;
0 d' Y: z- L* X+ Y' v) m$ X }
/ n8 ^# h* X: J! k( `9 T, \
/ h o! T' A$ |9 N1 U$ t mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 V g9 q& {0 Z0 s4 I* V4 f
" M2 j e; X: U! ~4 ]) h" _
while(1)
! k2 w# m: x% n- C( t- a" M {
) S( d O8 m! z read_MSG_buffer(mem);- Q: R3 N8 Z* e6 D
}
0 V% e) A0 j8 d; z}
+ `* c0 Z! _+ i; o) I- f6 {
- ~, k% P, L( f8 ovoid read_MSG_buffer(int *baseaddr)9 q3 c9 u/ ~: K6 @. M* y& F- s: s
{
. v2 y* H5 X' b- n pRX_MSG_PROTOCOL pshreRAM = NULL;
. j+ `4 o, s* o! P' g" L7 _* I$ n
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: z7 b! [' g: R& r: @" d j0 b$ A! G+ G8 K; _( x) W
if(pshreRAM->packet_cout != count_copy)
1 k" \" b* j% ~! f4 i8 f {
* c3 a; N/ Z0 b1 L: W4 x( [8 P printf("a is %d\n", pshreRAM->a); Y1 E+ n/ m7 I3 i/ T% _+ |
printf("b is %d\n", pshreRAM->b);
6 I! g: @, r7 ~3 q printf("count is %d\n", pshreRAM->packet_cout);, ?3 i* P7 L8 B3 C. Y4 u" a
count_copy = pshreRAM->packet_cout;
* c3 k9 m3 W1 w* K' J% T }
( Q3 h1 L* E3 S* U else
m0 g8 M6 q# t0 b7 v- @ {2 q: h* J6 W/ t q T
printf("No effective message!\n");
+ f' q6 u5 s$ ?$ u4 H6 g; e5 ` }7 I+ z+ x: D% `9 d
}6 W- k: f, B8 J# d" J% I
8 v7 e; G0 m* l. c# ~1 ^7 e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" {: l* r" v# Y. b$ D J) P* Y. g# [( ?- Q& J) _5 R) o
2 V/ U9 N- X G! ~! M7 b/ {/ Z: j- d7 S( W7 ~+ `
8 ~0 I( A! _( b x6 B/ u0 R |
|