|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 z# M/ y7 b/ T5 a7 h
+ J3 c- C' g' o0 h9 [2 xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 X, [( q- M, E
#include <unistd.h>/ I, X5 q4 M. C' d5 C: G# }
#include <sys/mman.h>
7 v: p9 V6 L- E6 G#include <sys/types.h>
J* L, }* R; q# h" g! q#include <fcntl.h>
2 O$ x( \, ]1 P
1 a$ X2 |2 F9 b5 i#define SHAER_RAM_BASE_ADDR (0x80000000) ! }8 R( k* e/ k6 A6 h5 `2 a
4 m) T$ n9 v, T' @
typedef struct' N- B% h# }; p; R
{
. j* r, y) @- O. E unsigned int a;
3 e/ O' O. N5 [& `& X k unsigned int b;+ O8 X8 X$ n# m/ t. z
unsigned int packet_cout;3 C0 S& s* c2 a5 r* u" M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ h( P, B/ |7 E/ l4 ^/ L
* z8 L/ G8 C2 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 N2 W; k: D" [; cunsigned int count_copy = 0;
4 O, j- O0 x# S1 [" W! H: r+ F
9 `( x. B8 X8 H0 c; H- T
9 h" W& ^( E: p4 l6 ]1 h3 Kint main()5 x) D# x/ o4 P
{
# I6 E% v1 x1 `, E: R pRX_MSG_PROTOCOL pshreRAM = NULL;0 E0 U5 Q" z8 r$ k& P3 w" v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' [9 f4 s. u3 c
/ ^9 c0 j0 Z @& f* g
while(1), p( O: ?$ x9 u, n+ z6 d0 J" K
{5 D/ J: y! h, B$ J/ F( Q/ O3 u
read_MSG_buffer(pshreRAM); G* T$ K- \) r. q9 I- A& X! {
}
) R" s3 ], e7 C. k& S3 {9 y0 F8 ?}; d) ]0 Z- O8 Q3 e k
5 {2 _( W5 @7 R1 a( P6 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); X7 \' c* T1 v8 @# @4 h: k& s9 s
{- S4 L( t$ Y- Q+ X9 D7 k0 q
RX_MSG_PROTOCOL buf;
# Z2 P2 U# d9 ]
& `9 ?0 E' b* a' C buf.a = pshreRAM->a;
$ x3 s& U% r/ c# T2 W2 x buf.b = pshreRAM->b;
' j% Y' O M$ D* ?7 y' ? buf.packet_cout = pshreRAM->packet_cout;
" d% J$ m6 t: R d" X$ M. i, m6 T1 Q h
if(buf.packet_cout != count_copy)0 E8 [& u/ {9 C/ S* B4 I' B
{- `) d6 C$ L3 h; e2 h9 G a
printf("a is %d\n", buf.a);
0 m* N- K* \# U$ Y5 A! N printf("b is %d\n", buf.b);6 @6 V5 l7 h ~3 \8 ^" M
printf("count is %d\n", buf.packet_cout);$ S3 o$ {7 R( q+ F1 n- E8 C: p# K5 z
count_copy = buf.packet_cout;
D- X+ ?. s# B! ~ }
* w P& r4 @: T else( |7 x2 f4 e _
{+ ^! D9 a" f6 I: [; T/ ]3 P$ V9 | f3 w
printf("No effective message!");/ a, m7 k2 a5 B( i. D, K# J k& V$ \
}
) P+ ~6 ]( \4 L1 _& }}7 e7 s$ A6 y5 Y, ]* D
- r8 x6 a k) y$ t7 h
/ ~" @3 {1 I2 k) L1 d P" U! b" \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 S" P# G$ ]5 ^5 _7 @5 M C0 U$ D使用下面代码,对内存使用了mmap函数后:
/ ]' G3 O3 @; b% Q#include <stdio.h>
6 V% ?: Y4 D4 Z) P0 r! k#include <unistd.h>
7 t: e. \% a- y% l#include <sys/mman.h>
9 g1 b9 l J$ }1 M2 q6 R" L$ D' j! w% Y#include <sys/types.h>6 G) z$ L7 p1 W" D% j
#include <fcntl.h>: a4 _4 i) O) p% W {6 E
: g5 I. j# J) V) h: T" |$ W#define SHAER_RAM_BASE_ADDR (0x80000000)
/ Q, X8 ?2 W# e' u/ U3 u#define SHAER_RAM_SIZE (0x20000) ' v: b) N) Q C$ K1 N- o% ]
; H( E" B) ]. |* R! }2 r& u2 J1 B9 p; Btypedef struct2 R6 B' h( K' W" e- q/ l0 e
{
4 v9 ~0 L) v/ Z- { unsigned int a;
8 N6 F! `+ T4 ]0 A# V unsigned int b;
6 }! ` K9 w; f unsigned int packet_cout;
( ]( N. Q U( l6 k4 L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 L/ Y3 F! w! U e
5 _: Z( b, m, ovoid read_MSG_buffer(int *baseaddr);0 J: o; i; Z. p: x5 v u
unsigned int count_copy = 0;
: L$ r: D4 e' X3 t1 F: e) E- |& k9 y
int main()0 \3 _6 {$ A' I4 b
{$ M& o# ^7 v2 \/ L& q- ?6 _& `7 L
int fd;
4 A c9 M+ _" Z3 S$ h; n2 {. ?) x int *mem = NULL;' c( k' N- P# Q/ R+ {+ _6 B% c5 C
- v$ W2 _6 h' S _2 U6 G if((fd = open("/dev/mem", O_RDWR)) <0): C# h+ n$ g4 M! C
{( L( i: ~2 \# T+ l- x6 O: k( g1 u: }; q6 ^
perror("open error");) E! e1 e% c( \1 C6 A
return -1;
& @: }0 Y0 G! D2 O% w( M1 Q% a% ] }. z0 ?# m( u" p) R [1 s2 s T$ F
8 l1 B7 u- I0 Z9 G- x/ a, ^3 c$ D mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 d: l3 g( E5 e: p' |" V+ R; X
) ]- v& V. ]2 F8 M. _. T9 {7 H
while(1)
* `0 r3 k3 K" E0 k$ j( C& e9 w {% K0 u- C' }; z5 g
read_MSG_buffer(mem);0 _& Q# Z7 n1 \( d( }, y
} I" Z; j4 b. T' Y7 [. k) L
}& J) k4 G, R, ~% h# n
p! L5 ]% g4 ~# x4 K/ A1 h0 Dvoid read_MSG_buffer(int *baseaddr)" I6 i: r8 K7 n; {9 @
{9 H* x7 q" p& {( O
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ G V& H; O1 v: t
+ {! j- H# [& w7 e; }6 D1 B pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ _" X* V( m3 y
$ G1 o$ ]- p7 n; w1 Y2 t0 I7 Y if(pshreRAM->packet_cout != count_copy)
, w7 v+ _/ U& @1 W- m {9 s$ I8 {# Z S+ U0 F1 O) ~ X
printf("a is %d\n", pshreRAM->a);
- ~2 x0 T' B' p. [4 s7 m printf("b is %d\n", pshreRAM->b);7 [. F( P( a. ?& n% T/ }& g, D
printf("count is %d\n", pshreRAM->packet_cout);: e) a1 n$ }) R- l& t
count_copy = pshreRAM->packet_cout;
4 P7 `+ r( U5 g$ C4 w. V2 N }
0 p5 R- R5 k8 A" }, @8 I/ K) r else9 k& i! j" T5 U
{6 r2 ]7 U: S; R; L
printf("No effective message!\n");
7 h! A+ A- _0 e) v. Y5 d3 u/ n }
) Z" H/ _7 a( m( P [1 u}* ~' d! @4 N4 q/ W! I
0 D! ^/ W# Y" g* }& A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- S9 M* ?7 E( _: I% {
4 |, @5 ^- a, p, M/ w* N9 R% y8 b; I" r- n& p; p, \* q0 O
8 q* j( d7 Z" }. B- Z! }/ X$ J
{/ E0 n3 w3 j
|
|