|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * v' i1 h" K8 J( R6 A5 B
5 g. Y, Q# z7 r6 W" g( H0 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' G: o H# |: H }: Q7 p
#include <unistd.h>8 @4 P# Q2 }* j- b" G! ?
#include <sys/mman.h>
7 `/ T) ^) l8 g2 w! A& A+ E# C! G#include <sys/types.h>7 O- _. {! [+ c4 x/ `
#include <fcntl.h>
- f0 P( L* {7 c& x9 h% _
, {, ?9 e# Q: `! ]; ]3 [#define SHAER_RAM_BASE_ADDR (0x80000000)
+ T5 U1 U2 p- G4 M2 ^
4 ~. v. p" y, U# {7 o) @& W, Etypedef struct# R+ `, r" m8 x4 t6 J1 h
{
# z: I, _6 R. G6 {! W& H( L unsigned int a;! V9 p, G& d1 F M8 t
unsigned int b;
6 \8 O; q+ h8 ~- c unsigned int packet_cout;& \5 o i; X# f* m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 q, K; w, e: ^$ H. D7 z0 V1 J0 H4 X% n! ]( }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 ] d1 S+ _1 e$ M, a6 ^9 ounsigned int count_copy = 0;
" }% f" [; J& V* K2 Y
8 N2 `6 d* y4 k0 y0 ^- C. O! h1 V* w. b1 y1 B# q
int main()4 d, [/ V9 Z! P/ R4 M
{
' H7 ^# Y, p0 s h$ X4 S* u! F( A9 i2 _ pRX_MSG_PROTOCOL pshreRAM = NULL;6 R, M+ R c2 |( d+ ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 ~! x, t* K5 ~) x8 B% {, y
! ~4 T1 K9 e0 ~ while(1)
% _: a4 M( a5 H; S M0 W {- J$ ?3 u9 J* l0 h' x
read_MSG_buffer(pshreRAM);/ n7 ^1 U2 _' E# \5 P: q% o
} / O- {# K: _- P0 i& b5 {5 x, F
}
( q. G& x5 B7 }3 D. m4 E9 t4 s3 N8 O/ V7 k3 c1 `! z3 N0 a# d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* k* u( v7 L# G! t* f6 \{1 x6 y2 R, U/ I, x1 j; W
RX_MSG_PROTOCOL buf;
+ W. @, G6 m3 [' l1 A! d1 B
6 k( u6 u9 p; Z6 V- ^) P$ X9 D1 g buf.a = pshreRAM->a;
. G2 F* h6 z2 \ buf.b = pshreRAM->b;& l# g4 z9 c1 j$ Z0 v4 w. G% Z
buf.packet_cout = pshreRAM->packet_cout;3 P* S( C; i) q9 s- R+ M
4 T8 T5 _+ m0 W# }' |4 L3 X; M if(buf.packet_cout != count_copy)
- h- ], W, G# b( \ {# Q. n2 m0 C) S& Q7 e) i" h
printf("a is %d\n", buf.a);9 u) c/ Q& G0 U" B; }9 i! l
printf("b is %d\n", buf.b);/ K* v3 D0 b$ T8 @2 k k6 k
printf("count is %d\n", buf.packet_cout);
0 F1 b1 l5 I6 a- J& J count_copy = buf.packet_cout;
: ~. K( l+ z e4 `/ E, R4 U }
4 a' S2 A2 b! C& G% ? else2 C* M8 l. f _8 G8 i0 [
{4 E+ g+ B; ?) V: {
printf("No effective message!");
# ]: M; _0 O! }* V; ~ }( C4 a5 Y( Y' @ f
}
7 t" V4 z' j/ E8 w1 F n6 d
: w7 _6 P3 r% N3 t; Z
7 l. G' x) |1 }( o- R% f4 s L0 B但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& Z8 h# G$ D, G$ o
使用下面代码,对内存使用了mmap函数后:/ s0 i9 ~* U" u; }$ O
#include <stdio.h>
; _, o. t# }: i, _: t; G#include <unistd.h>. z* @; W1 n9 x' H$ X% F
#include <sys/mman.h>
' i. Q% d$ A% O' v0 S#include <sys/types.h>; b" q1 s0 d6 I4 Q, z. y
#include <fcntl.h>
* N6 U% i1 v7 ]* D1 X0 f& r; w( h A/ |& `' J5 Y! G6 Z L; I; ]
#define SHAER_RAM_BASE_ADDR (0x80000000)& n. R! D q- G$ E+ r! i
#define SHAER_RAM_SIZE (0x20000) 8 q/ Y3 T7 ^3 b% D
: E: a0 m4 A/ X
typedef struct+ N6 ?- h* E1 ~" _. ^( o
{1 p( L- G2 P% m: }( ?2 V: Q2 N
unsigned int a;! ^& I0 p' f/ C9 H
unsigned int b;6 ~4 t4 z: f) j( ^( h
unsigned int packet_cout;
# R1 d: I7 k8 c9 t2 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& h' M, x6 {7 R4 y5 w4 ]' G( Q' C R. Q3 J; H/ f, f! D- C4 l
void read_MSG_buffer(int *baseaddr);$ M9 ^% P. V6 f& u, W
unsigned int count_copy = 0;
: U% ?1 [% a) V, @% a/ @1 N2 i) E/ J, K# w) K6 c' ^9 B! K" R
int main(), r2 ^% I3 q7 e& K( @
{: Q/ a) K W, ?& n! f! A2 X
int fd;& F8 q' s/ P$ i+ v$ _! l6 M6 L/ b
int *mem = NULL;' V( `- }! K5 Q) b& H
8 a/ S* t/ X' S: _! y, H" [
if((fd = open("/dev/mem", O_RDWR)) <0), u# D! P0 @* n9 O9 a1 z
{9 W8 [ n7 m" A: e3 d# s& W
perror("open error");, ]* D- P) A% \
return -1;
6 b. `+ Y D. r7 L! P }
, |& G- ^" X$ {; h
& K/ i: h: M. e9 W' p4 u4 m- z: f" f mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 q! |* d9 p5 E9 z; E" |/ M. Q
* a; z& j7 G3 N- m while(1)
# c5 v# |- Y* E/ a {
" Y' o. K& ]3 B E4 G read_MSG_buffer(mem);
% {+ m* P9 ]3 ^ } $ `) }2 T' a# J: Y7 Q
}
( Y$ ^. S( Z: \% v I; W# ], v
' E/ C" d5 f1 u. l5 Y* wvoid read_MSG_buffer(int *baseaddr)
" }* u5 c0 P9 p* }" Q9 d{* V7 i7 K \' Z$ e5 T) O
pRX_MSG_PROTOCOL pshreRAM = NULL;
. `$ E3 F( G# _# h' J- S3 f' `8 ]
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 Y5 ^, Q- A; R& I
2 O, C' w7 _9 t2 B+ y
if(pshreRAM->packet_cout != count_copy)7 d; G$ q4 D$ R- k1 d. q, g( ^3 i
{
* W, k0 v" M# V& ?( x2 ? printf("a is %d\n", pshreRAM->a);
% z# p' i% v4 u printf("b is %d\n", pshreRAM->b);% M4 |+ i' v/ T. c9 A
printf("count is %d\n", pshreRAM->packet_cout);
1 r- V2 I! k" r! H& G' m, | count_copy = pshreRAM->packet_cout;
* w8 z5 G1 h2 o; \ }
1 f# m P, p+ I2 F else
1 K+ E5 `. ^( Z* s8 U {
2 y2 t; G# H# B1 ~) q printf("No effective message!\n");: d& ]1 \6 j+ t4 x- y* {6 S
}
- X0 r) o" \' X9 j) r; C u3 E# |6 `}% y! r2 G) t# }1 c7 c. Z7 _4 F
0 _, g0 r; T: J) \9 p0 L6 A* ^& I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; q: c( i& c2 y2 [' u/ F8 s( n" u5 n/ }' \6 ^7 g. R' U" d
7 f1 M' l7 `( P3 R$ U0 h
4 _! {4 ]! E* Z1 g9 W$ B7 p
1 C4 [$ {. f# Z9 @+ ~ |
|