|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ |7 ]. x. X e5 o8 }# Z: o7 D2 z' N) ]6 B& [* ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# s2 m3 N* P- Q! d8 \: b5 }* N#include <unistd.h>$ T( H% T4 h3 _$ n* L
#include <sys/mman.h>
7 B* j3 i* g1 S#include <sys/types.h>4 e; l; i) W# |4 F, e
#include <fcntl.h>
4 q% K7 K& S1 a& X; {1 S5 A
, t) h+ D: u! ?5 c4 a3 Q) t#define SHAER_RAM_BASE_ADDR (0x80000000) ; T, ?7 _2 \ s, K+ Q
% }$ C, V1 a( z# k/ l3 a1 d1 m u3 Atypedef struct9 H. S% r2 S/ Z( A6 Q2 q
{
$ K- o9 o! K9 F, R7 j' h& c unsigned int a;
, K* n) x) [8 I8 [2 B unsigned int b;
) I) V% G5 L/ _" N. ?: b* z- N" O; Y8 v unsigned int packet_cout;+ b+ _3 S- T' X$ Y, V$ [9 Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) u1 v2 \6 c' a C5 F/ i! x
8 K/ K/ J# `( m5 Z$ lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. u( y, F3 ^. Q" T& q
unsigned int count_copy = 0;
( M# b1 F z' b7 l( r& ^! T: C" r( Q( Y
0 @" q: S, }; B5 e- oint main()
+ w9 L' p' u, ~& w$ d{) E" N, b- O- _/ \" e
pRX_MSG_PROTOCOL pshreRAM = NULL;! H5 P1 ?: g$ m' T0 [( I4 s- A
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" t. w. v N, B" d6 `7 a
. Q$ G \0 L+ Q while(1) d: `4 I j" w3 Q1 [2 u. O
{! j [. l7 J0 D
read_MSG_buffer(pshreRAM);" y0 S* k$ l8 y7 d% X4 T/ T( \
} & i; S: `4 N0 C. M
}6 [! Y+ g; {1 ?& {+ c( \) o' G
4 K! i1 H( ]4 C: ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' q4 W, g9 c- [{
6 A! S! v/ |0 U/ M' n RX_MSG_PROTOCOL buf;
5 D7 j0 P" |4 e0 |( Y5 y
/ |: @# r7 a5 g9 l; d; Q buf.a = pshreRAM->a;
1 Z" w! h# }7 b' D buf.b = pshreRAM->b;
% `7 M8 ^" b4 } buf.packet_cout = pshreRAM->packet_cout;% T0 a& x6 w+ s! L5 d8 ]
! i$ N4 k% [ T# t$ x7 |- U0 D
if(buf.packet_cout != count_copy)9 P/ Y" m" j* l9 h
{
6 }; K1 ^& q6 w" p7 C, B printf("a is %d\n", buf.a);: d5 \* J4 B' v$ g2 a" F
printf("b is %d\n", buf.b);
8 t2 q0 [) L2 e6 m' i4 G printf("count is %d\n", buf.packet_cout);! X" R$ Y4 y* N R: g& A
count_copy = buf.packet_cout;
4 {* w7 m- a6 @$ e8 ?. C6 t8 J }
9 }1 @" e# v( Z else
8 w2 }* S* }2 E1 z' B {9 j$ b3 G) H7 `1 r0 Z9 `# {$ \
printf("No effective message!");
U# x6 c( X, T, U& | } c3 U* S- T8 Z! W+ Y' a# M* o2 Q; c9 t8 F
}( h% N) \; U) b9 e' F) u. M. T
+ h% C) i" r s) P: n5 d/ n O% R8 u4 x" C+ A# O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 i7 l# x1 A; E. T: R, Q
使用下面代码,对内存使用了mmap函数后:
" h6 z+ V: l$ a0 F#include <stdio.h>7 p2 s$ x/ u; F% }+ d
#include <unistd.h>
: k4 q Y: u7 O% f, D#include <sys/mman.h>1 e9 z- u' ^# I! g( \
#include <sys/types.h>' w1 E4 x7 f _; H0 t& i
#include <fcntl.h>
3 P# I# Z0 A; Q% U- a8 u6 W* i/ j& ~! j; T- G; `) Z7 E5 j
#define SHAER_RAM_BASE_ADDR (0x80000000)7 T3 c9 p1 U' f. J" ~1 |
#define SHAER_RAM_SIZE (0x20000) 8 Q& J! V$ j% r' L* m
+ Q' e; ^) X$ S( I* i
typedef struct' i& e9 T1 k# H
{; n- k! r. l- _* _, H! L
unsigned int a;1 D# i b. v) R- o3 ^6 k3 S2 X4 X
unsigned int b;
/ l% o8 U3 D/ t unsigned int packet_cout;6 x/ a2 d: ?( U2 g9 M. f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 U2 s: X6 S ~: [7 A7 O- D
; R" D: X# g& M% H# ?void read_MSG_buffer(int *baseaddr);
/ ~8 G2 f4 Q# _& junsigned int count_copy = 0;0 `3 b, K) E7 Y
0 X9 j0 n; } \4 ]( P) U. n
int main()' Z4 @9 M1 m8 t& t2 A3 O, j$ \% n8 H' B
{7 v; w% F# V' v- N: _: x5 {' ?
int fd;
1 d: A, w+ K+ j3 @' h int *mem = NULL;* _6 ^' K# C* m& F9 L% h
+ v7 i8 L u! f4 C2 z
if((fd = open("/dev/mem", O_RDWR)) <0)
( }; i3 I, r) @7 b- n {; {. g5 Q5 w: s C2 I
perror("open error");
& _: ^' i; ~3 ?, l+ P return -1;
; w Y; S0 V3 t" P6 v4 I) |5 t }2 W/ h2 D8 I) s. ?" ?$ i
4 c3 o- u4 V, J( R+ d7 `/ o mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 z* `2 g; W! G3 A8 \2 U3 x8 }% i
while(1). c/ ~: L* G; I+ u. L1 H
{
B/ W" B5 G6 ]4 E' ~* p( i6 j read_MSG_buffer(mem);9 I( d/ n' b5 s* v: P, H' I
}
& J9 D; J% ]. s6 I; Q! h z}# G7 Z% o+ I* d- n9 o9 m7 \8 {
+ N0 l; F7 x( g' H0 F
void read_MSG_buffer(int *baseaddr)
3 d6 `! Z7 m0 Y" V3 i9 [$ K& ?! A% J. I{
g+ {" ~( ~1 {! W, V pRX_MSG_PROTOCOL pshreRAM = NULL;
) H3 [# @" Z/ M: O9 p) W+ W
7 r) l. q+ Q( Z5 k( G5 \0 E- [- r) R pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) P/ p0 o/ L/ x: m- t
, n9 [8 P2 \5 M: N if(pshreRAM->packet_cout != count_copy)) d# }' }5 D8 r
{. ^9 h/ h- }' k3 E" C
printf("a is %d\n", pshreRAM->a);9 l2 W m- X! E
printf("b is %d\n", pshreRAM->b);
. Q) a* p/ a( ^# y printf("count is %d\n", pshreRAM->packet_cout);
5 b* B+ l5 J5 ~6 J9 V/ _ count_copy = pshreRAM->packet_cout;$ n" A# `; `' |( n/ O
}
( Q1 |6 g* v% {) ^/ K else/ ^: W/ x/ t Q6 ^1 U1 w4 E
{
# K2 F- z/ B" v printf("No effective message!\n");
+ H' c1 A4 m3 Q2 ]- l& { }$ D( }# ]; J# V- A+ ~9 j
}
8 K$ p3 p" E/ U% B1 d
: M, C/ n0 h& r3 t没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) t# C! B6 h' \$ ^7 C- E
: y) A% B) z a1 c) q
3 c' X( W8 E7 X
3 Y4 [) ]5 @' z3 T3 T; h1 P$ O
" P8 K7 ~2 ]& e# t' L" X |
|