|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ [: @6 K1 t$ j$ ~
+ z C& U3 ^! j2 b) A( xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, h0 ` [5 F0 P, q g, W! @#include <unistd.h>
- p L& u& s. K7 j+ V! G#include <sys/mman.h>9 d4 B. ^% h8 `* W5 s$ J$ J
#include <sys/types.h>
1 z# X# b) ?+ }- v: O#include <fcntl.h>5 K: J# s+ [/ A8 u) @# @6 M* X( E
; @! R$ p: w2 a- @( @! P- X3 E#define SHAER_RAM_BASE_ADDR (0x80000000)
& k0 P6 f8 X* F8 f/ Q* E) ]: T5 V+ F, ~% a ]" i2 W
typedef struct) ?+ o: e, }/ S1 \
{% e+ i5 _3 ~$ n9 f: H" N
unsigned int a;( v$ n: [! m: P% K7 n9 E- F
unsigned int b;
2 m% z2 w0 H, l unsigned int packet_cout;( e [+ H9 J5 P1 \% i& d; K% a, N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 u, d/ Y e: `8 b
+ \+ A7 W. z4 d! M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ w+ Y, o7 @2 @( n( t7 cunsigned int count_copy = 0;) L' ?- A, k; Z% s4 W: ]) N
2 B& [9 O; V( `+ {( \0 r2 V
4 y- ]2 o, Y! oint main()% k: `+ f/ l$ I% G
{0 ` D; H8 Y- g" |1 ], e8 g7 y
pRX_MSG_PROTOCOL pshreRAM = NULL;8 G- Q* q: C# |8 m% b
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
h& e7 _& [9 q/ \
! {1 p8 M# T. m: B9 L# }3 v' [* x- i while(1)
# @1 B" B2 _5 B' m {: o+ m) P6 k9 I7 i
read_MSG_buffer(pshreRAM);
M, I% h8 G7 U) t9 |! t }
9 J! h' j( M# v}
/ S2 a+ m1 q2 b' E6 \ k) _# t6 x u+ U5 N; p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 `* S" P( ?0 q6 M# t{/ S( T3 ], ~3 B i+ S
RX_MSG_PROTOCOL buf;
! H: G7 s6 t* a; A) | / d5 s. S& T8 w4 [* m$ o: Z
buf.a = pshreRAM->a;5 y Y7 f: O: |4 b9 ]4 v/ f
buf.b = pshreRAM->b;
/ K) Z5 z4 x# m( e* v buf.packet_cout = pshreRAM->packet_cout;7 h2 c: x7 f8 i! w4 {+ B. t7 e1 g
3 K+ c; H: ^) U5 u
if(buf.packet_cout != count_copy)
7 @4 K, M4 P: S/ [7 z& ?( _ {
# S- J% F3 f) {. X( g printf("a is %d\n", buf.a);( w" t* x( Z4 N: j
printf("b is %d\n", buf.b); b5 L) v) p$ o( B4 d
printf("count is %d\n", buf.packet_cout);. N5 n' E9 }9 t5 C K- l8 k
count_copy = buf.packet_cout;
$ P N8 N' w" [" ?9 G$ z }
0 W5 j3 U# H' u+ q2 H7 G3 T else" V9 y4 a/ s. y( x
{% R7 V$ s7 N9 o
printf("No effective message!");' T" u% J* m9 c. m
}- ~$ a# x5 F; O. P' T
}
- ?( N- n& m& q6 r2 n- h, x' M4 r5 z/ J5 z L6 v
& r; f/ m" x# J, Q+ B9 l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) P/ z: T! H G9 d' W. l) M" h
使用下面代码,对内存使用了mmap函数后:+ c( x3 _; ^9 k+ O1 \: s- X
#include <stdio.h># W* d4 \9 ?; G5 v I
#include <unistd.h>" t4 ]8 @8 [8 @
#include <sys/mman.h>
/ j$ T) u9 a5 ] r2 `#include <sys/types.h>% p# K$ j3 T- U. K4 D
#include <fcntl.h>0 s8 A3 q* u: y# N8 }5 g# n
2 Y! z5 ?. Y, g( A* b* N# p
#define SHAER_RAM_BASE_ADDR (0x80000000)2 A4 L' q0 J! _; |
#define SHAER_RAM_SIZE (0x20000)
. r5 C. Q. p7 U9 }$ H
4 M5 [6 G) w; Ptypedef struct; {7 D0 [: Z8 h" e+ k# r2 @
{) C3 N! W/ u# y+ t9 S
unsigned int a;! A& U. q% x4 g' k, \. |% E
unsigned int b;
3 t# q0 n7 a1 P( Y3 F4 H7 x1 P unsigned int packet_cout;
8 F' j1 h: B5 r( J' |5 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( g0 y. a3 d: j' R& }. N
7 C. G& n3 ?0 ]# `7 k8 j
void read_MSG_buffer(int *baseaddr);
x0 l; |& u( y/ }unsigned int count_copy = 0;6 d; j% s9 D, [ p
& K3 f3 Q- m+ S( l; }int main()+ _( m- P4 {7 m
{6 k5 k, ]7 X+ \4 P
int fd;4 r: q# J! t* O! M4 ^& m
int *mem = NULL;3 ]# [1 v$ x5 y' _9 m/ \+ Z9 K
. H9 V) A2 N" g$ |( z) K
if((fd = open("/dev/mem", O_RDWR)) <0)
# G# S% G( m) D3 H { D, d3 n* s" U4 R- [/ L
perror("open error");) U7 D7 r% [( H
return -1;
8 d r/ c$ S) _& S0 S( O% o7 | }
7 w L9 s1 K# D- ?/ j8 F6 V 3 Q" C' Y8 {" n: [2 K0 _
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ m' G k& w/ O8 u
3 [4 p) h! F( l; R# h- t6 x" u1 k while(1)
# ^& c8 m' g# R {
9 m1 [3 _- C% X3 c% [. E# v read_MSG_buffer(mem);
! ^2 Q& N& `* u5 `, E( r; Z+ R5 ~8 E }
! @7 |, Q) h* q}
) I l2 g/ m7 B: N5 F& Y3 D7 E
) k8 S/ B% e! cvoid read_MSG_buffer(int *baseaddr)
3 w" j! A& @, e7 ^{4 {9 H7 C$ U- ]: }* \" x
pRX_MSG_PROTOCOL pshreRAM = NULL;
' p$ u0 l$ M$ ~' v |
# y6 f1 e9 I9 L8 h; K pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 Z t1 R2 ]. k9 r, |
# w9 y: k# r4 x; x6 L if(pshreRAM->packet_cout != count_copy)1 X$ _/ x' C: f
{
( o% R9 M" Q4 U! S+ q9 S printf("a is %d\n", pshreRAM->a);0 I) v- |8 w- e! p) }! A
printf("b is %d\n", pshreRAM->b);# w; K4 P! G0 w. A5 I1 P- Y
printf("count is %d\n", pshreRAM->packet_cout);: L t/ o# h/ l' T1 p1 X
count_copy = pshreRAM->packet_cout;" E0 m. E1 X! p
}
9 V1 ]( n4 ]* m9 v7 _1 j else
3 O; K8 Q( U% ]6 i- d {
1 o0 ]8 t# F3 x) L3 d printf("No effective message!\n");
! f/ d/ `6 b, O) A2 X' N8 T8 q* f+ u }$ L* }+ z! F) J, J6 } _
}1 {9 p& k9 G/ K& L2 u3 b
7 ^9 q/ m, P1 C0 A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% q4 f: |4 B. P& G$ q
5 C+ m# t* T. ^4 C l9 ?
6 m! y/ |/ I$ r a7 J8 n
/ S% G6 @- [* Z+ L9 k) F
) R2 G* _) a& D B; ^) V' H |
|