|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / n- M" t, }# B
: {" Z1 G; j7 x! v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; l& v* B2 r, y) x# j% _#include <unistd.h>
K0 F: \& h: e1 @- X#include <sys/mman.h>
6 o4 f, {& k8 {# G4 i/ q N#include <sys/types.h>, u7 d$ W s3 b$ T8 l: A
#include <fcntl.h>6 N. M: Y% K; N" g% G4 e2 g6 l
/ j0 t. V* ~# h5 M o% r
#define SHAER_RAM_BASE_ADDR (0x80000000) $ F j4 m$ d- Z7 B
- E/ Q) T/ P" L/ z# q) O9 M
typedef struct
6 B$ c% s! a2 V) R! q3 N& @( s{
; X9 E0 C- A( _* r. n+ Y" L unsigned int a;; N4 ?+ d6 S, i
unsigned int b; z. m0 X( k4 ]& p) I" f4 A/ G' A
unsigned int packet_cout;
6 I! x8 i5 k3 K' Y* @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 _) \( J) i* x, }! M6 A
3 E( R" w. O$ @" X6 h2 ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* N% i" L T: C; d1 k
unsigned int count_copy = 0;! C" o( n* n) o1 a+ K9 ]
0 L& i( A. }! V3 \% Y1 y+ P: i
: r/ G6 T3 b2 U$ J" _# a1 pint main()5 V& P; q# Z. B5 N. a- h
{
+ S% P3 ?4 J2 m) `7 G0 s9 h pRX_MSG_PROTOCOL pshreRAM = NULL;
2 C5 s( Q9 P) ], l a9 { pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 C6 r: s9 a5 X
" M2 v7 j. h8 d5 ^, b
while(1)5 x" U+ z5 }% o7 Q5 q: R! I
{
7 j0 r/ o# B5 a7 H* J7 U read_MSG_buffer(pshreRAM); w+ ]% U! B' S
} 7 X( Y3 q+ X; g* b3 ^& x! i
}
- p9 s+ F7 j4 K) Q
+ ]) ]) v3 {$ c1 P. N @0 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) T5 c3 y: s5 P2 i{
~/ N9 |' |7 O+ E' g RX_MSG_PROTOCOL buf;' ?# s2 m1 G4 l6 @2 R
( i% }8 _% B) }* v& z; E% v
buf.a = pshreRAM->a;# I) N& t$ z! U0 i
buf.b = pshreRAM->b;
! d4 C0 G- f) A, U7 P: H buf.packet_cout = pshreRAM->packet_cout;) B0 e, \5 ?& i! J! w' J9 W
. C1 m/ H8 r' T# O6 {6 J; k8 Q if(buf.packet_cout != count_copy)' o2 [8 j. X/ V5 P' S( z, ?' v- D
{
) i U) T$ ^# o1 c3 \! f printf("a is %d\n", buf.a);
0 S* t6 s& _, g8 [ m printf("b is %d\n", buf.b);1 j3 x7 e. E, V5 u0 A
printf("count is %d\n", buf.packet_cout);1 z5 ^/ c# v; `! T0 _7 j/ [5 X
count_copy = buf.packet_cout;
, |" N) A- |% [: I$ \ } Y+ d$ h) V( T; [9 U- j
else" E" W# s: o9 n4 W) M
{4 x+ k- Z8 a E* F; \
printf("No effective message!");% l8 c# \# h; H/ I
}$ d, c- h" @* _$ {! @& J
}
- }2 ^5 W& [! l" ~
$ g! s. Z' d* w+ ~$ H, |/ Z) Q/ l7 ~/ p" \% f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" ?6 g6 o: P; Z0 g, I5 L使用下面代码,对内存使用了mmap函数后:
, Q1 y9 r7 o9 u5 i- U1 @5 {* f#include <stdio.h>, y2 f! B! d8 p$ Y
#include <unistd.h>
4 x3 [% C' g3 k% p, t) r#include <sys/mman.h>+ v% s1 X+ r# S1 p
#include <sys/types.h>- q w* u- @* E2 j# \4 F
#include <fcntl.h># Z6 U% K( v6 W3 z5 T
( U3 g0 a2 c# ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
) I! {8 c) @1 J& R#define SHAER_RAM_SIZE (0x20000) ( v! `9 W/ M8 c( }3 L6 R
) j. Q/ f) a& H. H# x* {2 M# q
typedef struct* F: [4 m( E0 a! V9 P
{
* t* [0 G+ @4 W+ a! w4 P$ y2 o3 c unsigned int a;1 _* F3 z4 T( `+ Z* l0 p" b
unsigned int b;) a a1 O9 W3 ~+ X+ _
unsigned int packet_cout;
6 E. f, i: e- j/ x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. J/ O9 I* s/ m: S! I, e
6 D( t$ O8 }+ a# D/ Lvoid read_MSG_buffer(int *baseaddr);
$ I. U; D1 {# N, D+ U- D! `# K2 m% zunsigned int count_copy = 0;
* m9 x- q+ c4 A, c6 r) A! m9 V% A; K) r. ]* h$ z% p
int main()7 z* B* u0 g9 i" _5 e" p2 l0 |
{, T" w4 b5 A. ~
int fd;
( z' j0 g" G# {1 _& I3 V% h int *mem = NULL;& b' z+ G$ ]0 D Q1 I7 d) u
4 Q" ~0 R5 q# @5 i: w: x7 C% y if((fd = open("/dev/mem", O_RDWR)) <0): [ t! L1 w' T# G4 y$ @
{7 I7 J" q& U5 M9 t$ o) @( J# m9 H
perror("open error");4 @& ~: R% d" W, Q5 T
return -1;* O) B" C) D2 D2 K
}
4 @1 q& V6 `# H- }; g9 a4 M * n+ a* R' k8 E8 W: J! d9 ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) ^. L8 O, c2 t
2 `6 t5 V0 m& n5 L6 K& t" E$ } while(1)' P. B& M" i& I0 s3 y3 S5 |1 ]
{& W/ R: j3 h3 I/ L; C9 h5 r. ^
read_MSG_buffer(mem);
' |2 x, }; s4 T# w- J8 U }
5 o" _4 }% H9 Z}
; ^* S5 J! G j# O0 b0 n
- H+ a/ I9 N& u K/ f& a( }void read_MSG_buffer(int *baseaddr)
* s0 T, l( b: p{
/ e- _7 w: C2 y pRX_MSG_PROTOCOL pshreRAM = NULL;
+ H" H4 y. z3 d) ]- t7 b/ ]; I, i8 E. p
: r9 J; n- y+ g) ~/ p+ [8 o7 K+ j/ Y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 O; @0 X" Z2 ~8 n. Q3 ~3 d6 X2 K/ x4 c1 ?4 b0 t
if(pshreRAM->packet_cout != count_copy)
4 _* |) u5 k9 y( \ {
( ]! E u. A# T; G- ]( q+ V printf("a is %d\n", pshreRAM->a);+ f! ~1 |) V! M! y: B
printf("b is %d\n", pshreRAM->b);
6 e/ ^5 {9 H( b8 h printf("count is %d\n", pshreRAM->packet_cout);
' j4 o7 s$ b; P7 g( f$ K i( w count_copy = pshreRAM->packet_cout;
; h ~. R2 @0 A7 p- j* s" ]0 v6 x* ] }
5 B9 m2 V( s! I* O" U else
7 Y7 b" m/ P6 c: @ K! U/ o {" Z7 F" S$ c$ C7 t3 B, A' l
printf("No effective message!\n");) p. H8 l6 F' L' Q; E
}0 q. z4 n3 n9 l+ D) D7 Z' N
}
# J7 R: \. H9 q. j$ t9 j: w0 e' q. {+ U) t; H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ h3 B3 n. Z6 c9 C& z% n
9 U) ?# P$ r! I' p1 f% D
( `) V* H% U% h7 G% R2 q: c- k
- [2 @1 T& a% {' q' e# ^* \4 `. l4 t* x8 C+ P
|
|