|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - u5 A- l9 y% @, Y9 j6 B
* m. t3 h4 x0 q& _! J, b5 @OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' t) Q# N1 s# L7 M- T9 e2 d+ g1 I- d
#include <unistd.h>
. j4 E2 N( n- X* P8 }#include <sys/mman.h>) s" \/ Z* V9 M( y
#include <sys/types.h>, ~) U: P! |, S* K6 _- j
#include <fcntl.h>
, D; |2 ?3 E0 H. I5 r( m
2 O, A9 L4 F8 ], l#define SHAER_RAM_BASE_ADDR (0x80000000)
1 f4 o8 [. \' d8 [% _
9 q" t; ~9 M, Dtypedef struct
/ B/ x" F) E, i: T. _{
* b1 L G1 s0 O unsigned int a;
( a6 y/ n; y. `. k6 B0 e' b5 W unsigned int b;
# W8 b! |: k5 [- G4 [( c/ C unsigned int packet_cout;
0 ?2 ~/ t1 i2 ~: f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( C: O6 i+ b6 V( D* b" a! g- m$ u+ w4 u2 g8 E2 d; B$ k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 \8 q, s0 h4 ~4 ]8 Wunsigned int count_copy = 0;; b( |) Y% Y; I$ ~* K
) m( H$ n; c+ Y
+ r- T7 t! J" j4 Z, K; ^int main()
+ b4 p3 D1 `* ?: Q4 M{1 l4 }: `3 R' \% o- Q4 g2 F
pRX_MSG_PROTOCOL pshreRAM = NULL;
) x4 Y5 a Z( S- v& t pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" O. X$ M. f/ Y4 Z E
. k) ~ Y9 {6 A( @) q: e
while(1)
, ]! b7 M4 t0 Y3 Y3 s) v0 ` {
* B/ i* j1 `& h+ {9 T, J* m7 M read_MSG_buffer(pshreRAM);
7 A! D) Z* n) V } # \0 R. w; `$ N* g, e( u7 j
}& k6 `% ?# l+ f: L9 I7 y
3 _6 R3 Q# r# b. o1 T5 o# T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; [8 ^! e9 X" d3 I0 s{9 V) J" Q7 w0 Z- k* Z
RX_MSG_PROTOCOL buf;
! @! Z& Y! ]" m8 s& o 6 f* |0 e$ Z7 F0 F: q0 _; A
buf.a = pshreRAM->a;4 w- B- m! V: Z* }4 t
buf.b = pshreRAM->b;( V8 |5 ^3 d* f: N, `
buf.packet_cout = pshreRAM->packet_cout;
8 e0 x$ H" e$ m" M- z 2 S0 }* i6 ]: n( M% Q4 j$ G1 I$ G/ c
if(buf.packet_cout != count_copy)8 E: A- w8 z" P1 ~! v" U
{
/ P& I( R) B' ?8 c, d4 W printf("a is %d\n", buf.a);! C2 F; `0 j1 Z) ^7 L( l8 Z* Y! r
printf("b is %d\n", buf.b);
) H; q* m1 R; D( q( M printf("count is %d\n", buf.packet_cout);
, P; G, I X% U# z, ?% N( r count_copy = buf.packet_cout;/ T4 Q4 o. w, h. ~
}
0 b) W2 ]% |5 H( s% T" e* c. i- z else2 v# f+ ~. \* p3 w
{. a3 N4 S8 h" i, b: ^; O
printf("No effective message!");9 }+ z1 o* ~% c2 b' s* l6 H
}
* U3 v. \' T: P}( P V$ L' x1 p+ k i
% l, O$ i+ H' @5 a# N3 x
5 W" X# |9 H3 d2 C# ~1 |$ R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( V4 a' m% ^, N' o4 n
使用下面代码,对内存使用了mmap函数后:
- B0 W& D7 [% M#include <stdio.h>3 e7 Y5 I9 ~5 X2 {! s
#include <unistd.h>+ c) J% a6 t& r/ _% ?
#include <sys/mman.h>
% M* R5 |; @1 H1 E. U# x#include <sys/types.h>
: R+ J) x# h6 b#include <fcntl.h>! _- ~" V ~$ c4 j, m" V( }3 }% @' w
' ^; E4 Y* `: v) ?
#define SHAER_RAM_BASE_ADDR (0x80000000)& `1 V2 |: ^8 I. b! E
#define SHAER_RAM_SIZE (0x20000)
) O. ~4 J8 f3 a9 W
! w/ n. x8 y0 p! P% |typedef struct- o8 i& |' n3 i5 Q& p8 d
{
6 M! g2 @ s* t2 g) K) Z2 |" b% h unsigned int a;! V. E1 J- I/ f- g2 Q. n- {" i
unsigned int b;
. T2 }% R, v" l/ m* R) `! f2 s unsigned int packet_cout;# s; M1 c1 q( B( k! C$ ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ a& i& u7 a$ R8 T- u
" C d$ N- E3 a5 ~1 u3 \void read_MSG_buffer(int *baseaddr);
R( {' c! [. Funsigned int count_copy = 0;
! U/ X( x: X, A
* m w T* x- Zint main()3 p0 l& C9 Z( Y4 _' T% i; k
{1 O) o; H* M) U" H
int fd;
6 f% D+ j1 i: d& B7 w int *mem = NULL;
. k& X3 h1 y7 C: I% L! z5 b5 S
$ u' c- c' [' U: w( b( ?7 y if((fd = open("/dev/mem", O_RDWR)) <0)4 y r& `3 ?$ F4 }
{" ]: z) u# L3 W( C
perror("open error");. ]* J! x9 v, V, W6 H
return -1;
+ e5 k+ i5 |" q8 H2 g. @1 x }
/ a% o& y0 E- D. k2 G4 ]. @ $ F7 S# Q$ L5 C0 s; n
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: J) P0 u& Y' x5 |) L7 F1 { z! Q+ G! m6 ]4 L2 s2 }+ B
while(1)
9 k) x* ]# T. e" ~; Q; ?% ]7 ?& d {4 P) f: A7 E* _# S3 k' t
read_MSG_buffer(mem);
1 d; I( r% ?5 H5 D6 f9 ~4 B" o }
3 k7 K4 P' a8 `}3 R" U: C- x/ j, o3 V$ k, p( w
4 i! P3 J2 P) k% D9 `void read_MSG_buffer(int *baseaddr)
( }. m" d7 s5 J- {: r# b) M{ n+ i ?+ B$ G \" d- R: {5 F# I
pRX_MSG_PROTOCOL pshreRAM = NULL;
* y- w, U/ z, v
9 r$ l O8 l# V1 Y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; Z" B* q( p$ B8 b% Q# Q/ @7 E
( a+ g' q& N! i4 Y/ [) Q, S
if(pshreRAM->packet_cout != count_copy)9 [! a: e% ~: }3 {* u
{ M u4 Z+ n* s% [. L, E4 c
printf("a is %d\n", pshreRAM->a);8 j/ e* l/ w" @
printf("b is %d\n", pshreRAM->b);
. N7 \9 X' T' \1 S printf("count is %d\n", pshreRAM->packet_cout);1 U1 P. ^# I5 b/ R( e9 ]% @8 @
count_copy = pshreRAM->packet_cout;3 ~5 }& V" m. c1 q
}$ K7 O+ E! q3 S
else
) x3 M: _' |0 F" B5 ^" u9 b; n {
. [2 U9 w8 p2 A$ T& M3 Y' ] printf("No effective message!\n");
" u7 P$ t0 o4 w- J+ I$ q }# T }: [1 d; Q4 Q# K Z4 x/ J# N# T
}; v1 y; f1 j# o/ E; v& m0 k7 I
5 M9 ]; q7 b: L9 _, E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ D1 ` N! G% h0 J* {+ W
. _- n3 X$ K- ~% z! N0 N5 [$ r8 H% B
) T: T; q( y6 P$ o, a% J( u" v# P
2 e. B" S1 P1 t& Y6 O6 l! D
|
|