|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, \ M( G6 O; v5 }7 V0 f( a
4 X9 Z' B$ C+ v' ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- L5 I& l3 c6 |% l& N& v& v#include <unistd.h>
8 @- G3 ~8 i5 g1 }2 `#include <sys/mman.h>
; @$ `2 H) w$ q* _#include <sys/types.h> n1 b* S* n; G
#include <fcntl.h>
0 n# q. m0 b% _7 Q8 `; n$ _4 c _2 u# i) m
#define SHAER_RAM_BASE_ADDR (0x80000000) . f/ {2 i5 G' X7 f6 p0 ?
/ k! j7 M* N+ D- F3 J
typedef struct2 E7 O6 n# k- W) y0 U
{
1 R/ p0 E% a, R# F! Y unsigned int a;. x' B6 @8 q; |" [
unsigned int b;
5 h6 x# K5 g9 v' ?. G4 r7 ? unsigned int packet_cout;6 ~# g$ w& Y) F3 {, ^* @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. t i/ m* l* s1 }5 ], ?+ ?3 w; j( o! W8 Q$ a) a. r; `* c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: Q3 _) h, c* F! a! S* Punsigned int count_copy = 0;8 j7 _1 \ E6 H
5 ~/ J$ x: o8 o- w5 b
7 y8 c8 ?7 m* ^int main(): I3 L! q1 K; K/ W
{
$ H, P, n4 v3 C+ i- ^, \" D8 ] pRX_MSG_PROTOCOL pshreRAM = NULL;
8 r$ Q0 o; J0 Z; n/ l pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ M1 q$ O8 G- @
E4 f! h; x& h7 e2 W
while(1)
$ {+ D# `) K' H& T o) C {
0 n) C3 r. }/ w read_MSG_buffer(pshreRAM);/ S6 P7 u, i" \* L
}
0 M" l& W" h- l/ Z: \ k}- B9 @' r& u$ i5 _
4 _/ d! U5 l% zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 g8 a# E \' E{
* m: G, e! i/ u0 ]. F. F f RX_MSG_PROTOCOL buf;
- Z0 O4 [1 e1 p8 { 0 n+ k! | x8 i6 l
buf.a = pshreRAM->a;
# H: H% A7 `2 @ buf.b = pshreRAM->b;6 c- q. J$ w/ |2 M4 @
buf.packet_cout = pshreRAM->packet_cout;
' g$ k Z2 N% v& a6 g- d" | 7 T u4 ^2 L! R% G* O5 {
if(buf.packet_cout != count_copy)
/ P3 Y8 }0 W( m9 Y$ D1 X( u1 s {
9 a: B& g- ?' _7 S' ^6 i/ \. \ g; E printf("a is %d\n", buf.a);' S/ @8 s8 t1 H/ s, {
printf("b is %d\n", buf.b);
4 j0 c' n6 |& t! h' ] I printf("count is %d\n", buf.packet_cout);) m( H2 k8 ]+ D
count_copy = buf.packet_cout;9 p( O+ j* R; _: Y2 c" K& ~8 Q
}3 C/ o: ^& a# f" b/ v6 J
else, h( j& X. L8 b8 |% L! m3 ~
{
3 g j2 l/ V& W" B! `* l* Y printf("No effective message!");; }& h& t+ i! [4 ~ @; C
}
# L- t# y! ]- F% L}+ S( a( N4 ?, P2 T1 ?% y
0 F6 h- u2 P; u& {( j N- N' W# m5 Y7 F! F0 f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 @) y" \4 L9 G0 H/ t2 A
使用下面代码,对内存使用了mmap函数后:
2 F! F9 W0 v3 I \) U#include <stdio.h>7 m) ^/ E+ h/ i7 q" e3 J: N
#include <unistd.h>
- f* C" ]8 l* B1 u#include <sys/mman.h>7 \" l( J0 q/ S! n, r; c8 P* t
#include <sys/types.h>
6 q% ^+ k# w/ u* ?8 ?8 L#include <fcntl.h>
! ^: p* ~: w/ O3 k# i! t* \" |. ?) V+ T, ]% [2 G& C4 w6 E* b
#define SHAER_RAM_BASE_ADDR (0x80000000)
) Z* }( a5 B b8 Y: G#define SHAER_RAM_SIZE (0x20000) $ D' x5 I+ H! ^5 ~* _7 w8 b1 w4 ?
6 u' M9 q- c* W7 [, W! z% ?typedef struct
9 x3 ?: Y: r3 K. Y0 K{; G8 b0 @9 f+ J5 M& h
unsigned int a;
. l, j" h& e5 |. d$ |% k7 U( @ unsigned int b;
1 O$ u" k! r3 ]7 q) s* I, S$ n' R unsigned int packet_cout;9 I% d( Z( \7 i* [& \. n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& r, x( J- O$ @. Y% W8 ?
: Y* S" m) O4 d5 y. }% ?( g* Avoid read_MSG_buffer(int *baseaddr);
. x' d, K+ j8 P- munsigned int count_copy = 0;
4 E' q' n( ~% J0 T) L8 e# ]( \% T# ?1 F, v- C
int main()$ ~- t7 ~' D% r- r1 h8 b
{
- C; g Y3 ~9 n% O int fd;
1 k, L( g# {( U int *mem = NULL;
' Q5 ]8 A( D/ h1 ]8 w
$ R, j, i: D6 M" C/ ?) t7 S' D if((fd = open("/dev/mem", O_RDWR)) <0)
7 c1 W0 G) b* ]/ e; A" y. h {' @4 A+ d/ o0 F' p5 L
perror("open error");( j- i* Y+ Q. W6 X
return -1; R6 D6 q6 Q0 h) a8 e
}
. f: [- I T& B' R ?' c( |( N: d0 z1 {; G* D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 a% Y* ?' w) x. }& r+ w1 g
9 p, _ \* k6 P( B while(1)3 d" ^8 ~8 f: v# K d$ D3 h
{$ v8 d% z2 O* W$ H
read_MSG_buffer(mem);9 k4 O! l" }( n2 j0 k
} ) _4 d7 |" F: l7 V4 F; y4 k& |
} t. M" z8 E. F( F1 k
* s6 h5 i1 \5 Q* {; mvoid read_MSG_buffer(int *baseaddr); t# b/ X) x' K' f/ R4 e/ o
{ L Q- b7 a0 b: q
pRX_MSG_PROTOCOL pshreRAM = NULL;$ x+ r; H: m3 P
- v7 v* ?( }3 G$ D- r; w( E pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% j9 ~" E4 I) X) C3 T+ A
7 o: C; W% n7 Q/ [0 C0 G if(pshreRAM->packet_cout != count_copy)9 S# w/ I. F. V& O/ C7 j+ q2 @7 u
{% V: l5 q8 i' b' ]+ h, @
printf("a is %d\n", pshreRAM->a);
# p! E' v) F. }% S5 q printf("b is %d\n", pshreRAM->b); }- Q: F }6 F9 [- r/ a1 w! B
printf("count is %d\n", pshreRAM->packet_cout);
9 F3 m: v @" a0 U count_copy = pshreRAM->packet_cout;
& b/ F: m- P5 ^6 [ }& p5 _9 L; y, ^3 H8 P% ~0 w9 P
else4 O1 x5 M2 k1 |. M4 t- U7 d8 S
{
5 C7 l ]" ?; ?/ y7 x# b; r printf("No effective message!\n");8 Y( I; J# H- b G
}
. C- \8 }" |5 W5 v! a( u' D}, q. W$ e3 r) g6 J
! P. Z& `+ I, ]1 V; G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ x* {' b! o8 I. C& v% p, d6 Q/ b& d! y
" N0 b5 W& [2 F: R y6 V7 Z! h- j
* r" f$ j/ c W! S |
|