|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 M" B9 [) S4 W$ c
# \. c( O3 R. z! |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; l. C2 ]' U1 T+ b) ?1 e2 B8 |* A
#include <unistd.h>2 I9 S/ g! }$ R) F
#include <sys/mman.h>% J3 D8 w1 G2 a; C
#include <sys/types.h>
" b9 ?% B3 D% e$ S6 y#include <fcntl.h>3 l* M1 P, e- v5 v, E# X6 P
7 _, q0 B3 k8 i
#define SHAER_RAM_BASE_ADDR (0x80000000)
* i$ K' B8 }9 T6 U) G
" |+ A" c; A, X* p' vtypedef struct
) n2 t. j t4 X8 @9 v{
z8 {* I/ {' t1 l unsigned int a;" E( v/ [- Z4 ~4 c& _
unsigned int b;# i D, m3 h) S% v/ Q/ J; |/ n, D
unsigned int packet_cout;$ v% j" ]4 ]! u& g. x0 k4 J& v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 r' `' g! f4 t' h
/ t; w( t) y: `4 o) e `5 K+ Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 F6 r) H, Z B- @" @# M
unsigned int count_copy = 0;# W' u, U1 W! f0 C6 F
! b7 A1 ?7 V% ~
* ], X! P G6 k
int main()
/ A' X$ p5 k/ T0 R; ?4 ]{; s. o# X! c( o# U" R% q) ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
) d: q/ t) x6 T0 S: I' G3 d4 r pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! p4 u& A+ w( w o
+ j. e) l8 T9 B: U3 T8 M2 b
while(1)6 \, y4 l9 V# f2 f4 I: W, A- F
{/ S! A* a: b4 R& n1 t
read_MSG_buffer(pshreRAM);& h* Q, B; {+ g
}
8 k3 |& c& U+ O: F b- |$ R}4 A0 w8 v* e' K4 t0 M3 D) M
# ^- e/ u, u" V: yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( q1 ?6 W! `; ?2 |{
' @6 T8 m3 Y p9 I, A& ]; | RX_MSG_PROTOCOL buf;+ b7 n( M, `4 a2 v7 h+ b$ _
* L' m1 `2 D4 }+ h5 Y buf.a = pshreRAM->a;
& K3 |4 p% Z* x/ Z buf.b = pshreRAM->b;
5 q% [! ]) z7 K8 [2 x1 z0 ? buf.packet_cout = pshreRAM->packet_cout;: N2 q( X; ]( \3 M, d4 P( @
) ~0 \2 ^4 w0 X! [# F1 k) I7 }. Z if(buf.packet_cout != count_copy)
+ F0 m8 E, j0 u; V& D" W$ ~/ M1 G" ] {5 Y, l/ ~. y# r4 h( ?& g& a$ r& [4 @* ]- v
printf("a is %d\n", buf.a);$ V( u. S1 v" f' [9 d
printf("b is %d\n", buf.b);4 u& g; u# u$ }
printf("count is %d\n", buf.packet_cout);! {9 E% _$ N$ h
count_copy = buf.packet_cout;
7 w: k& g% S) F- T }
' o/ k# Y" X) X- U7 Y: U! @' f$ X else
* \% Q5 [1 v& A0 s; X$ |0 W' c {$ p5 A4 V0 y: s- e- D
printf("No effective message!");
1 X9 V1 I# @' m% p9 z }
1 G/ Q" d! X: f}
: G: h7 M$ a: V5 N4 n, h
3 z- V$ l. C: l6 l& a( y, Q8 `
' b( B7 A$ H- v但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* k$ a8 J- q! S
使用下面代码,对内存使用了mmap函数后:
* m4 N+ ^ k9 Z7 G#include <stdio.h>0 @4 F9 U0 h. s
#include <unistd.h>; s) k, J0 I! `* v# W" [ u0 A+ m
#include <sys/mman.h>0 j T0 R" v8 j; e' u% V
#include <sys/types.h>3 D2 o5 f& @; T0 y6 N5 g
#include <fcntl.h> ^( W% z; r2 R( ^5 E0 G/ ^
6 d7 ]1 b: Q6 i7 X* u! y [" H+ Z
#define SHAER_RAM_BASE_ADDR (0x80000000)# p; u( i8 n! \: N) n
#define SHAER_RAM_SIZE (0x20000) $ |( L9 |" o4 `5 y( i& ~
8 C5 h9 T# G) _; { O2 n+ o& w
typedef struct
8 }1 F" B6 ~6 X- v6 d3 v{) [) d0 i0 E% C9 |& L
unsigned int a;
3 a' J" t, j1 R9 a3 l9 _4 Q unsigned int b;6 I7 ?* K" f, B; y s: M
unsigned int packet_cout;" m, I. Q4 v& I% ~4 v: Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' \9 V5 x1 O1 M; ^5 }/ p! F- v% i: c7 ]' Q
void read_MSG_buffer(int *baseaddr);
7 b" Y- Z1 h9 G9 junsigned int count_copy = 0;
; a6 N+ }! Z2 A/ d/ k" ]- ]) l1 Y# E
int main()
+ r; H7 i2 d, E+ a8 g/ v* r- ^- d) {{
! x$ ^6 K- T" ?6 [* L0 z- k) ` int fd;" K% t- P9 c% \& C! {
int *mem = NULL;
F+ R/ a, Q7 ~1 s
0 _% I2 \; r1 ]# c if((fd = open("/dev/mem", O_RDWR)) <0)) c9 b/ C5 P6 L. i4 w" f
{
: ^3 c# J; [* d. j0 [ perror("open error");# w- [% ^) r: Z
return -1;+ S/ P% R& x- u) ?6 g$ K6 `2 `
}
9 Q2 n( g. y! g5 s" m' A
' s. y, x; k2 Q1 b mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 ~7 F3 w$ L/ Y
1 u- X- _% V$ C: ]9 p+ S
while(1)
/ ^) Q$ F- E+ e6 G3 W* ^4 W, ~ {
3 e- |. o9 l) ~1 p: E read_MSG_buffer(mem);
: x" X4 \) ]9 ~4 r }
/ k& U8 J: B, i, j. W+ }* |}- f ]! k9 L0 K, }0 G
, X/ O* Q/ p8 A/ y x# Evoid read_MSG_buffer(int *baseaddr)
' ^$ ]+ J0 `" @8 j& M0 ]{% ]; z( [: F5 v
pRX_MSG_PROTOCOL pshreRAM = NULL;
. f- n/ z% N9 I0 Q$ }& u3 F. o9 m! n) W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 g9 Y4 ~6 W; F, u: ^9 X9 ^8 S8 t$ `
if(pshreRAM->packet_cout != count_copy)
! n3 C+ \) x$ N4 @( P" a/ Z# F4 A& ] {5 n: `" `- b8 {1 l- Y1 T0 n
printf("a is %d\n", pshreRAM->a);
- p% \* e" K0 o- D printf("b is %d\n", pshreRAM->b);2 M* D5 a4 S- d2 y
printf("count is %d\n", pshreRAM->packet_cout);! Q( e3 ~) A) E) B
count_copy = pshreRAM->packet_cout;
1 W5 K& M; @; f8 t1 _4 h }4 g$ C6 i+ G2 @4 K# I1 r: M2 ~
else
8 N/ i6 X8 y U6 w4 i% \ {
8 f4 V: g0 V) M printf("No effective message!\n");
. ~3 Q$ X2 A$ X* @+ x; `+ F- c3 i }
$ {1 S6 _6 t7 H- F f}
) q5 _- ~2 z+ T; N3 W' q% C4 w0 |; `2 d; h0 }" E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; e8 u. `4 @6 ^' K2 @7 A
5 K! l, X8 k# l$ c
) c5 k7 u/ w7 T( T
7 m6 N. l5 q% l+ z
8 T2 |( x: A$ B0 P0 y" S
|
|