|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. F5 L+ G3 B3 P
0 H8 c7 R1 a& ^2 ~! BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( F5 D, W2 H7 A! T% M% Q
#include <unistd.h>
7 H2 v- k3 T: w* }0 ^/ |#include <sys/mman.h>1 |4 a4 L- J; ~: z; I6 T7 M
#include <sys/types.h>
2 @+ D5 [- J/ S#include <fcntl.h>. h. h# u1 T( U7 `& K+ d! w
! \! S- p# |* Z! y6 Z$ Y' c: i#define SHAER_RAM_BASE_ADDR (0x80000000) 0 w# a& i" Z* }# t/ h% M
/ x+ s. v$ S; y: @: P6 f7 b$ Ttypedef struct! q! ]* w4 ^2 G @+ Q6 p
{" A6 j) U2 G2 m
unsigned int a;
+ g. S3 }& Q& } unsigned int b;
4 ^8 u: d0 @( w3 U0 Y& s unsigned int packet_cout;" S7 y- Z" O9 y; G: u7 r: O9 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& _7 C: I% _# n/ F1 @: V% j* z% L( B% j W1 F# q6 j4 m# P1 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. h2 `& p% U0 j8 u4 Munsigned int count_copy = 0;
+ y9 n) Q2 X e; g* Y
1 Y+ J* L: C3 ~2 |& Y; U- ?1 q3 c5 E3 Y. G* b; T- R
int main()- E' u, u E c4 q V
{
$ \5 [: l7 j: K4 B8 ~, l pRX_MSG_PROTOCOL pshreRAM = NULL;0 s* ` C& G* R9 h# Q+ [9 M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 X" p9 X% |$ `4 V9 w& z" E7 }, A! V6 g
while(1)9 [. q# t, X0 N" O5 o
{
4 v+ Y" ?3 t( d3 H' f read_MSG_buffer(pshreRAM);( _: }" A+ \, ~4 T8 t
} 3 X \: ^( F, X: X0 ?& f9 M2 s" b* h
}* d3 R5 I& v1 d: t7 O) }) o# N8 E
5 g; M, k4 |8 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. _% \6 G" L( P4 d6 C{5 [ ^! r/ _, P
RX_MSG_PROTOCOL buf;0 `* e+ F0 b9 P5 y* I2 m" |
! G7 p- H- G* ^' {1 U7 D
buf.a = pshreRAM->a;
; i9 D3 x8 j3 Q5 i8 V buf.b = pshreRAM->b;
1 ^- y8 A8 W1 K buf.packet_cout = pshreRAM->packet_cout;
' B' V4 c( _+ Z1 |
# J4 q- k% i6 C1 j9 J* X if(buf.packet_cout != count_copy)' t- [9 L7 U( R
{6 f- B% d, G2 x( d7 d( Y
printf("a is %d\n", buf.a);& o' ~. _( v# X
printf("b is %d\n", buf.b);. s$ L& H+ S6 m2 C) ^
printf("count is %d\n", buf.packet_cout);! r( {- u5 h( Q5 Z
count_copy = buf.packet_cout;( Y8 J/ c, N; ]" E6 @
}( M% ~- y" K' [/ D5 _5 `
else
) K) d" F; s2 D& a6 [ {
' f+ w" H8 c. ? printf("No effective message!");
, ]$ X+ S% g0 u' Y& [ }
) `, x# |4 V# U' X2 s}
0 w. E5 z4 @7 z& o6 d
. `. I; L4 G: k; b; f% l1 m
8 |$ ]5 W- K; t但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 q; ~9 \: f* C- |! p% x( e
使用下面代码,对内存使用了mmap函数后:
* |/ z u; _7 Z: t1 V& w#include <stdio.h>
7 p& o& t9 |- `3 Z0 Q0 K8 z; _% x#include <unistd.h>
( l; L& E$ U6 m' {) [/ H2 I0 s1 \) ]#include <sys/mman.h>
/ X! ~& a' A: s6 s3 y, ^+ C7 v#include <sys/types.h>0 u9 i% Q! N$ q9 L) Q
#include <fcntl.h>
1 y- {* G# b/ I$ i/ w F. O2 Y/ ~* y
#define SHAER_RAM_BASE_ADDR (0x80000000)
- t' U+ q+ N% J ~#define SHAER_RAM_SIZE (0x20000)
) u* o* n' ]0 A; D" k$ R5 _* b* h) }, w7 h
typedef struct
$ [: f+ U5 n% T( d0 y, `; z/ ^" |{
; l" T( w# X$ M unsigned int a;
* { D ~6 \, n" m unsigned int b; o% k- q2 T( w) g8 v+ s' e
unsigned int packet_cout;
% |) F2 t5 n, [% b9 `- L2 C7 k- D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" h1 I1 |. ?7 V1 Z0 \
8 B$ x2 ~0 p/ m) `* Bvoid read_MSG_buffer(int *baseaddr);& Z! } E1 P ~. V2 B
unsigned int count_copy = 0;( h" e7 A' n# N0 O' [
. D9 a6 x+ | v- }
int main()6 I: O0 B A3 Q& L
{7 X! X0 i/ _9 ?' e( @9 D7 p
int fd;
2 d( S- f3 D( o K int *mem = NULL;! l, d( P8 z6 e6 r. e4 J# w
8 J9 k" ?9 U" u+ Q$ I4 N. m/ d C) l3 X
if((fd = open("/dev/mem", O_RDWR)) <0)
S. A8 L) i: @* @# i2 s {
; y, b4 A/ K% T! h7 R; V/ u perror("open error");! D# t d V. o8 F! A
return -1;$ i% H" s" t$ Z H
}" m9 M( {; S* k6 R
: A1 C( P0 A! l& u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# g# a1 x. r0 b" Q% O: U
9 ~2 r5 |$ n' x8 `' y( T while(1)
, R& |% u# l- b8 p5 H4 e1 C {8 e8 Z( T0 u% `; w G
read_MSG_buffer(mem);
. C3 T' _( ?! J4 W9 G1 Y" r- X }
$ X" L! L) ? m}
( n8 ~/ n/ E8 T% E* F9 U# D- ^) M; a6 x9 y9 T. y
void read_MSG_buffer(int *baseaddr)
2 M5 O- H1 t" ^3 Q{
. G9 f3 a) _$ g' [- p$ L/ } pRX_MSG_PROTOCOL pshreRAM = NULL;
1 {6 h5 E6 T! X- r( v* [# y7 Z i! z" k1 `8 p
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 y8 j8 W$ @# q! n
$ J0 x6 G: f. y* \ if(pshreRAM->packet_cout != count_copy)
0 {% F4 B) W/ P5 ^4 p& Y9 f6 M: ` {
6 V2 z2 z8 J2 T* d1 O" Q( h4 L5 D printf("a is %d\n", pshreRAM->a);
! J3 _3 b' j8 H4 r7 [, S6 V0 j printf("b is %d\n", pshreRAM->b);) |! z3 W. b: e* K1 c
printf("count is %d\n", pshreRAM->packet_cout);
. x/ p: _# X% |1 m count_copy = pshreRAM->packet_cout;
5 }1 ^) y- @! G4 p }
* n: V- [$ u) `1 b else
" Z' ~ O6 {1 @0 ^8 k9 _: O {
& r6 u- Z. n2 H6 [2 \ printf("No effective message!\n");- i! O/ U v: p, Y t1 R/ p
}4 E4 ?4 m i: C4 h$ E; m+ `
}
6 Y! w+ r- @7 T' M/ j
0 T& S. _# d6 z# a& j$ U没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ {1 \2 K- P4 x' k" K& `
- Y* {9 `0 V6 U. ?3 K! T# ]+ M- o6 J# J. A8 w' c/ n8 t4 _) h
& n' x- v* N9 ?9 _* ~0 k9 y% I& D' x
|
|