|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ P% f& [2 j" T6 I' e+ J$ g
' d, B% P! U0 K" e( n& o2 xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" P/ j8 Q3 s' O/ q/ P l8 u
#include <unistd.h>
# e, s. L2 \: b! R9 a#include <sys/mman.h>
4 g7 I4 b& F8 ~+ W5 J$ q#include <sys/types.h>2 ^; a0 `+ F5 s% T
#include <fcntl.h>
1 s! }% _( q+ ^% V* H/ [" l, S; B3 ?1 K% a, C7 I8 P5 o
#define SHAER_RAM_BASE_ADDR (0x80000000) ( G& A/ N8 | Q" G1 ?4 K
; [8 t/ |# c' N- V# A) qtypedef struct
0 W9 a. r! W/ L* h3 h7 O{
, r7 Z2 R7 j- S) ~; ` unsigned int a;
7 i" s; y$ J& l. [" @+ h unsigned int b;) {: s; y1 K/ X& x: n, R
unsigned int packet_cout;
; n+ \# x8 ?" P( G( `3 R7 ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' O e( ^" I% ?0 U: V
$ I+ D( ]9 O6 t* u0 ^, i! V$ f! Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ s9 N3 i0 C, _0 w! uunsigned int count_copy = 0;5 t# ^. e% b4 I i4 M
& X( u/ M$ ?- r G; C# e* A% }
9 T4 r: L# e& S) H$ }! ?4 K$ Sint main()
6 k% \# l$ F7 A6 C: Q{4 q8 I' y6 b; j' r4 L7 \5 X' f$ r
pRX_MSG_PROTOCOL pshreRAM = NULL;# |! N3 p4 S! l7 @7 f/ Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' y. A' x1 E' c, g8 c
1 s$ A( G. l: l3 J1 a- z( a2 i while(1)
- ^0 g& Z8 J& }' g! `4 a {! B/ o* j' D7 N8 Y0 u5 { K
read_MSG_buffer(pshreRAM);
: P. I6 |/ ^" n1 ?1 H4 x }
9 c/ I7 c% }0 t0 _}- N/ l6 R w* x* ]+ R: i
) z |+ k9 S0 o( ?$ ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ e8 X" S9 o% l4 n. ~5 S
{2 d# r0 z# k: F8 m8 H
RX_MSG_PROTOCOL buf;
' }* T L) w L1 i5 E0 z
' K- u' H. ]4 L" W1 Y& n+ m buf.a = pshreRAM->a;
: V1 J& X# ^) X4 C" I$ G buf.b = pshreRAM->b;" E% I- y2 _8 z3 V, s* P: t
buf.packet_cout = pshreRAM->packet_cout;3 F( q, e. w6 L. O. m
- ^$ Q0 o& M7 q7 Z, E4 h4 @
if(buf.packet_cout != count_copy)8 k0 |. f+ G# v" U! h# t4 m% U
{: _9 x' n7 T9 \$ Y" Z! D! ?
printf("a is %d\n", buf.a);5 j( F# {% \* w1 t8 V
printf("b is %d\n", buf.b);
; E4 t3 V+ D2 p printf("count is %d\n", buf.packet_cout);
1 J$ Y: z4 e2 M count_copy = buf.packet_cout;: E" N: ?4 X" R7 X# m
}" T2 f6 p5 }/ V& ` E7 d
else
6 E1 |4 S' |6 T9 p {
2 \* r" t5 a: |" j2 b! I& k1 k printf("No effective message!");
0 u7 g/ B0 O; x5 U7 E1 c } f1 D2 G( F# r
}
; N$ Q! q0 M( s; S1 l6 ? }6 }* S; `# Y2 H
3 a( i) K; K4 U3 B& F. V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ H N6 `3 {* m! W1 D, Z1 P- ?
使用下面代码,对内存使用了mmap函数后:- h6 E' m" `6 d- J7 h
#include <stdio.h>
2 P- C. W. u q0 a0 W$ m/ o#include <unistd.h>
# w# ?9 s& f4 c" H5 {' c1 u#include <sys/mman.h>3 w; d, _# P' w9 y; I
#include <sys/types.h>
5 z0 C. \* g% V5 l0 U" F, n& ?0 w#include <fcntl.h>
0 N$ Z- B4 d4 x
% ]7 ]) _2 U2 e, R, n1 ]#define SHAER_RAM_BASE_ADDR (0x80000000)7 |* {8 b$ }: b8 B% P* d/ h
#define SHAER_RAM_SIZE (0x20000) 5 R5 i7 ]4 V/ R6 D2 O$ @1 z
3 s# q' } E7 O" |& ctypedef struct
' g3 }+ U* N6 K6 s. }7 P" c) M9 d* g$ c{
" L1 r6 V2 ^4 N( [4 i |1 |, j unsigned int a;+ R. M2 p# n0 d' i0 x3 h, m; v
unsigned int b;
6 M* U0 ~4 P- c- H+ k unsigned int packet_cout;
, A% }/ ~. {* q' f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 r7 [6 q0 Z# t4 {" v6 d
% N9 [% T+ s7 ~* z5 mvoid read_MSG_buffer(int *baseaddr);
0 R( N1 a& G% j2 J8 {8 z% junsigned int count_copy = 0;
' {0 P7 d& c7 x: |5 @6 \/ V9 Z- T/ {: v1 q n, w; V! p
int main()
2 s, T, U. l( L( X{# V0 M" A7 L5 n9 |' \
int fd;
* }& ?% o+ F7 B: D* m2 k4 Y4 ^. Z int *mem = NULL;3 C- L: Q6 j7 K9 j
' a# `, @( J$ I2 N
if((fd = open("/dev/mem", O_RDWR)) <0)
: o( l, \6 i. x {
) I( {+ ?" l/ v6 u- Y perror("open error");
3 `0 k/ o1 P6 e* ~8 \* m return -1;
2 h j! e& c) k3 o1 A& O# h# T* o B: ? }
% f( ]7 z0 h* o: h; F3 G ) M0 T3 g+ s, g5 x4 B& C' q6 w2 W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 k! f! ^! Q2 |- M& t4 v7 _. y; E+ ^- m& h R
while(1)% ~- M. k, ]% d/ t! E
{
1 [) ? I) [; x, S- r read_MSG_buffer(mem);
! h) X; s5 W& ~+ c q: V8 I# ] }
$ u0 ~' r( j/ b; ^9 L, L) F* F}
U7 |% i4 l E5 |4 |8 P. h; C9 C$ E' |0 e9 Z
void read_MSG_buffer(int *baseaddr)
7 ~+ l1 T: d4 |- a5 T( b8 m{
& y: S9 g/ y) Z3 z, w( ]: {( t pRX_MSG_PROTOCOL pshreRAM = NULL;
$ l6 _- D0 q9 j Q, \2 f5 Z" ?! Z' N$ e9 W, _" |
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ j3 s' s1 F( J# X* D) l& w N9 d
0 m: H# ]* m, r9 U) p% c L if(pshreRAM->packet_cout != count_copy)
: G' v6 R% S. y9 w' b {; Q9 I1 l! \0 w+ s6 y0 C+ |
printf("a is %d\n", pshreRAM->a);
/ Q; U) [! ]0 L- c6 ^ m$ r% _ printf("b is %d\n", pshreRAM->b);
) j6 w9 e# Q7 [$ g# B printf("count is %d\n", pshreRAM->packet_cout);
' N- C( f9 X1 ]* V8 P count_copy = pshreRAM->packet_cout;. I2 Z8 l8 S4 a8 }
}5 V" u# N: x# ?* X( J
else/ X0 h: p" V: Z7 m }, O
{( Z+ W! E) c/ d/ Q+ b: Z) a
printf("No effective message!\n");, d3 _4 q6 A) Q( H
}: d. E0 b! e" P0 A+ S/ }
}
8 c1 u2 m3 f6 O
2 z9 }0 G& G/ G# o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# k2 ~# Q |! I$ i4 D9 J, p s1 k) ~7 Q7 E7 W$ s. K z
p' }( [2 C0 r: r( T' R/ F0 L
& I8 k9 n' d9 X/ L* e3 ?( v8 w8 ?+ U3 R1 X+ X% Y
|
|