|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + J- o: c6 }6 {% T: ^' {+ L% z
; p$ }% ^# V- \$ Z9 i7 x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- T3 n$ c+ V) D& T8 f+ {2 `
#include <unistd.h>
' d' i+ @9 U D+ E#include <sys/mman.h>3 a: M) v8 C# O' p+ W- W! |7 F
#include <sys/types.h>3 e$ w% h6 | d6 F. c
#include <fcntl.h>, l0 i3 }6 I2 z* g
$ W2 f9 L" B5 z( p5 O) l
#define SHAER_RAM_BASE_ADDR (0x80000000) * n% m& E; w% q/ g" P
+ y6 X4 A: ]( ~* y5 A* G
typedef struct
6 \# q; O9 B# F- ?4 D, i* Q{: Y" }7 o6 K% y. q4 ~/ r( `/ \
unsigned int a;) o1 {, p* _1 Q, p& p
unsigned int b;/ b' {9 a, B, C y% [
unsigned int packet_cout;
/ y6 N- C% h5 k' N! H! Q6 l$ |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 W6 f/ n( u( @) c, R7 [; A9 C' H; L2 f2 K( C1 w, f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, z9 V9 `2 ?6 @( m" }# e
unsigned int count_copy = 0;2 l4 d/ L( f) z7 T3 L( ^) i- k
8 `3 T( W4 D. K( H
: r) n' R* d( f) z- Rint main() k% @. B* C$ ^- H# x: F- Q
{
& a7 S/ i0 y2 t3 j pRX_MSG_PROTOCOL pshreRAM = NULL;
& I" b' j$ r5 d& z& t; h. V) t7 S pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 [6 d0 I1 u& j7 ^) o9 v5 E
: b/ G4 E9 M4 ]1 y H! Z7 z while(1), n6 d* N$ u1 }% K* N2 J, @
{* G2 r" v) D4 v
read_MSG_buffer(pshreRAM);
& l- r. H8 |- k2 L( M( l. m& C. a } ( Z/ j. K# N+ {0 I: Y: q# K
}, k6 Q) l- V \
- O. V; I' M) e$ [+ L% G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- m/ `7 s3 V3 P* h{
/ V% a/ U: a; J; l, v RX_MSG_PROTOCOL buf;# b( v( g$ B% \' ?2 w
( |. b9 \7 ?7 \& O* |9 P. ]( q buf.a = pshreRAM->a;6 }" ~- g! a" [: B7 Q& h. J
buf.b = pshreRAM->b;" v2 l1 o% f+ j' p( `+ B4 m
buf.packet_cout = pshreRAM->packet_cout; v2 i& \ r" ?* J- T$ c1 q
" G9 v8 @1 _# m( y
if(buf.packet_cout != count_copy)$ g2 \) N+ O/ ?# Z
{
! D# a4 d* a/ a A9 C( v2 m printf("a is %d\n", buf.a);: |$ D& D. I' H1 V9 }. h. K* L
printf("b is %d\n", buf.b);/ i8 ]' m9 _* I
printf("count is %d\n", buf.packet_cout);* {. h* A$ E' O z# @' n
count_copy = buf.packet_cout;" n% K7 z8 U6 i9 M% c3 q
}
2 L2 c9 U" i4 S: q else- m2 T8 K, p j0 Z
{
, k5 x2 g3 n" f# d+ F- i printf("No effective message!");8 N# N% _) [( T' h. Q3 \
}
& G% X& E" G8 }5 Y}
& p5 N9 K5 s2 c. t9 h0 C' t' t3 A
8 w: `8 d; X. a2 R# T& r% h: `6 @
' B- H. G6 H$ o( d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- }# L) Z, N! B8 [0 V使用下面代码,对内存使用了mmap函数后:- H9 a/ S4 T; z- G
#include <stdio.h>* ^5 U+ W: c; L7 z
#include <unistd.h>
2 f7 T1 P" q8 I7 V' P3 u#include <sys/mman.h>+ d; q3 M/ |0 k: L& d
#include <sys/types.h>
- s2 f% X3 Z3 _' I0 i; f3 D+ a#include <fcntl.h>
6 w& Q l2 z7 q
: s/ d7 H# `- p ]: [5 N" l3 x#define SHAER_RAM_BASE_ADDR (0x80000000)
* g3 o8 o8 Q$ d N7 G#define SHAER_RAM_SIZE (0x20000)
4 B Q5 E% a( y: I' @
; x& J( @) D `' H7 s' utypedef struct! r" X! P+ s' s9 u; z
{3 d! c: I$ H, l7 c3 \% S
unsigned int a;
. t: m! ^/ S0 _$ K2 G unsigned int b;
3 R- H$ B4 f3 g$ p" g unsigned int packet_cout;/ i' y6 ?+ j( F5 ^" w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ^( x$ C j) v6 `! B" i' M6 g |( B
void read_MSG_buffer(int *baseaddr);- C4 Z$ \8 Z' R3 E$ X7 @
unsigned int count_copy = 0;7 G9 e& g( ^( ^' ?" y- G
# a! p" i# K6 e4 a% C m
int main()
) U# L2 _; t. U{( S3 H, L( k: O' i" Z- g
int fd; t3 N: [9 g2 r
int *mem = NULL;
8 I' x+ O$ g, d+ h( n
' E" I1 } N K, u# N% C4 R# ]5 S3 l% w if((fd = open("/dev/mem", O_RDWR)) <0)$ q/ e" Y) |- F/ n: ~
{
) B D+ P3 l! @# n z% C perror("open error");2 Z$ r2 i0 b( L6 B L5 i" v
return -1;
, L8 V. |' I( B, V1 n' V }
; T: W; e1 Z4 v) `
4 w) L, q2 [+ ~ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" }: E: n1 l* r( g L/ b
3 ]( o1 \6 W; ]* L) ^
while(1). `' h0 p5 D; Z3 s$ o
{
! s* J. y) R. B7 |) n; b6 F' V read_MSG_buffer(mem);
/ R$ d- A( }% n8 |! @, | }
. A; \ u( O {}5 H& X$ [7 r- l6 V! o
e. \) \; v" j+ n" v! D6 V7 f3 X- Z: svoid read_MSG_buffer(int *baseaddr)
! _" `! }4 t* N9 ` d* l4 F5 ]{
% }2 ~' E. z6 s, o2 v pRX_MSG_PROTOCOL pshreRAM = NULL;. t; r2 W' a: ?& F9 e
: w7 {- Y# R( S( c2 a$ C' B8 x; j/ b
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# G. h: h! S: f& r( A" R9 E
0 x% M1 _7 ~0 r" V9 t2 \
if(pshreRAM->packet_cout != count_copy)
8 H) ? C1 E6 W. z2 v7 f {3 b$ E% V& f/ i" t
printf("a is %d\n", pshreRAM->a);# k$ |+ M1 ~ a3 U) t
printf("b is %d\n", pshreRAM->b);
* k' p: y5 A! ^; y3 m printf("count is %d\n", pshreRAM->packet_cout);
4 {2 Q7 n' Q! O f count_copy = pshreRAM->packet_cout;
; a. F* f; a, l8 a- l9 K$ ] }
% K$ r; U: Q4 J else
8 d( M* Y" p n$ h {: r k( | z+ o4 o6 y
printf("No effective message!\n");8 k/ ?+ A8 k& u6 @ ]1 c+ _
}
3 v* _0 Q8 P0 S5 U- T( W7 J6 U( N}4 g7 I$ m4 O' V1 z
! g- S# M$ n h( i& P' \; I! W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: g; p% f V, p+ R; I: t' N
4 i6 r# C' G; X% |$ n) Z; R0 G' r1 U9 P2 g. k
' L9 j2 ? m: C6 N6 g5 L2 m
$ l3 O' D1 F( z |
|