|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 Y( o/ i/ i0 o
( ]" a3 h3 Z; M9 F& m. t! a2 b9 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% F9 S2 x; \4 D6 t/ N! F# P. [#include <unistd.h>
: L% w. b- b1 ~8 x#include <sys/mman.h>
1 x2 n- a( C S6 c1 A% d#include <sys/types.h>5 j/ ^: S7 x* n" l8 b
#include <fcntl.h>
; ~! j3 _; z' P4 {# H1 U- W0 J; C! W* S" J
#define SHAER_RAM_BASE_ADDR (0x80000000)
( d7 z5 B/ Q1 y/ @% k9 z' d# j) ?3 P1 f# W- C
typedef struct
" D9 d# N/ D1 q# f( E{+ b/ d' ]: w' s1 w* D& _
unsigned int a;
: _2 A9 q h8 q& Y$ g" v7 h unsigned int b;
& l! _5 i: ? E0 R. \/ B unsigned int packet_cout;- D, e& \% ~ B" G9 ]9 X N5 ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. b& B2 a6 U- Y! @
: x; t1 x7 Z* n* ?% |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% j! g& A* _$ }4 _3 h& n
unsigned int count_copy = 0;& p, o1 X( e8 U1 v
) V9 O" |* B/ H$ d- ~$ h1 S- C4 T4 }0 `" H
int main()
+ j5 _5 Y3 L p* e{
: R' @" U! C: z& E m- ]4 T pRX_MSG_PROTOCOL pshreRAM = NULL;
. b0 }7 @$ M% S pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ w" S8 n2 @9 r" \* X+ s! f
) P$ e1 @, h- D$ ]6 T2 h5 c& { while(1)' c- ?$ x o* w3 L
{
0 F0 h9 r6 D! n read_MSG_buffer(pshreRAM);: Z- {8 J0 D& c
}
' L+ P1 u" [5 J" O' X! J}
% d$ q/ }# A4 w% K2 _& J4 p) Z
! r* @* V7 d5 k5 vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: T. s0 `& n5 ~$ s7 p& ^{, o& @# {8 O7 @* i2 u% q
RX_MSG_PROTOCOL buf;% Z! m; N: Y8 Q
& H0 E! E8 m$ _7 V
buf.a = pshreRAM->a;: P( A/ n4 r6 A0 T; a K" Z
buf.b = pshreRAM->b;
& b T1 I. M8 V! x/ m, ~, u buf.packet_cout = pshreRAM->packet_cout;
0 `: d: g; n' Y- `& Z0 g7 n" K) N& Z % @$ e% H3 V% ? u2 X
if(buf.packet_cout != count_copy)
0 m' _) ~. M, j7 i7 v {( l$ a' A; G' x4 U+ H8 `( S
printf("a is %d\n", buf.a);
' t/ j2 a& O- G printf("b is %d\n", buf.b);! f: J2 Q9 T1 V k$ v
printf("count is %d\n", buf.packet_cout);
! m% C5 c- i4 | count_copy = buf.packet_cout;
* ]8 Y% E+ R) {" _* b( `- W }
1 I8 U4 N% u" p else
( k3 R. n+ H, s& t' v. o: | {
" o$ S+ L2 u4 ?4 G! y7 g: d8 i1 f printf("No effective message!");
7 ^+ O* y! f8 l7 s8 W$ Y; x1 W+ b }
- O( p5 e! C; w$ v}
- n `' ^, _$ n2 \( F0 M) ~( p! }" e
9 M. I2 V( \& P- O0 g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" H9 D- F$ Y- K, X使用下面代码,对内存使用了mmap函数后:7 r; J. k" B" N, q) I/ p1 {
#include <stdio.h>
% [: F7 e2 R+ Q, H, {1 ]#include <unistd.h>
7 Q! D7 Z3 r+ P#include <sys/mman.h>
: h3 }" Z; U0 E7 T$ X#include <sys/types.h># V/ w6 p0 j* a& X$ B1 P$ M
#include <fcntl.h>% K% H* f: k, q+ C
, g5 X/ Z2 _9 |! J
#define SHAER_RAM_BASE_ADDR (0x80000000)
m. J. s6 w" G/ _$ x#define SHAER_RAM_SIZE (0x20000)
* b/ G2 ?! b& ^& X! [+ @8 _
0 |, f0 S4 ^* e2 O) \ o: q, xtypedef struct
M- w" I# Q1 y6 d' W) I$ {- h{
/ b3 o8 N; n" s" q/ @ unsigned int a;
5 E- V! p' V; r+ i: c unsigned int b;# q: l( ~. k: L( E- f
unsigned int packet_cout;3 x, t3 g; a7 \, h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: H6 N0 M( c. C5 q; a/ [! A/ U3 u9 F1 [3 J, l( U( Z8 o8 H
void read_MSG_buffer(int *baseaddr);4 q7 \. G6 |. j
unsigned int count_copy = 0;$ T: A F# x. J; n
! S) R6 r. P6 M+ x1 z' e5 O/ S
int main()) k; k* S1 B7 [9 t3 Q r
{
9 A+ L+ O7 m; o! A. n K S int fd;
8 e R! i2 `$ Y x5 N0 U int *mem = NULL;
, \" \- ?7 j( T9 u1 h" g" L6 E
0 v6 I$ z ?# E3 r: {3 \ if((fd = open("/dev/mem", O_RDWR)) <0)1 P/ e- k3 a% z* i9 X
{7 D2 g8 W! W, M, C& N
perror("open error");
, B% ]# ?9 A$ Q' O; w3 e return -1;5 r: E f0 {+ |. {( E9 d
}$ ?" A9 b% i4 `* n
' d9 n. Z: ^' J. @" h; b/ E t mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 ^& v9 I( M x" ^
: w. x+ @7 R% c$ a9 A2 ^5 p
while(1)
% ^& b. u) ?5 k1 I {: F1 l+ f8 P8 [
read_MSG_buffer(mem);4 `0 Y- p! c9 T& O, d; \
}
" A. ^9 \: G) X}
- R! S) P' H7 G& V. a4 t6 o1 }* f0 n% p, S6 Z, y0 P8 |
void read_MSG_buffer(int *baseaddr)
8 _& q! U# k9 k+ `{; f( i0 `/ D2 s& i9 Q: M' W0 C
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 h% Z9 b. ]" E, m0 A$ H* ]/ k1 M- m, O2 D; c. C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; Z6 A- J9 X- A' d
, C' t3 g3 W3 R+ _# g7 y
if(pshreRAM->packet_cout != count_copy)
, l; }" a: l& B {# A2 q, c" K3 B$ V9 b
printf("a is %d\n", pshreRAM->a);
+ x# M3 s: g7 N) l3 A2 F printf("b is %d\n", pshreRAM->b);( T" |' F& W& \# z
printf("count is %d\n", pshreRAM->packet_cout);4 s* @" A8 @$ Q* R
count_copy = pshreRAM->packet_cout;
# J, Y0 @6 m* V7 n }
7 W' |+ |. q/ r4 }5 G# u else
/ N( ^+ g2 M4 _! E {
G8 l- g' h e# e, N5 H, o9 j7 F* f printf("No effective message!\n");
! S3 m3 n& @2 y! o# ^ }1 H' I3 s$ b; U% S9 D
}0 t# Y0 i3 N) }6 |4 Y0 Z
% I6 ~ l. a4 b; ^% i, [$ c9 Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' g U9 P) g9 M( ?7 `3 o% ?' u4 ^
* ]/ R% b( X" e7 y6 R" F' A% ^ I5 o1 i l) [$ r# l
( g- S- A8 o# S2 ^4 M, W
|
|