|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ g$ e$ y4 W) O z# A S9 a8 A) }- Z: E9 Z8 D& Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 U& a* k/ W% c2 [# Z
#include <unistd.h>
/ j6 f' e( K- c/ s9 P0 u8 h#include <sys/mman.h>
|' U! O+ E/ B! {5 W3 p0 A2 q! H#include <sys/types.h>% @* F$ x8 D# @4 u" k4 \ X
#include <fcntl.h>, K) I7 X% m& o8 M0 [8 r3 M; G
6 k+ P& L* N/ v" L#define SHAER_RAM_BASE_ADDR (0x80000000)
' N# G6 M+ {. @7 s; h( N
9 m# j6 y( d) d( gtypedef struct
* e" ^) y+ i2 G1 N2 b{
* B, `; N" e2 s( E) H+ i, A7 U unsigned int a;/ ^8 H( f2 @8 c1 k3 ]# z
unsigned int b;
- H. B; J" v1 d& | unsigned int packet_cout;% B% h1 { }3 X" d: D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 g2 u# {- j$ `2 `& B: f) g! L: Y- ^7 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* P' F; X" j8 [0 I) \! ~4 A6 E
unsigned int count_copy = 0;- u% J$ K0 d& w$ }! u
* `8 Y% J* ^7 u i9 E
# A$ ?& r+ Y) S4 h; ?
int main()4 x1 Y8 h( s/ } W" o& @2 o$ j
{
% d- o6 `! |/ U7 [3 _5 G- ]9 N pRX_MSG_PROTOCOL pshreRAM = NULL;
: Q% @% ~) n1 E$ [3 G, ~ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! B- P' L$ V' x* w6 }& P
7 ~: V' T. Z2 ]+ T' s
while(1)
$ z( m7 q8 Z* {4 t {! U S/ S4 P+ s- o' T0 D K) P
read_MSG_buffer(pshreRAM);
" u( F9 ~: U8 C& U1 l }
0 ~4 Y. \) m% ^) _0 H& o0 B}
. b- K0 I' ^; \9 ~3 j2 }4 v) H+ E2 K# Q0 ?! p: {8 O$ @ H) h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 d+ ^# B# g4 K r
{% f: h" V- F# U2 S. H V
RX_MSG_PROTOCOL buf;
* l! i; `. {, ~" p4 p/ N' y* ] 3 c; ]" d& Q. |) Z5 ]. j4 |
buf.a = pshreRAM->a; x) e* V0 G9 k0 `+ x
buf.b = pshreRAM->b;- Y+ w+ K4 w+ ?4 H
buf.packet_cout = pshreRAM->packet_cout;
2 }" _/ C, S+ ~. z5 a: d
, K- a" k/ T1 v/ i% V2 s" S if(buf.packet_cout != count_copy)* Z' T9 Y1 h; w: ]: n: I3 d: ^
{
5 v9 o% c( d9 Z) Z( t* _& U/ m printf("a is %d\n", buf.a);4 x6 A ^3 s! b& g( O' n
printf("b is %d\n", buf.b);8 y. ]. f0 a9 _0 O$ B0 y/ S% N
printf("count is %d\n", buf.packet_cout);
: E/ ?& u5 m% A# i count_copy = buf.packet_cout;
9 P p( U ~+ ^4 z- q' x" T# l }
X: U2 r2 q( k5 R1 h7 ^ else
& J7 N0 y$ l9 Y& k {6 P; W* f7 Q; Y2 z( J2 P
printf("No effective message!");
- J+ o/ C: J; f! |, U }' u G2 r" a. E$ P5 m3 G
}
$ o, A% ^! ~+ H. n- H" H2 r) T* u/ I6 G/ a. d0 A4 ]0 t; j
! o8 C9 }& G, E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# M9 V9 A$ ^+ }% @使用下面代码,对内存使用了mmap函数后:( N5 I# Z7 d0 J/ E' @6 I
#include <stdio.h>
1 [& z. Q3 @0 i* f, D4 p A" K8 N#include <unistd.h>+ J& Z1 u$ V) c( J3 B
#include <sys/mman.h>
- I/ H, n) _6 k! [7 `#include <sys/types.h>
& i# ?, B, Z0 g0 y; A5 e& S# Y#include <fcntl.h>7 L* u" K0 ]" [
3 R% X$ ]3 A; t. i/ e0 g( f/ m: G
#define SHAER_RAM_BASE_ADDR (0x80000000)
" G: r7 I4 X7 t. e& E s0 c) V& ^#define SHAER_RAM_SIZE (0x20000)
* N( z0 W& T5 O, \7 ?9 }' U8 i- N
typedef struct m9 e1 _* T: x% V- K
{
" |9 f8 K- U! R" ~+ o" Y unsigned int a;+ l0 h( D/ j9 |
unsigned int b;
3 i5 I f1 ~3 d/ l$ M unsigned int packet_cout;
/ N6 s* f0 Z- L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ o) D( F0 g a, U2 ~: y, w6 j$ J; ?1 Q' |/ ~+ G
void read_MSG_buffer(int *baseaddr);& a- q {+ P2 |( ~
unsigned int count_copy = 0;
7 W( Y5 I+ L! P: |5 W5 M7 r- ]- W `) r* `
int main()5 C+ E, z( s3 w. j3 ^+ D$ a
{: }& Y `* r" c$ f$ P
int fd;
6 d* `* q2 \7 x# N( R4 F8 b int *mem = NULL;
) P# Z5 P% b) W$ N" g; e' }
; k2 Y m! n/ L [! w* d' P if((fd = open("/dev/mem", O_RDWR)) <0)
; ^! S; i. _- j# h2 S% c {
% S; N8 C1 I3 I; } c; q perror("open error");: \' U! u$ m7 G/ T# Z
return -1;
* `- l1 I! x1 G3 X6 e }
" P+ r! R: d/ m3 v4 L; N& E3 ~ ' O( o( n, \8 T. q4 j, G
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: Q& k7 S( x: ]. ~( ~+ [0 r5 |# y! r" r
while(1), p1 | T1 n, M" M7 E# _8 S
{
* b" k u) m/ ~0 _; g. ~- i4 W" U read_MSG_buffer(mem);
$ j; R: z; w1 o# ? } ) i! v9 z+ I3 `/ A. V- b3 o
}3 `" ~) J$ C+ n2 v! N
c0 X9 k' A: F0 }
void read_MSG_buffer(int *baseaddr)
/ `/ z4 A* i' ~6 R* v4 Z{
! W1 T. \! _; @) v# I pRX_MSG_PROTOCOL pshreRAM = NULL;
0 i) j' E. l. J. l- M) @- {4 [0 U. T0 S& D" e) P' o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% c# T' ~) J5 [& u3 R. ?0 T1 j
* ~- E4 E" S9 s) f if(pshreRAM->packet_cout != count_copy)
4 Q1 ?; [' g4 H; L7 o* G3 ` {2 b, k2 N$ w, g y4 V& O- q
printf("a is %d\n", pshreRAM->a);- N" u2 j7 Z+ j5 s
printf("b is %d\n", pshreRAM->b);7 b9 u( x& r3 i% q
printf("count is %d\n", pshreRAM->packet_cout);
2 d1 B0 n/ L- A- m8 i count_copy = pshreRAM->packet_cout;& T8 J# s+ O9 V1 x o! I
}1 `* M; A! K) ~+ z& O( e
else$ @& S3 M/ k2 Z! ?' [+ ~& a8 ]3 J
{
3 X A. k: o$ ]7 h printf("No effective message!\n");
) M0 G. n6 v* o6 T3 K: f }
3 s7 ~6 z" f) F7 O% W}4 H9 t+ J5 a. T }' J0 h
% v0 J- g+ E9 l o1 y; W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( L" W. U4 G- W0 ~" a
4 _, E! T9 } |* p0 i+ L
* v9 {# z# _* {! ~" g
' ?0 y1 Y# i0 P8 e
( S. q2 W0 x, @5 B3 T |
|