|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. r$ P& G: ~; L& V6 z: V
7 l, r* g3 {& r" _: x: N* y2 J4 c k5 gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" D, k* ^* F* h# y1 f#include <unistd.h>
: U0 C9 N. N2 m# }#include <sys/mman.h>& n% U: p. S3 x8 g/ v' V; [( V+ t4 a. C$ F7 q
#include <sys/types.h>- f- o1 U1 d/ \5 I- R* X
#include <fcntl.h>
- o% \) { O6 U) R' M) k9 H) F5 u, z! t6 ?8 @# i
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 n1 c; Z8 a! j% y. w Y2 s4 s* p! o4 F* M! h }: W
typedef struct
3 ]2 h6 g0 U! v* A. g, O9 y4 D{
' G' _! T# g2 c2 \: f unsigned int a;
$ Z; P( `7 f1 Y6 Q! Z. } unsigned int b;5 \: U% ^, \( h/ N6 @
unsigned int packet_cout;
6 C# C' r9 e/ A( D! W- m3 L5 X) X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ H7 f( J) U$ a) C7 f. U
$ @$ r1 @7 F/ @4 ?% `4 ~9 Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; f ~/ B5 [ v0 {, ^# J9 ounsigned int count_copy = 0;
$ x4 N7 }* C1 H+ C8 C c: `/ \0 W1 s6 {- t
/ V: Z% e8 \8 m# Q, ]int main()& B c& {7 \- _! H/ m" j
{
& J4 g# x% I2 z+ | pRX_MSG_PROTOCOL pshreRAM = NULL;
5 m1 q5 l1 t/ [% W pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* @1 G3 N9 u* k# k- N" f/ A# y. Y7 R, r
while(1)) s' t1 G1 b5 \' i
{! D/ l/ D- X0 Y, {
read_MSG_buffer(pshreRAM);3 n) |" C, o, ]( N) a9 _
} 1 B5 K9 Q. U7 h8 F7 X
}) n. ^. y% B: s0 V' N* N+ ]
; c7 g4 G$ D: ?8 R) n7 _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 j$ [6 s% e6 R4 S{
4 a! A# }8 Q9 K( q: p. |2 F Y RX_MSG_PROTOCOL buf;
+ `$ ~( l: d: W$ |8 m6 f P @& ]
. B* t0 t( y6 C4 V buf.a = pshreRAM->a;& d" C/ `2 R! U" K; n p. S
buf.b = pshreRAM->b;
8 c& u, b" z! I1 \8 P/ P& H# L buf.packet_cout = pshreRAM->packet_cout;
( q7 F8 M) w3 J/ Q3 |6 J 2 K4 V b9 u% C2 G/ m
if(buf.packet_cout != count_copy)" A8 w1 e0 M/ b( ]6 |$ A1 P) j% O8 R
{
. u7 l/ T* c: t1 \ printf("a is %d\n", buf.a);
; n+ h# j- k9 H* K printf("b is %d\n", buf.b);
$ V* i! r! z. R3 N6 ?4 S printf("count is %d\n", buf.packet_cout);& Z1 p+ h6 g; j4 b$ _
count_copy = buf.packet_cout;/ ]* K& V& M B0 _
}; W$ \# C& M! Q- V- R% X
else
% E# K0 j* z$ b# y {; U1 o; X$ H- N1 z. G& v3 s D+ J
printf("No effective message!");5 P6 J. ^% W% q
}
7 m$ [ @$ K3 z}
# K7 P/ }! @0 B: X6 d4 O6 Q; P) d: }1 ]: H
/ e3 j, F; ?7 [1 j, B但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# |( s% |. V1 F/ C! }4 ^' F9 ^" d使用下面代码,对内存使用了mmap函数后:5 V/ H& i% C! w' J# f
#include <stdio.h>
* v( {, G ]9 Q#include <unistd.h>- P, ^ F" @; z0 M1 C. \
#include <sys/mman.h>, p. | }$ x/ x* e# U3 W/ e
#include <sys/types.h>! c/ A; \( V, C$ a3 @7 U+ m# [
#include <fcntl.h>
3 n& ?( b/ j/ e% n, y
7 h0 \3 r' V, i7 k#define SHAER_RAM_BASE_ADDR (0x80000000)0 |1 W {2 p: x) x) H2 v: h
#define SHAER_RAM_SIZE (0x20000) " r1 d. L" c8 W- p4 c, W. Z8 z3 L
4 |6 E$ F! R+ q% R
typedef struct8 D" V( u: ~1 y- ?
{3 e" a; e/ `2 W
unsigned int a;9 }4 Y) s0 B+ f3 Z4 T' @, S
unsigned int b;: J6 }9 k% e/ w6 z
unsigned int packet_cout;
+ F- E2 |$ X2 l& o: q# ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 E2 d0 L3 U, b, |! o
% S E1 \4 H% a5 L! t Svoid read_MSG_buffer(int *baseaddr);; t; L( U& [8 s. q( |
unsigned int count_copy = 0;
( Y7 g' J1 d" [$ m
5 l5 G$ `" T( n3 E cint main()( O3 z- |* _1 e8 O0 P7 h4 Y1 |6 R
{
, T, n! M- c6 q, v2 k int fd;
' C( P f4 `! \( _9 ?1 p. a$ b int *mem = NULL;
; ~( n% O4 h) Y4 P6 | o! H& b, Z( t; c8 I
if((fd = open("/dev/mem", O_RDWR)) <0)
0 c8 N/ \) K- r0 L: J {" V" l6 m9 X3 N7 P
perror("open error");0 u% a) J; A# X+ F
return -1;
. |) a) v z" h5 L" ? C% u$ P }1 U5 N' E0 D% Y
* T/ x( }" }. O7 | mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 B" y. H6 X4 t7 n! R# V! @- B) V2 k" ^& I# l" |) Y1 S
while(1)
* Y8 X, z; `% T. \. A {1 t5 [) V" ~, x+ Q
read_MSG_buffer(mem);
6 ~! x3 U2 {9 `3 I( _+ M } & t4 N1 X, \4 l+ V% A S9 |/ S
}) @% c% s/ J) k/ D
4 O4 Z6 j9 B+ w1 fvoid read_MSG_buffer(int *baseaddr)
. E: Y/ @% u# Z" E{, A4 U: j2 f/ J% W8 Z5 V
pRX_MSG_PROTOCOL pshreRAM = NULL;3 N9 F. l. @+ k9 \8 [
: ?; o6 w( d5 E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% G, k% l$ i, G( @5 h4 t) x
* ^# d/ Y; V1 L if(pshreRAM->packet_cout != count_copy): e+ M/ y7 U8 k0 H. E) U' H
{
6 H* y- {. W3 q7 E; Y2 D c. \ printf("a is %d\n", pshreRAM->a);
7 V {8 V/ Q, \5 u3 z6 w printf("b is %d\n", pshreRAM->b);
5 t7 T1 A6 D' H, \) E& B printf("count is %d\n", pshreRAM->packet_cout);5 P7 E$ O) n7 ^
count_copy = pshreRAM->packet_cout;
. F2 N: _) `8 H* |/ _$ S }) ~) W% V9 k @" Q7 M: q
else6 a3 D+ F0 A, s
{
) {5 L. C7 J" n% R! L% K& B0 n printf("No effective message!\n");$ `4 e0 K% E- M' P5 U
}
5 @" m. d6 B: F}
: e: z' m+ I$ `: n+ O X
: v2 X! q) E+ e+ J' L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# P; m( `' N% n9 R8 X& V, g7 |1 g1 O. }# X5 t' i
9 m# q7 |! g& ^8 m# E# @
T! a7 P! }$ n8 {+ T: y. y+ R8 d* k5 H. O/ h c: U6 H
|
|