|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! \+ r" |, H. K' y
d- L5 Z1 R* r: R; z, tOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 W0 O8 w% z9 d# J9 a3 p i#include <unistd.h>! `: F3 K( u3 ~
#include <sys/mman.h>* Z$ W- z2 l9 p* X0 ?! T
#include <sys/types.h>
0 W( G$ {7 f1 q2 ]. }$ r5 J, \# _+ ~#include <fcntl.h>
6 a) `4 s+ [: q2 L) @3 }8 I- v) J% y B" w0 }$ y# ?% ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 ?# Q+ U3 K! R9 y% ]& }
6 p( A# I9 v& Z& G( etypedef struct1 J! S6 Z7 s: u5 \7 @! Q2 x
{
2 F& B! P1 h( l+ ?( x7 X unsigned int a;
+ [8 a* Q7 u" H) A8 p7 i$ f% k1 B" s unsigned int b;
2 [. U- S9 X& H4 g) ` G! s unsigned int packet_cout;( k4 x6 x7 S# \6 O: f' K6 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- C' K' L: E# r0 G/ F" B
1 i( D* W" E( W( L2 c4 ?, U, ?2 Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 U' t# G2 c d/ b; m2 junsigned int count_copy = 0;
4 _) n9 ]" l- S# g( H7 t8 ^5 r/ `" T! o, I' n3 M
/ R9 u, a# K/ P8 {0 }1 k4 M/ a, ]int main()
+ G; P6 ]3 j( V{6 Q3 t& y. o9 s6 P
pRX_MSG_PROTOCOL pshreRAM = NULL;
; Q* K# Z: n7 V! N e2 k, }6 ]# I5 ` pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 V+ B& J3 Q8 e
0 K! o8 O6 r5 O while(1)
& p; d; _- u( x8 V6 e/ H* j* x {8 u+ t& w- G" B5 C6 n
read_MSG_buffer(pshreRAM);
6 G' W% R: P5 h8 E' r }
! x$ |' L) |8 e8 F* i}. R, m9 s0 r, T4 B
$ q9 ~7 q ]" J7 S; Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 E9 R" F; y7 f2 {& T2 k
{4 B+ t i/ r; o/ p, u) d" Z. e
RX_MSG_PROTOCOL buf;
& ]+ j/ K, g+ A # I7 K1 o9 A2 T; T
buf.a = pshreRAM->a;# l. Q0 `3 a! t' r2 y/ q
buf.b = pshreRAM->b;% T; d# p0 R8 q5 f# _1 f6 x) Y9 Y' T/ B3 r
buf.packet_cout = pshreRAM->packet_cout;
* {& V5 s. p3 ~' X5 {
! P( ~: Y U+ Q0 P7 H3 O if(buf.packet_cout != count_copy)
! a Y$ J, e. X/ e: N3 ] {$ h6 |/ I1 f/ C7 |$ D2 K
printf("a is %d\n", buf.a);
5 f. V. h. n1 t printf("b is %d\n", buf.b);
; Y* B) R( y; u' O, ~- r& p3 L6 J- b printf("count is %d\n", buf.packet_cout);
, K4 M. t6 a0 m" Y4 r( P count_copy = buf.packet_cout;
, t# H7 l9 f* B0 [1 M7 o# ? }/ h! C1 k# g5 H4 P5 A3 b
else9 k* R! u: W; ~, h+ E
{7 S, ~7 {, Y* e' T& Q0 C
printf("No effective message!");6 [( c% F0 O' K. e- o: k4 V7 V
}
0 c& ~/ u2 I8 x( D2 Q x4 ]4 A: W}! ?5 ]! k- @3 ~3 F; ?
. E' |* X8 C% H, U" D" w8 R! M
$ x2 G, K, w" q5 N, z+ y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 w- U/ T- P- v使用下面代码,对内存使用了mmap函数后:
. V( S1 v7 \' s8 T5 X; W Q#include <stdio.h>8 h2 [2 o; i! `) J* e
#include <unistd.h>
, O9 y# O0 C5 f0 z#include <sys/mman.h>1 o9 j& n u5 H4 @
#include <sys/types.h>! c0 }; P" }) \; U9 Q0 y7 ?; Y- w# R9 m
#include <fcntl.h>
. R6 [3 ?0 t2 s4 k6 H" D8 P- z( O7 ` r8 Q( O9 c& Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
, d! J. F, l- X) p' O#define SHAER_RAM_SIZE (0x20000) : p) F. o$ {- ?' u7 c
4 a: J: j: Q- o8 V# D
typedef struct+ n, y, ^ L) X$ E. S6 R
{
8 Q2 r5 _0 c7 U4 F0 f7 ~ unsigned int a;! \& U' K7 K3 X- T, D
unsigned int b;
% f! V- T8 I4 t' E: W: i) r4 x! B unsigned int packet_cout;
* v( _5 ?' x' E9 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% _, W% E3 T& H- k' Y8 P( }4 O4 i
. i. J, g) h b3 ]; b2 X/ ovoid read_MSG_buffer(int *baseaddr);
' x) I9 q9 G( Zunsigned int count_copy = 0;
1 X" o- |& f/ E8 ]5 c
% ]8 `4 D$ Y* V$ lint main()7 C" h$ g6 D$ U: V
{ C2 N: A4 r% O* A1 l; H& W. P
int fd;
3 P" x6 y+ b, {7 e" g1 B int *mem = NULL;
) T/ S) s; o' U4 N P( e+ B6 ^2 h! R$ G$ b( L, l
if((fd = open("/dev/mem", O_RDWR)) <0); P2 ]* O$ V: f% {5 f$ Q' n3 V
{
2 G3 n2 H4 Y5 P& A9 q7 |6 f# ^5 I3 O perror("open error");4 x% z! ]' ^# ?
return -1;% q5 S# J m* J7 P+ k, W
}; j" v) a! J9 E s
' V1 B: p5 X7 h3 T9 [* G/ y( f1 c mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& M6 o' v7 o# F! h; z
! {5 K$ p* S2 D7 c" ~# ~& y0 w while(1)
) ?7 ? l* O& K8 {& H, s+ O {2 `* e$ q1 i, Z# k; ?2 D) s/ \
read_MSG_buffer(mem);9 H1 l& C7 B/ }6 O/ t+ ^) r
} * E2 W. Z& Z: _! z
}4 I' H( ?, ]' n
2 x8 z0 k% k/ `; T3 Q2 F
void read_MSG_buffer(int *baseaddr)
2 r; Q& {+ ^7 _; q# F2 Y E{/ n( h3 O3 _ R. j* Q& {
pRX_MSG_PROTOCOL pshreRAM = NULL;, p* B$ Q& t" D" }: J, J* Z3 p1 m
: f" I$ o# T5 r" ~& ~/ I pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 M: J# i2 j0 W1 \! l* {8 p8 L( }/ q" {+ F3 a2 S
if(pshreRAM->packet_cout != count_copy)
, U; {& R, L4 \( Y/ I* n) l \ {( T4 F5 |) L1 I+ [- D: Y
printf("a is %d\n", pshreRAM->a);
* Y9 _ m& j. Y$ H7 ^ printf("b is %d\n", pshreRAM->b);8 I( F8 D& Q: ]: ^! E) v- S3 C
printf("count is %d\n", pshreRAM->packet_cout);
! j' C' i8 a6 ^! y3 J0 F) \" u count_copy = pshreRAM->packet_cout;3 M+ Z, p" S2 ~- Z/ H
}
$ R9 D: j' ^7 ~' U% B; g else
2 Z1 M5 }# K8 w6 x: z+ a0 B {
! \, Q/ s) L% |& v" [ printf("No effective message!\n");+ q& K' N5 W. Z6 z& a
}" J9 @6 ~" K/ s7 S
}
" ?4 m4 Z j6 C) {0 a: O3 e4 @) O( H# Y1 p) i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? i6 ^7 `: v2 g- K* [
) S. L- j0 ]% u' A5 R4 e- q
* }* R- B; v8 }* A5 C) [7 z% O. u5 Y1 z) X
) G, J9 v# ~. Q$ R4 \: {% | |
|