|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 ~+ e" f6 _1 H) s5 M# U% t/ l# ~
% \* T4 i5 e! L+ d+ ?5 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 h8 S( @% g h3 q* n9 w9 [( W#include <unistd.h>9 x% Z& u: R1 f) Y4 G
#include <sys/mman.h>
' e+ B J8 D& r3 w. x#include <sys/types.h>& t8 Z9 U" d( u: [0 w
#include <fcntl.h>
+ k$ k9 I, e I
, R0 ?" }- c5 P7 }2 u) x9 x#define SHAER_RAM_BASE_ADDR (0x80000000) % t! N# u8 j+ s1 ]) A
7 c" [& A8 ^2 q2 C2 itypedef struct
8 a: F4 s" u' ]" y2 s+ `{6 \) j% `9 m- T' x) l
unsigned int a; o1 s. ?; P2 Q j2 \7 j
unsigned int b;0 `% x% ?: B1 Q( n0 I
unsigned int packet_cout;- ~- Q8 C. v. b. n; u! Y3 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 m" |' o% V; }; p
2 b% W9 z6 j# Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 W( g4 B P$ m; D; c
unsigned int count_copy = 0;- H: S3 | }% Y& d7 T
/ t x4 h$ v, W+ s# f5 @$ l: C/ ~% F0 g* _) ]
int main(); ?9 _4 p3 p0 _+ K# K
{
6 }! ~; J* l) o( f( K pRX_MSG_PROTOCOL pshreRAM = NULL;' J% J" l. }. H
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 ?6 ~* }$ X0 ~3 T6 E9 F! O7 @1 v" |' x1 e. R+ s
while(1)
4 Q; P( Q9 I* x) p1 L+ |7 |$ A {2 m( G' t% s$ d
read_MSG_buffer(pshreRAM);
5 W3 Y! B. c" e: n) A! W i C: d } # }' j0 }; I8 ]- W$ ~
}4 Y6 H" ]7 F/ n3 Z+ q
% K9 L/ Z9 h& q# p- ^' _& H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 v6 ]& ?% l4 b. W- x9 ]
{9 U3 r* c) L& J7 a3 L
RX_MSG_PROTOCOL buf;% [( @5 _0 C' C5 p- x
+ t5 b, ^3 r. Y9 l: N
buf.a = pshreRAM->a;
5 T+ X6 E; y% i' @, C0 ? buf.b = pshreRAM->b;9 @' ~- E% h1 n0 m% t8 [6 C2 k5 M8 B
buf.packet_cout = pshreRAM->packet_cout;* L. S- o- r" L! \% x9 L) B
& q9 C; c; Z9 p1 o, N% [% J5 |0 R if(buf.packet_cout != count_copy)1 ?, ~, Z, n+ H- J n
{
) a: P5 ]4 y8 x( l! B8 ~ printf("a is %d\n", buf.a);3 B/ Z: e! ^' M/ a$ H5 e) l3 A
printf("b is %d\n", buf.b);; X6 N% |, u, h& I& M/ K
printf("count is %d\n", buf.packet_cout);
- i4 Q& O% ?% r; y count_copy = buf.packet_cout;. s2 ?& B4 M K+ L8 C; p! f- W
}
1 F: T, }( B& ^ z _3 ?) ` else# B" z, a- t2 u# q5 _
{7 l$ I6 M1 ]7 s. H: C1 v( |: \4 h
printf("No effective message!");9 Y! p* {' [3 e1 P6 n
}
9 _6 ?5 W* a# L! }3 k} W' c" A& v$ d; A3 v( {
/ D& U0 w" R8 M/ s- {4 r* w
% { W7 o) X- b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# k5 e1 _3 Q. n W9 Z8 t# s' p
使用下面代码,对内存使用了mmap函数后:# F8 B, v3 P. _( U. f! e
#include <stdio.h>
6 h: d1 ~, @, s( e#include <unistd.h>, q3 g3 F4 ?! X, j8 W5 j
#include <sys/mman.h>; W ~7 n) T* B
#include <sys/types.h>
3 m/ h" T7 y2 X r5 |" L( z#include <fcntl.h>- l1 o3 Z2 x( B3 L- o' S& _, F# q6 s
* b' m! m' m A7 Z% S#define SHAER_RAM_BASE_ADDR (0x80000000)$ H1 z$ X+ Z8 Q: M0 B |; ^
#define SHAER_RAM_SIZE (0x20000) : w' F5 G8 r# m7 V9 U5 B5 P
0 K# V7 B9 X7 [9 a5 f5 Mtypedef struct
" s% z. _" Y4 _/ Q{
; p6 ~) s& F- R j. U; _" F/ Z7 m unsigned int a;
$ M8 y+ S8 d) M) \6 } unsigned int b;/ k2 U0 n) `7 ~
unsigned int packet_cout;
Z J9 C- P4 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 A2 W- A: A* g1 D( Z4 \7 G
# o2 `8 @0 A* @8 |void read_MSG_buffer(int *baseaddr);
$ j$ l& Q! S4 j& gunsigned int count_copy = 0;8 H" G9 j, ~, y3 k/ j5 k; M
% f2 N3 j, ], h: _
int main()7 e2 f i# D$ s/ d
{2 @& _6 u1 e& Q( f7 W- H
int fd;0 p3 `9 n$ R: l6 m9 B
int *mem = NULL;( B4 S5 g2 p6 q# a6 o. ?
: {! _$ v# U9 m% M4 C' i if((fd = open("/dev/mem", O_RDWR)) <0)0 E: E' {, J; e! m S! q- _0 `
{9 E; y& X2 d, \1 B
perror("open error");
% Y. ^/ ]# j5 w; f return -1;, k- D! Q0 ^! |) s
}
2 p& F+ X @2 V2 W$ J4 o& A
: x8 e2 L4 X0 U2 p g7 _3 W3 p! O mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 M/ a: H' m: i2 a# h& X% I: P
& ~2 u, O( Q% v5 p' J1 z8 W
while(1)
7 {8 h1 F) r% q+ Q% c {
( J5 D; D, k$ p- D7 [9 A read_MSG_buffer(mem);
1 J1 Z: D6 s' ^9 e5 _$ [ } $ C$ a% _3 }# o ~( o# n0 k
}
& l. k! \" h0 H1 X5 l6 ^& w) c( [, C& x& R) U4 N
void read_MSG_buffer(int *baseaddr) p" m: j0 I" V3 ]* y* y# f
{) W+ }0 s* Y( L4 ~
pRX_MSG_PROTOCOL pshreRAM = NULL;9 U; @+ V% a* K/ z, S
9 V3 W1 e6 S: o# q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# Z/ n% U& @1 D1 p# k, A) u. H
' H$ N+ c: U. H, D3 f if(pshreRAM->packet_cout != count_copy)
' r* R) e( E8 u1 o9 X$ B {$ w7 N1 g& |9 m7 e4 k$ k* t
printf("a is %d\n", pshreRAM->a);: L7 g# W" `2 J, p6 K
printf("b is %d\n", pshreRAM->b);9 B' O9 e6 S! j G: c$ s6 G' m7 q
printf("count is %d\n", pshreRAM->packet_cout);$ Z# O& {$ b- e, X6 z G; S' p e
count_copy = pshreRAM->packet_cout;$ l9 C; l* m% Z$ ]; `5 D4 E& Y3 n
}1 w# f1 f6 o5 Y) c
else- x5 K% y7 x) p j4 ~& @
{
2 Z& A4 h$ U% N5 x$ } printf("No effective message!\n");
6 `- r8 _0 b9 }/ Z4 n }7 E/ q3 g6 r; _( w# I
}3 g' m, Z# i8 Y# ?& k
" w5 y+ Q Z0 {. ? q9 Q8 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 k" `$ Z! X! O9 n( |; `% f. O
1 S0 |8 L5 \6 R$ P" q8 D
9 \& c5 r0 U$ j) ?6 u- Y! Y
, E, J4 c8 l8 y, [: ?9 \7 V* K5 ~ i- [
|
|