|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 e9 N L! l' u
/ F; L w7 J9 J' E4 C+ }( V/ a8 zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' S9 E/ \! L$ \& {( d! Y3 R& |
#include <unistd.h>
5 A8 K# g3 z- {' f; }) f7 y( p#include <sys/mman.h>( \( f9 Z& S! _9 {
#include <sys/types.h>% o9 S3 N1 E% e. c! l# H
#include <fcntl.h>
]6 |" T: C9 f" K- X, o' o) ` t" @; Z; E7 l) X5 i
#define SHAER_RAM_BASE_ADDR (0x80000000) 9 r3 F/ W2 t' ?
& u* u( @5 c% Gtypedef struct
' H' D3 ?8 A- U0 v& Y' _" E{( j5 v, Q; k4 L# j6 K+ H; ~
unsigned int a;
& H; ?2 A# ]/ X/ C unsigned int b;
1 V6 |. f: l1 i8 f unsigned int packet_cout;
. O3 M8 K9 o, s, i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 h0 |$ {2 ^. M9 `4 N( v9 e' B$ V) w$ h4 |$ S& G. R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( V1 Y: N$ q6 R" t9 ~& O
unsigned int count_copy = 0;
Y- O. m& F) b/ D; W9 @( n8 n
! J X4 p: d4 e) Xint main(), G: y6 Y3 m% m8 h" h! k# u+ i
{: C F. B, @' R# z& G
pRX_MSG_PROTOCOL pshreRAM = NULL;& U7 j( {' e, X0 C2 q' h! K5 B
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 U/ I5 `. S6 W) N M! G. e! b: a
' K+ C( B6 A% t9 M
while(1)& {) M+ }4 k; h1 A- Y) b$ }
{6 N \2 C# U/ f- B r5 l6 l+ f
read_MSG_buffer(pshreRAM);9 B+ [- ~3 s* d \$ }6 d
} . @3 A; j$ `; y2 g$ e
}8 P- }+ b( K2 H0 ^7 u1 G+ I
6 s) {: f7 r- f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
^) S& A9 F0 q/ I{
5 N" W; N6 B3 o& _7 a RX_MSG_PROTOCOL buf;
$ u" o: t- N1 I2 o) _8 O5 }' r " o, ~4 T( `3 W# s
buf.a = pshreRAM->a;
; P# q. h' ^: g+ v7 _. f buf.b = pshreRAM->b;) q1 l; Q: ] A$ e: k6 P: T
buf.packet_cout = pshreRAM->packet_cout;
1 H8 [5 u+ u+ l : {6 n% _$ `2 w6 \' U
if(buf.packet_cout != count_copy)
0 y, Y' |$ |8 e( U) k* K% W {1 @6 Q% e8 C9 p' F0 H, f% \4 z% ?. z
printf("a is %d\n", buf.a);
! ^- o4 T" n4 W$ t5 a' a printf("b is %d\n", buf.b);) _. z, Z* j* q
printf("count is %d\n", buf.packet_cout);2 w# M7 g' M% X' _5 w ~1 ]
count_copy = buf.packet_cout;
! N& w8 J& K+ ]# x0 K# x7 z X }. N# N$ ]( f( H. c2 h7 D! s* e
else
9 ~1 j1 e r* l8 V; ?. x {
, r* b: B( R8 F4 o2 { printf("No effective message!");( z- \1 p1 h; N; E% A% i4 G: y ~) Q
}) C9 U( s# W& `' g- U
}
( K* T. z( ^1 \" m( G! x$ H
, ~- l# c" D2 t* w" B3 A: h
4 |+ y5 l& Z3 q: s" Y# i) x/ U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 _) T4 r3 O$ s0 Q9 D8 z+ t
使用下面代码,对内存使用了mmap函数后:
% z& U! [( E$ K7 {$ m9 B. [. T#include <stdio.h>' r: k w5 M! H" s+ y* W" W
#include <unistd.h>
( }; w, F0 }" T1 s) d: Z#include <sys/mman.h>
5 K! m1 x9 n4 I& O$ m# v#include <sys/types.h>
2 x0 h C! s/ ^$ z+ J" o4 q" v" _$ {#include <fcntl.h>
* s8 _9 e. V6 _" f4 i; I8 A$ S) g
5 @" c$ ^, V$ `9 l7 O5 }" v#define SHAER_RAM_BASE_ADDR (0x80000000)9 B$ _5 r# ]5 x+ ^- _
#define SHAER_RAM_SIZE (0x20000) % l0 t9 s. N" Y' U4 o
" ^+ ^6 Z0 I: I! N! @& {1 ]: S6 rtypedef struct
| A& k X1 V; t. M# N+ ]{: ~" A( p4 [# H% F
unsigned int a;) @6 l+ ]3 S( ?
unsigned int b;1 [: e' `9 d+ B0 c) e8 Q
unsigned int packet_cout;* z+ P* L$ n2 `% Y' R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 Q" `$ W! E2 N; j5 j
b6 p |, v7 u5 t3 u: y3 Kvoid read_MSG_buffer(int *baseaddr);1 j5 ?4 Y! W2 X1 n
unsigned int count_copy = 0;
! L- M. P. [' ~$ P
& z! N& j; R/ _/ g W5 W( v& Tint main()
' L2 R# Q) r4 A$ R{4 h! u. X1 j: @( g! T! y7 T
int fd;
5 \# d( A& h* n: L int *mem = NULL;
3 X- x. N' b. c- ?2 b S* a; _4 }. H; M* Q0 A) O' o
if((fd = open("/dev/mem", O_RDWR)) <0)
! _! k" d0 D* ~$ I" j; t6 Z- { {) N' ]. R: a3 ]$ U+ `
perror("open error");6 C8 O7 Y- [ }, X4 @
return -1;6 Y/ C7 Y5 Q1 F# {
}
, `! |5 l' b# X4 w$ e, c/ N! e+ X1 }- C
+ A0 M; ~9 h8 Y1 S E) ` mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ p) b# l* f/ j0 p7 V0 }9 n
3 Z* X: b' J% c; N) B! G* Z2 J
while(1)% O! }3 a* s2 d( g5 m+ w7 n+ T1 Z
{
) V4 ?" F3 [$ D read_MSG_buffer(mem);
" _& M! b4 Y# u' ]/ l } , n) j% x1 K3 `8 q+ h* C. L
}; A6 ^+ S* z2 L9 V+ d
W0 _1 b) e/ n/ k3 gvoid read_MSG_buffer(int *baseaddr)/ j: L+ a* n9 e* F
{+ z2 a8 U+ }8 J" X2 J! w- d$ p
pRX_MSG_PROTOCOL pshreRAM = NULL;
, t/ V4 l. v: O/ H; Z2 L1 F1 n/ g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 k/ J0 J% {6 K4 o3 Q
4 O7 @: O& d8 } f. ^5 R& ^* h, p. z if(pshreRAM->packet_cout != count_copy)
! r( Z3 f; G5 \: g% S4 j V4 Q, V9 E+ Y {
& ]: U: D2 _* G/ P( D printf("a is %d\n", pshreRAM->a);
* V+ K' e1 y8 m' G& _" { printf("b is %d\n", pshreRAM->b);
; U A+ P3 L& c8 a, b( M printf("count is %d\n", pshreRAM->packet_cout);2 c6 Z9 _, R2 x0 ^
count_copy = pshreRAM->packet_cout;
8 l" c& a1 {& \& a }/ F L, b! M s8 k; V
else/ c) x' j7 G `3 \" @
{
; c/ V4 J9 G( @# [ printf("No effective message!\n");$ s- u7 G9 F/ Q6 Q* I/ S
}
0 u1 e3 ~( _0 { Y! f}
2 w1 s' t9 g l! W0 F9 M) T$ n; k9 D6 B/ G. w( ~2 O' Y& ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% G& x8 U4 q* j1 l% G! t
0 y' `; ?: B i! @, |
! e1 x2 C3 G1 s$ K; O2 T- s$ W" ^8 x; ?0 F1 d
! e% I C$ x$ u- [3 u" X! M( `; x
|
|