|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & U S& R: b- i. n; b, ~, ~ I! C
2 A: I4 `+ _- L# D( MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* G/ w7 \2 T3 n, x7 A v
#include <unistd.h>% h6 s# D) w: y& k
#include <sys/mman.h>* _' k4 Y2 H' X! `5 k: H! k. h
#include <sys/types.h>
2 }: Q) l4 e8 v& h! U0 D0 f" j#include <fcntl.h>! `& F, N( y2 |0 Y/ H
) F: f1 k/ Q% c' T" ~+ Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
! m* m- p0 r1 B2 p/ j
/ V: e4 k- \4 ~; Htypedef struct* l Z3 J6 @/ _7 k" k
{
: V; ~3 U5 @2 c: N* c. K2 g unsigned int a;
# V5 b; r( w. P, q( @" w3 J- M9 R5 r unsigned int b;5 x+ }8 i7 N7 j9 p5 }+ e/ z4 W( l( g
unsigned int packet_cout;
" w7 B) @, G4 O4 q5 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ E: Y; l5 Z' r v/ s
$ I3 C+ W1 w- ^3 Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 A: ^+ L* \1 H7 y2 w6 F+ [unsigned int count_copy = 0;
* p k) _0 D4 s/ P& p7 x/ N* I! {. Y7 n5 | S: b( _+ ?+ H# Y W
, B2 |5 d. o2 \' h( ~; ^
int main()
/ L% i; O( S7 O3 V{. Y# g; {$ p" Q S0 Y0 T) \
pRX_MSG_PROTOCOL pshreRAM = NULL;! }1 H6 ^2 K1 A; b6 Z- q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, `1 X7 X0 E8 v8 X) g; ] c6 a6 R7 s5 \) s
while(1). O6 |4 X+ N8 k& R& z6 M0 c
{
) q% j/ Q0 h' D- { L3 e: z read_MSG_buffer(pshreRAM);
% x* K' f. D2 O2 V u } 8 n' t/ d! L4 | o
} N& O" v8 K Q3 V+ e
+ r; f( r8 B, L. B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 M) e" A* J, X{( s" V' i* ^& h0 b
RX_MSG_PROTOCOL buf;( c5 n) p8 m5 f! g& y2 u
7 }. I1 Q0 ]: j; o: ]
buf.a = pshreRAM->a; E3 `2 ]* a0 {* S
buf.b = pshreRAM->b;
- P- m' P% R0 T- e( w buf.packet_cout = pshreRAM->packet_cout;
) Q; a9 J6 a# Y+ e: O% o 0 |- a9 L) t% O7 ?7 t
if(buf.packet_cout != count_copy)) J1 Z* Q8 }/ m; O
{
8 N/ E& J' Q [ printf("a is %d\n", buf.a);
, I; d" C% N; @ printf("b is %d\n", buf.b);
8 b' ?8 u7 \( h printf("count is %d\n", buf.packet_cout);
j U5 `" g" h N/ U* \+ [ count_copy = buf.packet_cout;4 G. j1 C9 q! q# L3 s5 l
}
. Z" n& p/ e3 v" F/ m: c else
+ w0 y, p- D0 a9 [ {
9 ?6 G2 e+ G/ M) E' @ printf("No effective message!");9 E2 d \' r& R
}
b1 B( H1 O! ~( {0 U h}% A; C! [- U- F- m! P6 V
% I' `9 L; F% \. S9 U( B) a
- U: _+ p# Z! @. b% C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( u4 K5 [" ~% | h使用下面代码,对内存使用了mmap函数后:& F( j6 d7 Q* E1 k& A# g: \; T
#include <stdio.h>9 [% y ~1 V1 k7 f$ _7 W9 ~" U
#include <unistd.h>
# L D6 X* M! ?0 w2 j# a#include <sys/mman.h># U+ x4 }" u1 O8 ^4 V
#include <sys/types.h>0 E1 j- Z8 T# H" {5 f( q7 |/ S
#include <fcntl.h>2 r R% T- U! J8 F
7 e* R% J( J M) O+ v. W#define SHAER_RAM_BASE_ADDR (0x80000000)3 P5 P( e/ e) n+ _! |* c
#define SHAER_RAM_SIZE (0x20000) 8 z- t1 S# r. R( p! q
+ A6 L4 ^( H6 y2 G# }! b
typedef struct+ n1 g4 m' o' S9 V
{
7 H; Z5 c) b$ D1 S6 ^ unsigned int a;1 q" F- a% c) T; y
unsigned int b;
0 x$ ~; Y2 H$ {: n unsigned int packet_cout;; `* ^' z- P$ m' o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 q1 o3 O& H+ ^
) W" g% o' `# x- S7 o
void read_MSG_buffer(int *baseaddr);
- w! \: l' d8 I+ T. ?& {unsigned int count_copy = 0;
; c" ~+ s/ G& k+ J5 u& P$ I% M0 l) p# G, f# p! X; u3 o* K* o
int main()
7 F9 W+ m, k7 q. j. q{
9 A; L. h! y9 o$ M int fd;
% j1 i/ p/ u' L3 ^ int *mem = NULL;
3 U$ _# \& u8 u9 T! U" C* P( P# z- ]4 n) M8 \. U5 Z6 l
if((fd = open("/dev/mem", O_RDWR)) <0)
2 {" b0 Y9 X2 M5 {: @( w {
+ {) [& U- E( c. ^& n0 h5 f perror("open error");
0 Q4 m3 F5 {- D return -1;) n/ n! u6 [( L( V* n
}4 N! m7 w6 Q( y4 j9 x& g; O1 R, D
* ^) z8 [) {2 W+ {% u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! P5 _1 G# |1 G( a
L; z& ~+ @* f; R# X1 y
while(1) K0 U) L+ m' A
{" z. {; a/ G# [/ {* `6 ]
read_MSG_buffer(mem);4 s3 `" e! L8 {! ^
} . j# j& C+ P! p$ V9 A
}
4 `" E! v" }6 P) @' o! \" a7 |2 G: T, b2 d( ~- j5 ?$ L
void read_MSG_buffer(int *baseaddr)
: h6 s, B' z$ u: r) ?3 }1 H+ w- f6 L{3 a1 p2 D: }2 I/ y
pRX_MSG_PROTOCOL pshreRAM = NULL;1 ^; I. X4 q: h
$ L7 a( a4 [+ g% t0 I pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 F" ~& D! B& J2 Z/ M; P
. p9 P2 J: ]: c( @2 B if(pshreRAM->packet_cout != count_copy)
. c) _9 l7 {* p1 Z9 B5 | {) q2 \4 O& F* L* ?8 a
printf("a is %d\n", pshreRAM->a);
6 T9 j+ _6 A' P( c7 ^! b printf("b is %d\n", pshreRAM->b);
+ T/ i; P' @% I$ W printf("count is %d\n", pshreRAM->packet_cout);
6 i2 c4 N+ d- T2 X8 _9 x e count_copy = pshreRAM->packet_cout;
, I! `4 t* K; C2 j" f% O7 E }, Z2 P5 ^1 _4 P' k
else; M' j/ W* M6 O
{
5 k0 l! j0 \2 I' A; A& r printf("No effective message!\n");" n5 t4 {) f R6 m4 U
}
& [7 X8 t5 M+ O2 G' \% h}
. u5 e# e: H" \3 f& t L2 L3 `2 ]3 u7 a# @+ _7 S M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, u3 r9 n1 U) f: @ \
! P; t- V% r1 \. P' d0 n9 W) i. D8 ^) s5 A# m" A) g. E2 v# U+ @; X
3 |; R% ^: k/ {- l F/ t/ ]8 [
% t/ i. ~0 F2 y7 k, I8 X5 x. n |
|