|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 R$ F9 o( Z; |* s$ ?
2 Z1 W: l* a0 FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ F1 G4 W4 [ Z" J4 I#include <unistd.h>9 D/ x' _$ o/ p
#include <sys/mman.h>1 \# a8 ?1 v- p/ a& p/ p# `
#include <sys/types.h>, J8 R8 o0 |0 @4 E
#include <fcntl.h>
+ J% }' g4 m2 |5 p& M
8 H. W/ a0 d$ c8 e. r5 ?$ t#define SHAER_RAM_BASE_ADDR (0x80000000)
: ]2 P4 l$ b- X9 q) X9 `, g5 M0 R
typedef struct
7 k3 Q: m9 G) L4 w' m5 m{
/ j! q1 B- x, o$ _6 i0 h unsigned int a;
* g9 U# R" X2 \+ e# {# a4 E* a unsigned int b;' U$ Q, Z! w9 O4 l3 A! R& V/ n% V D
unsigned int packet_cout;
+ T: F$ }2 s4 e& \( w) l3 c& I1 Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 s* h% M% y3 o9 R: s
# O9 z- N5 P8 Y, d( l6 |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" n/ H7 g" g4 z6 W& y' v
unsigned int count_copy = 0;9 v5 D5 ]- P+ ^: j: _
, h$ M" r4 \% d% Q) s2 }
6 m+ l. t6 g6 `9 m, z1 iint main(), m! U" l# [4 m: [ r+ R( y
{
+ |! w9 X2 E& d1 M' k5 e& D pRX_MSG_PROTOCOL pshreRAM = NULL;
$ m# h8 P1 C6 n- Y6 C& w pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 A) }( q; H1 G0 g2 G/ N9 D( X j3 S! R" I2 a
while(1)
' d0 W* u/ |) _6 c% e {; x# s, n$ f u% ]; L. ~- o0 Z2 u
read_MSG_buffer(pshreRAM);8 M6 h) X o/ }2 j2 z
} : x; O3 O `. |' l1 D3 ]
}, D% c$ c; I% |8 t+ N
+ A% R M) Y Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, Z" {% s9 {+ j1 t{2 {6 ]3 F! {8 Y$ |$ u9 ?
RX_MSG_PROTOCOL buf;' I0 \" g5 o2 _% z% G$ V
! M. w) m: L; e
buf.a = pshreRAM->a; g- I& Y/ r, K+ k2 ]* Y+ C- [
buf.b = pshreRAM->b;
1 N2 G* x1 Q" m5 [& a5 T buf.packet_cout = pshreRAM->packet_cout;0 ^% K9 I9 y1 G5 o: s/ @0 P
: p# [/ z$ [( c+ j% a
if(buf.packet_cout != count_copy)
5 h! G1 ]& p3 e3 I% t7 |3 u {/ Y4 H7 G. Q2 t2 U4 y
printf("a is %d\n", buf.a);
9 ]7 X4 g- ^# A5 s) H) w: O printf("b is %d\n", buf.b);
7 D" v' }8 V/ x% H2 q; a5 P5 o S printf("count is %d\n", buf.packet_cout);
- O# n y9 L; K" p4 m count_copy = buf.packet_cout;
6 l4 n; M& g X& Z# |7 Z }* n+ e( [3 o* J- S
else8 ?) [# \5 O' _( I, p* b, _. |
{
1 K3 F8 q X+ }/ F printf("No effective message!");
. u, {1 A5 h0 I }) Y: z6 z! y* b: ?8 J2 l2 U
}$ g/ P: e( Z& C' T0 f
3 _/ z _2 m! |( c. r) K7 H7 K& T
1 G( M! i$ \, }! f% y7 K$ z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& f: Y$ L! ?2 H4 P1 e& y
使用下面代码,对内存使用了mmap函数后:
% c% y, N7 W8 ^1 x7 v#include <stdio.h>' V0 d- O$ \6 W+ L( Z2 O
#include <unistd.h>
4 C8 S( I" P9 s) J! a1 B' H#include <sys/mman.h>5 P3 s! J" d; @
#include <sys/types.h>1 @+ }# B+ n3 E2 \
#include <fcntl.h>" V* k$ O, ^# V" b* @# \ f. ]
; E" u% w! o, A- U! B* @ {4 ^#define SHAER_RAM_BASE_ADDR (0x80000000)
& X, Z9 P6 e- ~8 q& x2 h! p#define SHAER_RAM_SIZE (0x20000)
' `/ n' M; ?) ]: Z' z2 [+ K7 s J1 x
typedef struct
8 q: O, H% G9 X) ]{
& q/ v; ?3 E. [9 I4 D/ d unsigned int a;
5 t( }1 y3 i, ~1 p( O" R3 \& S unsigned int b;
) G1 t t1 u" V* @/ p+ h: t, d. V7 L unsigned int packet_cout;
) h. y$ q$ N1 I2 s+ [7 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 \8 q- D' i( {: N( O
) W# X( _& S0 I# s% wvoid read_MSG_buffer(int *baseaddr);
7 y# U9 C8 t5 c) w6 vunsigned int count_copy = 0;3 @1 k [8 t2 D4 G( c# E. {
" B0 ]6 P0 |3 w C% O5 f) q( wint main()
4 n, O# k7 g+ V2 x{
6 m( v8 e, `; s2 u |' l! h int fd;: n( M) Z( }/ ]" q* q8 X
int *mem = NULL;
3 z" m$ X/ u6 z: c
0 L0 x5 ]4 A. i9 h9 V if((fd = open("/dev/mem", O_RDWR)) <0)
, v8 E7 h0 n: V. _3 E {9 w2 L+ r. t' ]. k2 t8 K% R
perror("open error");/ T! Y7 ~2 }" u
return -1;. R( f9 j) P0 I$ F0 m
}
- g; T5 u$ a9 v0 h% W8 f3 |; C . K/ V6 f* s. \
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 z. H9 T) m2 Z6 ~. a1 y
0 x5 L9 |/ }5 A0 _8 X6 X
while(1)4 {# a5 _4 S3 L8 y2 N" F
{7 P$ _, J# ~! d8 v) V+ b
read_MSG_buffer(mem);2 Q Z3 ]( a0 u s! `2 I1 M
} 0 d' a. \6 Q+ [- m3 W6 J% h$ {+ ?
}- l3 ^% n0 k6 \( `
( s( d) {: N5 X2 s' }
void read_MSG_buffer(int *baseaddr)" ]3 {2 r+ X% Q: ?* h5 z
{
; q- U& \3 ?. ]5 q$ ~ R8 S# M7 a pRX_MSG_PROTOCOL pshreRAM = NULL;3 C# J0 L/ f. [$ ^. F" Z
! Y) N. z( A0 [! I r# g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; a; Y& O, F- g# L2 d
$ E: ?4 i2 c3 D, o; y if(pshreRAM->packet_cout != count_copy); I, Q$ i8 ~+ ^% \: m! l
{
0 R1 L B! e0 U$ E printf("a is %d\n", pshreRAM->a);
7 m1 P. D/ w2 a e r printf("b is %d\n", pshreRAM->b);* w. X, r8 R# I1 O
printf("count is %d\n", pshreRAM->packet_cout);* O/ q3 {% F7 ?" A4 i5 Z C2 n
count_copy = pshreRAM->packet_cout;1 q% i% R% _: q2 k
}1 u/ A& j+ g- |+ A
else& J0 E T( A- X5 y9 k
{: R5 M6 @# V0 K/ L
printf("No effective message!\n");/ \9 q9 u+ g" z2 K
}2 G' Q# p0 ]! \! d
}, U+ T' J* k# g) X! J: }) R
# P; ]+ h e1 v& y% }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
h0 d0 n! m& q/ c: M/ X- p
# p3 T3 z0 H9 v8 i, i0 v) Z" O, f/ [9 j! j/ v! _' l
. M2 H4 j8 s" O( ^2 v" P( s: h
|
|