|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & n* V- r! U# g+ S
9 E2 L( x/ F, ^5 ?9 ~; L s rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. L: `7 x# s2 b/ D ?, U4 ]# T+ u Z
#include <unistd.h>; V3 q; j' A9 I- h/ h
#include <sys/mman.h>9 n# D/ ~4 d( q; x( e
#include <sys/types.h>! T' A: y* `6 ^* w# s
#include <fcntl.h>
, D& w7 r9 T/ p
0 O' t2 h7 g( u- L2 |#define SHAER_RAM_BASE_ADDR (0x80000000) ! U* Y$ d- |6 z' y9 S& p
* B7 q2 L/ q3 b4 N. }' l
typedef struct
( e. S9 R* w4 X- I/ D! {{
* k @$ z) Q# U' H% d# p unsigned int a;3 T5 L: @# M) R/ k
unsigned int b;; z/ m8 M J, ^5 I
unsigned int packet_cout; c8 I; Q/ [" ~) h1 i2 m! I2 ^( i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: `5 ]# A c2 e8 M: T, y* O9 Q
9 R; B F# a5 d( }- O( a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; }7 p* q+ [" Y C# f* n7 }
unsigned int count_copy = 0;( ?- @2 Q: o1 O4 [( Y
, ]3 @; C. }1 r) S4 ^
# V1 i: d- w) W! G# F
int main()+ E! B3 {6 i' [! O2 P
{* Q1 f' J6 j: E E+ V# R
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 \, j' [1 S K pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 i/ B7 d, P8 N o' O2 w! x8 ^. U% g& o: y. Q) p
while(1)
, A& m4 Q! M7 L/ n {+ y0 k7 S" d0 v4 F6 E4 I
read_MSG_buffer(pshreRAM);6 u5 J/ l0 w' U+ U, P8 J9 E
}
: E$ H2 Q8 h, d3 S}
6 l% _# V5 v: y; _& F" c' a( L5 x( I2 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* B) o3 d# x! t& u$ V; s
{
! p! Z q& X( u6 P) T RX_MSG_PROTOCOL buf;
* P* A% ]* B f& ` + _; m+ B4 g0 T) E
buf.a = pshreRAM->a;/ H0 t m8 {6 ? X% Z
buf.b = pshreRAM->b;
) V' Q: o* B* a0 G c% n* X) T buf.packet_cout = pshreRAM->packet_cout;
! |# s0 M5 I, I# D0 M% w6 V) N
, O1 G& G4 k3 X/ C" Y4 r5 {/ I if(buf.packet_cout != count_copy)
. w& \8 {5 O S$ U# h {! g; X: \1 k2 Z! P( K& Z
printf("a is %d\n", buf.a);( W( |* N/ P/ w& l* j. P
printf("b is %d\n", buf.b);
* X5 c! y5 J+ B3 l5 Z! b' F printf("count is %d\n", buf.packet_cout);
% k- V8 p1 J v) q8 F6 D count_copy = buf.packet_cout;
7 I1 @$ x, S" o0 i- E$ e }
/ c$ U: I7 ^; Z, v# g! L else' x: y* I f& Q$ d7 t
{
$ ^7 \- Y8 y: K printf("No effective message!");8 Y% _9 P5 h0 D3 e; L/ Y2 b
}: X6 j' O% L. o3 f* G+ {9 w$ `
}
! H# Z* c& ]( m0 E9 V% R' n# g& ^- R5 \* K i* D" v& j4 I
% H4 s( C# Z0 g5 O# |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
z+ I7 i5 t6 U, [# f, B8 X使用下面代码,对内存使用了mmap函数后:3 \3 [! D- O8 T6 v1 K3 U
#include <stdio.h>3 R) i0 q9 G* B
#include <unistd.h>
& m5 C4 B2 t( D7 Z#include <sys/mman.h>' ]. S6 ?. W2 ?* F
#include <sys/types.h>, b- ?+ K* f4 A
#include <fcntl.h>2 p9 u$ r# I2 o! [. |, m1 X
0 b+ b) r9 Y6 w. J) R3 a#define SHAER_RAM_BASE_ADDR (0x80000000)+ {8 {' Q4 x- s6 F
#define SHAER_RAM_SIZE (0x20000) 5 e8 m, B3 r- j3 j5 w
+ G6 @8 u% Z* f: ntypedef struct# j; x, D9 W, j& h$ ~
{7 @# t0 a1 V. k* Q
unsigned int a;4 H3 `* i. t2 Q+ \& x
unsigned int b;
) ~9 ]- K$ o) q* {! `9 T unsigned int packet_cout;
. D9 F' d: @" u6 k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 e u& D0 \5 e8 }$ S) _( D q9 O k; T/ w! W, [% |( a% f- J3 G
void read_MSG_buffer(int *baseaddr);
! K4 ]& O8 n5 {unsigned int count_copy = 0; f" G0 b! i0 l8 f; X5 \: k
+ ^. |. p6 c0 {: _) K/ V c
int main()
* y/ q8 F, \0 K* ~{
% S+ ]8 s, a8 H7 Q int fd;4 d& B& X: ^% B2 g$ a
int *mem = NULL;
# q) u( g }" z
! H" Y. }) s$ b6 Q if((fd = open("/dev/mem", O_RDWR)) <0)
$ ^/ o f* J; L {! V7 \# I+ m1 q' l$ z9 N
perror("open error");
8 B: u7 _* A: O8 ?4 ] return -1;
, V+ }0 ^7 g, D6 q }
6 A9 y; k& j5 u2 |; G9 r
+ U# o' [/ O- w% B: p% W mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 K8 p' L+ x4 ^9 h3 H5 j7 W
" b1 {% v0 n$ D$ m V while(1)
/ x+ h1 n! o2 ] {" j) i @/ {+ }' H' o ^3 n
read_MSG_buffer(mem);# p5 |, Z+ m& _$ F2 r' |3 G; i8 l# @: ~
} ( e% y# M; w# e: |- w
}0 H7 `6 _4 a1 k/ E% j, `
( H# C7 B* ~5 C1 m* {2 W2 l5 Hvoid read_MSG_buffer(int *baseaddr)
% r2 M, L/ v; H. V{* R; M1 ^- g! i: c( c
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 M+ t: Q; T2 y2 G; H8 B* B( b, c' d
& k+ B5 \* R( L. ~; E" A pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% l- R5 G! B# R+ N% ^) J- K) D7 G, x' E) v& `
if(pshreRAM->packet_cout != count_copy) ?# W. _+ F1 @; u/ o
{2 {7 s" W. {2 X) ]' l. L
printf("a is %d\n", pshreRAM->a);3 ~2 R! n0 u! t3 B3 D+ V
printf("b is %d\n", pshreRAM->b);+ o$ i* w" ~) Q0 P& r f
printf("count is %d\n", pshreRAM->packet_cout);
' Z! j8 O0 C+ \$ ]4 j count_copy = pshreRAM->packet_cout;
1 w9 i: G7 P1 N8 @3 }$ _, z }) E' p, y i5 H3 P' y
else
# } @2 s# V0 j7 M8 i+ y- P/ t {
. `0 v, |3 g2 N! u0 {1 T printf("No effective message!\n");/ E( S' V1 X" m" `- Y P- w3 @
}& P) q6 [( a( W
}" l$ a' g3 p: Q- _& t- @
, y" _* [4 p% x+ r6 \8 n没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% r2 C' C& R, t U* G6 D; B8 z" E) V. H) t3 p. X! ]$ i
- N% z2 Q& s8 K" V: ?2 C6 k. i
& i/ j6 \, `2 L+ w- d$ D
! N0 ?* K8 k7 }9 Z9 m |
|