|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
u4 o% ^/ R% ?7 X0 n- }' x$ u/ O% n) M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" O: s4 {) o6 u% Z#include <unistd.h>
0 s' a n* d; N. Q9 ]% Y( @& |#include <sys/mman.h>) s: I1 s7 _* L) \- L' c
#include <sys/types.h>' x2 z }4 y4 C. g0 ]9 D; N. F
#include <fcntl.h>
) M6 g2 o$ |; G8 s8 |
2 d9 A+ B- |7 S#define SHAER_RAM_BASE_ADDR (0x80000000) % E P' G9 m& e$ j2 v7 O1 M. u
" y: A+ r- e/ [- ]typedef struct
4 L( E' j: @5 v9 \3 E7 f5 C/ `2 [{# _. d8 f: V5 W# Z4 _, u' _3 `& I
unsigned int a;9 ^( G0 {+ ~8 Q: c+ v8 f% _
unsigned int b;
( A/ T. J2 r h unsigned int packet_cout;- a) Q2 u( N1 C) r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 Y$ |$ Q* g* T! T* b8 n1 k0 K
0 T! a7 c. j" I1 Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 x' t' N! n6 U9 Bunsigned int count_copy = 0;
9 m) Q% s: s7 p, d( t
' H2 n: X( O2 m% {* ?7 s/ z2 s4 ~3 o% S- t+ f; X+ a
int main()
9 B! m) O4 u3 [. O: G( h+ g% `9 }{
) w4 j" `% e' i0 T* r R7 c: ~ pRX_MSG_PROTOCOL pshreRAM = NULL;% T" L Z1 h# s: a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% A B$ K' Q0 l/ K3 D# y
* w( W; o$ \, R$ _. `7 y9 ] while(1)
' w( r& [" F- _! G, m5 l6 t N {1 g) ]/ ~9 i$ P w* c5 s
read_MSG_buffer(pshreRAM);, M2 J, ]5 m/ F% l( x4 j! d7 k
}
" F5 ]/ x% [" y3 {3 x3 X}
7 T! N+ x- p+ n2 c+ c
8 x0 F( j+ T ^* [# X/ S& ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 W" x/ }8 F; u{; f; E/ t" C+ s5 U3 O; {* D5 Z0 T
RX_MSG_PROTOCOL buf;
8 |- _. X+ @4 Q# g9 n! Y" g% g
g+ _" D1 S1 K% K buf.a = pshreRAM->a;% V' |% r7 s% p% z1 Y
buf.b = pshreRAM->b;# V2 z+ G4 B1 f# [# p- z" P
buf.packet_cout = pshreRAM->packet_cout;
5 Y5 v; o% v7 |5 F# R J6 C + O! L; g$ f# q! L) x8 ?' H. H
if(buf.packet_cout != count_copy)" |+ G6 {3 y! {7 C* M ~
{
: t+ n- t2 z/ z printf("a is %d\n", buf.a);
& Q" h0 C5 T( T% q printf("b is %d\n", buf.b);- ?, T$ J$ [6 a" Q3 M5 [6 E
printf("count is %d\n", buf.packet_cout);: m5 R' H' d6 n9 Q# U# c6 `
count_copy = buf.packet_cout;
0 t7 F' b, F+ Z& I/ k }! n p( a* [5 f8 z6 y
else9 `3 Q2 d3 T* p( ^# @+ `% ]
{
6 Y# V. G* t- _6 X9 }2 Q printf("No effective message!");, O+ y" m% n: f% H. T: d3 b
}2 z+ n9 U, k, o7 ]+ S: k
}
9 [8 F3 T0 w4 x* G) Q$ ?% ]" L0 O) P0 a
! @" p, A4 C o3 J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ H6 ^. Y3 d9 Q$ M4 ?
使用下面代码,对内存使用了mmap函数后:# Y9 F: ^+ J% T/ ~2 L1 b5 K( y
#include <stdio.h>
4 n. }% v3 y, I- D) e- P#include <unistd.h>
8 R, F- W; }2 r* x% K9 p$ K#include <sys/mman.h>
% k" n7 D2 y6 K#include <sys/types.h>
( x' J- m1 I& o9 a/ N/ \#include <fcntl.h>+ ~0 Q# N- Q% H5 R
' w' D9 z# z% M- b( S#define SHAER_RAM_BASE_ADDR (0x80000000)2 O0 ?9 S. u: P( d2 I
#define SHAER_RAM_SIZE (0x20000)
# m& ?6 `! m% W* k% ]+ T3 g4 S3 }( l& Y( s4 J+ O: h4 o( X
typedef struct
T& H4 Z7 s( N7 F( q3 ]{
, a4 v" [3 [% i$ x i3 a( E# O unsigned int a;
, C" G4 a) P$ j4 Z) |9 S+ X# `1 ~ unsigned int b;3 @) ]3 k: Q5 v" [, Q5 @
unsigned int packet_cout;" p$ ~) B# ~* Q, q$ Q" G- R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, u" C. f8 y8 n3 k9 W/ `4 G# S* W! k f+ ~ W9 S9 _
void read_MSG_buffer(int *baseaddr);
1 N1 s3 H& `# } Wunsigned int count_copy = 0;3 [; V6 T4 G7 j) {/ P3 X9 {" [# `
0 ?6 D+ G7 Y4 U) A% d4 u, M& Aint main()
; _8 e5 w5 e& r/ Z; d2 F. Z{
9 Q0 V: E; D1 o6 x int fd;& e7 b2 k# T: U6 A2 V
int *mem = NULL;
+ l6 s: {# Y2 p: y7 X+ ?$ c8 q8 S+ N0 V! ]$ @
if((fd = open("/dev/mem", O_RDWR)) <0)8 M% ?& L5 Y! b$ c7 F! Y
{
" z8 D6 K4 T) I' K) n perror("open error");
, J' j# o; c- d r: J1 O return -1;+ y0 m$ o3 N( e: x' g
}
) ~3 p! a( d- ~+ k9 o+ x - Y: [2 n6 s6 H( l& f$ {% o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 q7 Z) M8 x& J3 o# o. e" \* @
3 a( C) u: ~, {. Z- g O while(1)
: _' ^( o( {, R0 u {; B% s' `7 V" I+ D4 d" T) L! L
read_MSG_buffer(mem);( f" E) N% f3 t/ ]) t
}
}& @, M! s. h4 O5 \7 S}
7 U6 L; P; ^! K. B9 a5 X0 o$ ]8 j" f+ {
void read_MSG_buffer(int *baseaddr)
1 T/ M$ L. A" k: q, E+ o{
( c, I* S( @* \" {, T! ` pRX_MSG_PROTOCOL pshreRAM = NULL;
+ |* Y; y$ q" Z) e4 r
+ H/ J- y |! @' C% i3 f pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, `# T' s) F9 e
R+ o8 K) @7 C2 S" v: i
if(pshreRAM->packet_cout != count_copy)' `: H5 ^0 J% O& V. v# D* C
{
+ N+ p' R6 \3 h, i printf("a is %d\n", pshreRAM->a);
# f( v# o g2 r9 ]$ o printf("b is %d\n", pshreRAM->b); ?. f5 ~( `" X. m9 t8 T j
printf("count is %d\n", pshreRAM->packet_cout);# }+ [0 {7 j8 U. x9 B0 Z
count_copy = pshreRAM->packet_cout;- h7 O- g7 U6 _
}
6 Q& q4 U! O, J* l* L5 w8 A else
W O2 S" r0 e# L! E {9 ~1 @3 `: o+ n6 ?
printf("No effective message!\n");
$ z, O- }, g4 G2 x+ r7 L }5 _8 H: r6 F1 M4 T2 J: t& c9 K1 q
}8 |- l. I& G7 U; T9 W
8 j \- y# _ w7 ]( c6 I; A, @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 b' q. f7 e$ [5 s% S2 ^& B
0 s( b5 F3 R' @3 h2 [( l2 x- f
$ n1 v. d% V% h. d1 @7 T. K
4 \1 b( @( f: B( g5 F" o5 r( E4 y8 X0 d
|
|