|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 P/ v& j+ L8 r# m- L8 V
9 f F' h" p. F8 c' XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) A3 s3 z. `! N& p( Z' P8 F4 a#include <unistd.h>
& k7 n, ^2 i5 ~4 |5 u% [#include <sys/mman.h>6 S# a/ `. Z7 H/ }9 V) g
#include <sys/types.h>
+ i& a4 s" e: S) k9 e- {; T" x#include <fcntl.h>8 P& o: ^# d1 o) [0 N5 h
9 n6 I% V1 ]3 O/ Z* f) Y#define SHAER_RAM_BASE_ADDR (0x80000000) 5 h0 m# a( z7 r& t* N
3 F7 C6 I4 E! K* r/ M) f6 Btypedef struct! x) Q( |- }# C- t
{& H! Y2 f6 @! [% u3 \8 x
unsigned int a;! b- ]5 }' z2 ^- A1 O. \
unsigned int b;
0 \% K4 c0 N3 i3 x unsigned int packet_cout;) K0 }8 b5 d' J' m8 H& k9 p1 x! \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, ]; w" F. v6 l* N3 v: C( j* a$ U m, |; N G N) y2 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) `+ B2 o! K$ \" p3 b/ \
unsigned int count_copy = 0;
9 I8 Y' [& f" i( r
* U O7 G$ D3 k* w8 D" P+ f! ]) |
int main()
# T- ~' x' [0 T. M5 k{
* U( V8 x# k* l: ]8 U$ r( g& r pRX_MSG_PROTOCOL pshreRAM = NULL;0 B- _7 b6 |: C7 x$ s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 m1 o$ q5 o: `% U: X0 _- H" J9 }/ p# g
while(1), _1 {7 s9 _ t/ a; U* X0 U
{
+ a3 X0 s7 R, W- E1 ?6 I" }/ c, } read_MSG_buffer(pshreRAM);$ o p. ]- M+ M+ G m7 J! u
}
A8 E* u1 w/ y9 |* {, V6 f1 l}2 \5 L0 n; w- Q l
: A5 r1 q+ L- c6 S4 g. D! d" n. v$ C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 l7 H U+ k3 d# q
{
1 U+ P! E0 [+ i6 A. y: [ RX_MSG_PROTOCOL buf;
- W2 ]. j# s1 R1 J' z
, `1 L# O* d: Y# R9 y0 k9 d. s% I buf.a = pshreRAM->a;
1 \& k- r+ C1 N+ X, p- E+ g3 Y buf.b = pshreRAM->b;5 K7 x! o8 v; y+ t
buf.packet_cout = pshreRAM->packet_cout;; n* I! }6 k% j
$ F5 `6 L5 m$ f ]+ D
if(buf.packet_cout != count_copy)8 M/ c# }+ K# v1 x
{+ v4 r% Z: c2 p* b; m* G/ y
printf("a is %d\n", buf.a);. I8 a. D' s M5 R, o% t# t
printf("b is %d\n", buf.b);
0 v4 L+ f9 H; Y printf("count is %d\n", buf.packet_cout);
0 {% m7 b, D% Y1 N/ j. S8 u2 K, t count_copy = buf.packet_cout;' O" e3 Q' `* l
}3 l6 A4 f: B; E* _1 L. @) v
else
4 ?, k, z" X- y) v {
0 W: d& d. g- w( B: {: n printf("No effective message!");
( E" a+ D9 n& I+ @& L: v }
/ V$ E+ i M9 m. b9 B}& Q3 o1 i* ^1 @% U
3 ^% G$ z1 B& l+ c
$ N) `1 F8 D! V' y3 I& J. j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 D% U% C8 x; {% O; L使用下面代码,对内存使用了mmap函数后:
5 o: f! |; O7 y! s+ e#include <stdio.h>. m# i( M" z5 L) Q' j
#include <unistd.h>
; Y0 X% B" L0 |/ F8 a& K#include <sys/mman.h>
) X4 w6 U2 I" W$ o#include <sys/types.h>; l5 n% i' d! A$ D1 H0 c
#include <fcntl.h>
0 K+ t0 e6 h: f! A: [) I8 f; ^4 c' D9 J
% g0 L; m* Q7 |6 ?4 }* Z% K& w#define SHAER_RAM_BASE_ADDR (0x80000000), E. I4 }! i/ S: ]$ E
#define SHAER_RAM_SIZE (0x20000)
: B1 l, S2 E. Z6 r# s4 \
6 _. o/ V2 A8 e7 J9 @# J" p! `typedef struct& A* c( r' G" C& b( [! ^5 n/ x7 v
{* ]8 g% ` A/ `+ p; u
unsigned int a;+ \* G6 d. I6 P5 L6 C
unsigned int b;
/ t4 m# }* ~+ ^) t3 G5 O" h2 K1 n unsigned int packet_cout;
3 x! s- I3 D! B+ q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: I. I2 v: n7 I3 ~7 C% c- ]; F# @% c! s4 x
void read_MSG_buffer(int *baseaddr);9 B6 i: s+ ]0 O6 {
unsigned int count_copy = 0;
$ j$ Z0 l. m; s5 L7 p1 w: a8 C; z* m# o0 T* R. @
int main()/ f0 Y7 G' N8 ^& ~" ]
{* ?. f# R1 c/ x2 ]' n6 f7 j; a% w
int fd;$ |" d/ g3 o4 z2 [" z
int *mem = NULL;2 k$ V |7 ? F9 I1 L
3 `1 W% q: l5 |+ ]6 \% @ if((fd = open("/dev/mem", O_RDWR)) <0)
. r3 L |) o, j& X% W2 a {
: h# `8 z5 Q, ~1 Z" a( o- L perror("open error");
. }2 ]: f5 { V; r7 e6 ?8 R+ x j8 p return -1;# d T1 j; X- x" ]
}, E2 @) _1 _4 y( ~4 t' @/ z, s
: _4 `6 H* c( d+ H mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. v/ ~ C1 e: ^9 G3 T* p+ p/ m
# r9 _+ q: l% l0 t! H0 C9 v5 ` while(1)
2 P9 z' A3 U% B$ O/ _4 R {+ W, t3 z; k7 v
read_MSG_buffer(mem); I! W4 }% v; x$ e+ N1 C
} 8 Y+ i' \/ @# t3 W
}* X2 ?; `9 L _6 {$ k! ~
N! V0 _* E$ I) z8 d2 h
void read_MSG_buffer(int *baseaddr)
- A* m* \% \' l0 j$ S; n( P{
8 ]* n0 Q/ ?( F0 X* S pRX_MSG_PROTOCOL pshreRAM = NULL;
* H, a, ?0 W( y" y3 v! b+ R9 I! v! U V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
J. ]: j8 ]7 H5 F+ g' S) D/ Z! [$ G2 h: G U: S& a
if(pshreRAM->packet_cout != count_copy)( w6 E* X1 A1 P
{& a7 J. e |! n+ r
printf("a is %d\n", pshreRAM->a);
: t6 I. p0 H/ f7 q$ s printf("b is %d\n", pshreRAM->b);
; `$ ~: M) v# }- O6 w' v printf("count is %d\n", pshreRAM->packet_cout);
& N) p: G) S( W5 X count_copy = pshreRAM->packet_cout;
( O# k7 R. v) p) }6 t l. S }: \) _1 z7 J! i! ~3 A( x" }
else+ i; R$ ^. `$ R7 d% J# {
{
' a1 E: [1 }! h4 x' j& G+ F printf("No effective message!\n");
5 a& s5 Y+ s1 ^+ O }/ I- |4 i) i: L' w) g
}
* V% U) _2 @' f0 s! {) K/ q& W- H3 m5 h7 F3 Y$ P
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) N0 c" T5 Y" q
! ~7 l# B3 d* k+ g' K
! l9 D) k7 a2 p( P! o* S
" m8 V2 I1 _+ b, N( x- A5 |7 j
/ n& m2 l1 m$ c, }' a4 } N1 T$ L
|
|