|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, ^' D1 `' `' n6 j& g0 k: [% z {) d" t) k- Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. R7 e" v \" m( L#include <unistd.h>
4 ^# S: c. Q+ K0 }#include <sys/mman.h>+ }$ W Z! j/ h, L# H2 z! O9 U
#include <sys/types.h>: L, k3 r f3 C$ G$ q5 H
#include <fcntl.h>
0 p. W* V7 V! f) l) J% V
' s& X2 a4 B5 e' \#define SHAER_RAM_BASE_ADDR (0x80000000) . J/ s1 h; ]- ] G
& p( {: D7 C( ^: N2 _# @
typedef struct
+ }! [6 t* M) H{4 k: N0 ^4 s d! y) v0 [
unsigned int a;/ t5 W6 Y% N0 _' [# Q
unsigned int b;+ f# i _: F$ e. O2 s/ P
unsigned int packet_cout;1 m) H. [3 V1 v; J+ q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ k! h( q. X1 }" Q% \: T
1 H: W* A% ] T% ^9 |+ m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' G/ j- l( K9 {# runsigned int count_copy = 0;
- d* z' a4 M0 x# Y6 X( ]9 z$ p- a, _8 R, V) G8 r G. l' r* P
5 N* E" Z( z) D
int main()* x( Y7 q/ @% x* D+ V' o7 _& d8 v1 V; n
{) l5 b" [9 O* K
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 y) B$ G' x4 ? pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 L' v: U6 |5 S( Y) \7 d7 d& W& r. Q) A
while(1)
1 C* I( H: d5 E& O' R; C- V {+ a) _' J/ G4 B6 ^9 K9 Q% a7 g% l
read_MSG_buffer(pshreRAM);
: @6 p9 {! {. P1 J) x- `% K& H) M" `% m } $ J% N J; [/ s% h% V+ k! W
}- w0 E$ H4 y- ?, P
' p# B. G5 P& S, Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! B' [$ u: O! h1 b( p2 G2 k{
" R- c/ B+ ^! { RX_MSG_PROTOCOL buf;3 { S; @1 [+ z
: y' ]9 N, R3 S: f5 j
buf.a = pshreRAM->a;
4 J! R1 B6 L% I2 v6 n buf.b = pshreRAM->b;: v5 Q1 f: L( A+ \, [2 k
buf.packet_cout = pshreRAM->packet_cout;
9 U7 V2 K' T9 W7 G; I N1 k5 P( K4 O
4 o9 f A3 V$ e O4 x if(buf.packet_cout != count_copy)
) ^( r% u. h% j- R {" `9 {$ O; a; z1 x+ m4 H' c; L
printf("a is %d\n", buf.a);
% Q1 O) c6 q: n printf("b is %d\n", buf.b);( Q2 n# g" H3 M) |, w* a# @% I
printf("count is %d\n", buf.packet_cout);
& y6 p5 i/ N9 b4 O9 [* T) v$ N count_copy = buf.packet_cout;
% F a" P8 j8 Z1 H }
; G" q' a+ @* A, j5 ?- Q9 R' x, }0 \ else& U6 v$ ~+ \" d; J# W
{4 A, }' j/ @+ K' L" d- V
printf("No effective message!");$ c; ]) e" p' f$ j9 H
}8 c7 }, U( d; K' G2 R$ k# J
}
. m" }+ O0 W' O! _
: c7 E& ]( t, D/ T
3 N* Q" a: S- e$ I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 i' \' }" J9 A3 m: O
使用下面代码,对内存使用了mmap函数后:7 a7 ?% ]5 Q* J: w7 R' b- q
#include <stdio.h>
* A6 j" e$ R* i @#include <unistd.h>
% Y( a6 R- |; Z( z9 |& w& @#include <sys/mman.h>, ^: i" l" A& k& n: A6 I
#include <sys/types.h>
6 E% T1 D& w, `% ]2 P#include <fcntl.h>
0 C- w8 a Z$ j) u9 ~( m9 a' o1 v3 ~% u6 D# d( {
#define SHAER_RAM_BASE_ADDR (0x80000000)) [7 b- N7 _ g0 L( I2 k
#define SHAER_RAM_SIZE (0x20000)
( M4 u' J3 b! v* I" Q* x5 i4 ~
! D6 J1 C2 e( x- Mtypedef struct9 {, I6 S3 |. a) g4 J- B% z& w
{
& @- Y2 S5 {2 w" l unsigned int a;
E: M3 e! t5 } s: Q6 t% { unsigned int b;
! L4 y1 l- I* b) t" ^9 U* E0 M7 V% } unsigned int packet_cout;+ T: O0 `+ C# r; T4 _! q% V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" [* s" e* X: f5 w: C
1 Z" J4 \: Z0 N8 u# a9 H5 Tvoid read_MSG_buffer(int *baseaddr);
( d& ^" b- }, O) M; `& k6 ?unsigned int count_copy = 0;
0 s4 j( A4 b j$ B8 V% ]9 c0 x1 V# [+ E% {: o1 E% p) v+ s
int main()% J# W* ?6 t6 j) v
{
" g( @- o( x/ A& |8 M4 g int fd;
6 j( Z! E6 n) D4 \4 U5 u4 A* ^ ]+ P, L& l int *mem = NULL; N5 g/ r; p( t. e
8 u* \8 {7 j* Z! ]. |
if((fd = open("/dev/mem", O_RDWR)) <0)
' V% v- @1 V" c8 q6 G) { {5 |4 u1 X- S; ?! n' `
perror("open error");# T/ V, D+ r7 A
return -1;
2 x1 j! r9 f' g }# h" g9 N+ {; h8 b: z T. [2 L$ s( [
, I' i6 M* }% O- o6 w mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 T7 [8 M1 @- X
2 J1 }+ b5 C' n' k
while(1)
- g& X! J$ n8 i3 E# h5 V) L {
" c r t* {8 B( | read_MSG_buffer(mem);$ y3 A. ?; m5 L0 C# h
} % a7 V/ t. q J7 [2 A
}
. {5 J; X1 M0 U- \1 k' @( q+ K3 v A X
void read_MSG_buffer(int *baseaddr)$ o9 e& N4 t. I; g: c, C u: E
{
' P* u: u! E% L# r pRX_MSG_PROTOCOL pshreRAM = NULL;
$ ]) P( {7 G% j
% b! Y' C( ~/ y2 W2 O( {- P/ ~ f pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ V. `6 F6 N/ r- M# S
4 \' }, C' {( H$ P if(pshreRAM->packet_cout != count_copy)
7 ~3 c( H; ]- E: ?' C% \2 z4 k {6 Q: t h; E7 V1 @! O1 G$ ]
printf("a is %d\n", pshreRAM->a);" q1 A( \, k2 K) ]9 k, l
printf("b is %d\n", pshreRAM->b);8 o" Z# L7 V. q! N" W' o
printf("count is %d\n", pshreRAM->packet_cout);$ M4 T1 v" W! `& h! T3 C$ ?
count_copy = pshreRAM->packet_cout;4 T6 U7 h5 S6 `1 T0 F/ w
}
! T* s7 B0 \, ?7 A* f' w else
: J6 O) f' \2 @3 | { W+ d' O! x3 |# S1 t% ]
printf("No effective message!\n");
. Q" r+ C* X0 q; g- J6 R2 ~* u }- y5 E. P5 ]2 @5 P8 i7 A8 y- B
}; b6 H# p3 R: C
( L! p: K1 j0 U9 L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: h8 c& E/ K! {8 @: `2 c) `/ Y. r; j: _! t
8 l5 a7 A; C+ T1 ~7 N7 E( m' `8 h3 b g2 w
4 M% M. G' y& U7 o) q' C' `
|
|