|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & ` y% ~5 _% N$ J3 z( z; K
% o; k4 Q& Y" ]+ |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 r; O, U4 u* z4 n
#include <unistd.h>
D# Z& w5 v [2 y! ^1 H#include <sys/mman.h>" I; l. \# o* q2 }
#include <sys/types.h>
8 e2 _9 n/ d% X) ~& Q#include <fcntl.h>
6 {4 E2 m) U2 Q: q6 Z3 e" d. R- y6 Q7 r1 l. S9 F0 d/ P* i- r
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 t/ I. s g$ y, W( K# V& x: Z _; k" M1 I0 Z/ Y
typedef struct, I- a1 s9 q k2 j4 H0 g: W
{$ l i( p2 \: V+ t7 U$ t
unsigned int a;9 J1 E3 E; ?9 o; d: h
unsigned int b;# E( {8 \, x/ A% T) ]: a
unsigned int packet_cout;& k& y0 l2 x: z9 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" z4 U* P" a6 e2 l' l2 ]( f0 G) n
& C3 S+ D1 i' L5 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ r5 e1 j6 X- Iunsigned int count_copy = 0;
7 G5 i7 j- a; m. N' `5 W
V) X: _# Z& x( t1 ~2 e7 P) L# R$ g3 w( n) B% }# w* L0 T
int main()5 i5 q) q7 T$ N' B7 S7 w
{
8 o' V9 J' r, U pRX_MSG_PROTOCOL pshreRAM = NULL;6 U: l, x2 i" G$ f+ ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, A+ P8 P& ~" y3 v! ? c, N; f5 I3 o8 ^
while(1)
5 ^# t# F5 K7 a r- A; B8 Z9 h {; T& m! }5 J2 J+ N" |0 J2 B/ m8 y
read_MSG_buffer(pshreRAM);
8 {5 B) k6 L$ s N# T: { Q }
\% m- W. u* P}8 f% o0 d8 w2 l6 J
. w! b- P3 Y0 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, W: C1 t) P! @; J( P{; N6 [& I3 H1 {5 N0 }0 F
RX_MSG_PROTOCOL buf;
) `/ C0 I' u! i5 Z7 A9 {
, m3 R) W2 l0 ]- |$ s buf.a = pshreRAM->a;% N2 ~( S8 B; L. v& E8 j
buf.b = pshreRAM->b;5 q @1 j- L3 L4 z
buf.packet_cout = pshreRAM->packet_cout;$ i) j# r! [3 j z1 W7 e/ z) W" a5 i
( J/ g( E3 Y9 k8 r8 k if(buf.packet_cout != count_copy)
$ P- q' r" h; s% k0 W0 w {
J: S( y: f7 O3 g printf("a is %d\n", buf.a);$ W- \- v9 y& O$ v( Q, M
printf("b is %d\n", buf.b);
+ P" Y# U4 R4 b4 H printf("count is %d\n", buf.packet_cout);
6 p$ m9 j) O* y) s9 @+ V count_copy = buf.packet_cout;
- G) Q+ ^, Z( Y" x }* c5 F! {+ w6 E$ y, n3 l
else
- R6 }2 R1 }6 q1 h {2 Z2 P+ z( ]6 r% I5 ]" K
printf("No effective message!");
. f& N0 {" [1 H2 O3 A }
9 L! N$ j% V+ b}& x& K) B- x3 D% d5 c: V* G9 @
9 _* Z/ L9 n- p3 N: T
8 ^! {, C5 g- D. L- ^( X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 E6 }& O5 |- p4 h
使用下面代码,对内存使用了mmap函数后:3 s/ k8 s3 i3 e4 B
#include <stdio.h>4 O6 I7 [, R/ Q; S
#include <unistd.h>$ J$ L2 I0 |: G
#include <sys/mman.h>
# |9 O( Y' _5 ]) S, s N; K#include <sys/types.h>
2 Y9 O7 ^" E G' N# q; @, V#include <fcntl.h>
# `" O; J0 T0 V3 }2 H, I1 t4 v2 m" H9 B8 x1 u% g- n$ I+ O
#define SHAER_RAM_BASE_ADDR (0x80000000); ^8 \0 B" K- u s. x
#define SHAER_RAM_SIZE (0x20000)
# @2 S+ W, u# d, o' b+ e7 n4 a, f0 W# X; r/ ^: a. d9 b
typedef struct2 s. C6 E, K& W1 F6 w
{# E5 b+ P& n$ R* S4 m- x! {& `0 z
unsigned int a;9 E. g9 o5 T! |2 V/ E
unsigned int b;
- c4 o" l1 n7 ?. O unsigned int packet_cout;
3 k" O! T, ]. `+ d8 ?* Q( u! j. ?6 S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ L% l: u, a, F0 h: ~+ B$ h
! K# I/ {; ]6 x) y# u- I2 n: evoid read_MSG_buffer(int *baseaddr);6 f0 T1 Y" }/ N* T0 L+ V9 ^: p
unsigned int count_copy = 0;
3 O2 x( y8 e# v; y& B& n. ^* {, Q8 ?5 C6 O7 w
int main()# z, q! d8 q9 t+ f# e$ [
{
+ }+ j) g) L% B- e$ R% w6 m int fd;
. a$ B; N1 N$ ~" q$ F int *mem = NULL;
& D* T( o. C' c2 e: W; z* T/ K. z. j/ s
if((fd = open("/dev/mem", O_RDWR)) <0); G" U8 A4 K# n9 z+ f( f
{. Z4 ~" k" ~! P7 p2 U/ f# Q* l
perror("open error");, h" D' Y2 A+ M6 }. t/ m7 A! I8 \
return -1;. ~, j6 z& h- X4 d1 M/ n
} ~! T! l. }: E& t) m, A+ U
2 P9 [$ W3 x& @* Q S8 {
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' `3 f+ N- u0 P5 n4 ]7 ~% Z
/ ^! I8 A* B+ t! t* D while(1), Y% ]# v# i, T* W# `
{
8 A# s' X+ \, b% `: E+ q: i1 ^/ }' I2 I read_MSG_buffer(mem);/ D( k5 Y! ]- c( @
} u ]# D7 ?1 \' ]& c
}
- }( \$ K( V) J- P
3 l% h5 o5 K' I B2 W( ~+ V+ W+ ~ {; Uvoid read_MSG_buffer(int *baseaddr)3 H; ^. v" c9 H& k( X( @
{# h0 t# {! t6 J" |) @% K
pRX_MSG_PROTOCOL pshreRAM = NULL;5 j0 H6 j: E# g2 A# B# v
1 g5 ?& d* Z/ p- `: z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; o/ ? L$ v4 O+ I3 u4 F M
/ `' q/ `) g- o! L if(pshreRAM->packet_cout != count_copy)5 a4 y# ]5 N( b3 Y
{$ h2 ?: [ e% b: _4 g+ s
printf("a is %d\n", pshreRAM->a);9 p$ r8 W2 s+ \% e# ~+ q4 _' K
printf("b is %d\n", pshreRAM->b);
, l! j- r( k- ^ printf("count is %d\n", pshreRAM->packet_cout);8 q w: w# H6 c( t7 S5 C
count_copy = pshreRAM->packet_cout;
+ _) h$ E; I' v# Z9 M! x* h }
+ V" d5 v& [) l0 ]2 p else
7 H5 p u& h9 r" U1 C2 n {) |4 M+ e& O* H* N. W5 M
printf("No effective message!\n");/ w+ B8 I1 g5 A9 c3 F1 n5 B6 l
}
p' ?# o/ f) U) J+ G9 V) z. d}
/ C5 L" L. P8 P4 m+ K. J9 Q
3 N# U6 E9 S" u& F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; v. p# @" t5 n- a A n# u0 t5 ?, J( |5 n& j' j% Q, e
/ R9 W6 C2 Q; e9 X* k6 b
! q0 M! Z' Y* N5 I+ j$ v6 B
6 t- ^9 M" \& ]7 i |
|