|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. m+ V4 F* i5 U0 q/ K3 J8 p. b
6 ^1 Q$ A; X% M4 P% oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 [+ |8 P N' t/ C! |#include <unistd.h>
9 N$ b/ I4 {7 u8 S#include <sys/mman.h>
/ L N( I+ F! G4 T* b5 s#include <sys/types.h>6 _ t& Y% Y) C+ I7 P" M& n& w
#include <fcntl.h>
1 R6 { |, d$ }
5 v0 v) H; R1 A1 x+ |1 s! O#define SHAER_RAM_BASE_ADDR (0x80000000)
+ i7 G. t2 F) v
$ w( U3 x# J( o' O- @/ O! jtypedef struct% D: R3 N# I- x" K' s( h: I6 M6 X
{
/ Y4 A$ \. B$ ^! ]2 |" G unsigned int a;
5 R$ ?6 Q3 C* I: F7 s& I+ ~- a; v7 d unsigned int b;
( t @& W+ D/ F unsigned int packet_cout;
0 F3 R8 O; E( G8 f& ~% u5 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 L; b2 B7 M, y) n
/ k0 y% Y4 `: }% H, @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ ^- g A }+ ?8 M% {5 S' Q3 X
unsigned int count_copy = 0;
2 u, P! z# P* a; @4 f8 q3 v! ]% q% c* h; M7 z+ ?
" k* T2 V1 I5 T: ]3 G: Gint main()
' l/ e" I, j$ z# F9 _' i1 N6 ~{& ?! o8 q8 |# y0 z( q ~3 x
pRX_MSG_PROTOCOL pshreRAM = NULL;" {) }, ~$ m* `" k" S3 |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 N7 X! j9 p4 R4 o1 L& d1 `1 h- z3 B. \- E6 f
while(1)% }; T. `0 w8 s# n) [1 K* m
{8 |; g |" e2 a2 D
read_MSG_buffer(pshreRAM);9 p9 x- ?" I( V
} 8 J. `1 s0 b6 v. T2 U
}
0 X% M# k, P, t( @% l3 I
% J0 W$ l6 C/ X& g& w; W9 s4 s9 v5 J0 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! l1 H7 o1 m& k8 o3 ? X. D" S{/ T3 _7 ?3 L3 o+ T/ d' O
RX_MSG_PROTOCOL buf;
$ O9 e/ S' z4 s9 i+ G4 }6 I
! R5 |, b l" a9 ^! v1 B buf.a = pshreRAM->a;
4 n1 k0 E. g& i. e# ?2 R) ^' g3 Q buf.b = pshreRAM->b;
& @3 z) n! f, k7 z* b# L1 r2 s buf.packet_cout = pshreRAM->packet_cout;, N* t1 w' V, {/ a9 Y
* e& m" f, r. `9 ?2 c0 G8 K if(buf.packet_cout != count_copy)" B% D1 D& }2 V' G
{
' ?* m, m& `; e8 W3 C printf("a is %d\n", buf.a);
) e( J2 j5 v( v9 T( ~9 T& ` printf("b is %d\n", buf.b);
1 p: D: P: `/ L- {% F* ?, w printf("count is %d\n", buf.packet_cout);
: z) Q+ c2 Z: _8 i5 q; Z2 b$ T count_copy = buf.packet_cout;% O( _# L. f! D# v- t
}
* D; f- Q" C+ j _ else4 w" p9 Y$ I) L2 w( _) K
{4 n2 Z: S: g4 B0 l
printf("No effective message!");
: ^( F2 @& M# `* I7 w }
7 U' Z; E; a* O) L$ C8 w8 n# S& {}
+ H# Y. r7 J7 K% @& G0 t$ i1 x5 ^9 l0 y# N. d: E: ^5 p6 f. s3 ~
6 j! g6 ^3 S9 V7 f' b+ M* j- `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" P2 G* T( I) j* o. t$ \3 A* F# x, p
使用下面代码,对内存使用了mmap函数后:
. u( r0 X& t) K& ]$ S% s5 a3 u#include <stdio.h>
" b. u2 y3 U* b#include <unistd.h>2 i, D+ m1 N7 I( U& [
#include <sys/mman.h>
; I0 Q$ R3 }" B4 {/ x) a#include <sys/types.h>; c3 U' q% B @$ `
#include <fcntl.h>: _+ k ]' D! T9 {/ A
) n' I8 z0 v: O4 e& o+ W# x. N8 \2 @#define SHAER_RAM_BASE_ADDR (0x80000000)
& q1 K3 Y: F' e) B! C g#define SHAER_RAM_SIZE (0x20000) ) }1 _- B: {3 N; @% ~
& ~/ U6 z& f# _7 d! ftypedef struct
- @! @1 N: Q1 h: s{
) `& B" P5 ]. h unsigned int a;
( }* ~- z: U5 I unsigned int b;
4 \! {0 d+ `( f7 k- Y* p5 r unsigned int packet_cout;( K3 l; H& V3 e, R8 L: E, m9 p4 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
h' T( d6 l& O6 W" v4 F8 p) s/ f( u7 w3 a# o1 @
void read_MSG_buffer(int *baseaddr);
5 x1 t, k( W- z4 ?4 _% wunsigned int count_copy = 0;
, i9 A+ m7 ~- }+ @$ C
; c1 S+ a5 @1 fint main()
* w4 ]- f) l3 m{: Q" q1 H. |% B4 B' F
int fd;/ f W- r4 ?. s$ [1 j& @
int *mem = NULL;
* Y' K# A# ?$ o: \0 J/ p! r1 L2 U& c$ U7 e& q+ ?. v8 C8 W# w" z
if((fd = open("/dev/mem", O_RDWR)) <0)
% ]9 u( n3 J4 ]- c2 Q! Q {
; J+ x% Z$ {' Y2 e0 m# L7 v perror("open error");) K/ o. N. N4 Q4 y3 A! w3 t w1 c" o
return -1;6 c0 o9 `) N2 {
}
4 ^0 N+ k$ W4 {0 o
: X7 u2 k1 l7 S7 P7 x& j- A mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. L" P# y( O! E8 |3 e/ h5 u* R
) U1 s7 p6 N( A/ P while(1)
, U( K* S& i8 e# K( c, { {! g; K- k* S0 y& Z# ~
read_MSG_buffer(mem);3 E: m. P8 P: |4 M1 d
} ' r/ z7 Y7 `! M* g5 D% I4 e. E& f
}8 F8 t9 P- l5 J) A2 j
3 A @ W6 d( m% E7 h% \) ~
void read_MSG_buffer(int *baseaddr)! m+ I N+ {# j" Z, {1 D
{# o9 x V8 x& p2 T ^) W* r2 o
pRX_MSG_PROTOCOL pshreRAM = NULL;& B( w+ K' J9 d8 ?" L; ^+ u
5 Z. e: c" o7 n9 Q9 I
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 o/ E2 {" r& J) r* U5 X7 `) [' |
1 G4 b; f# i# d; O
if(pshreRAM->packet_cout != count_copy)
5 T0 Y* V* j3 g {
. m: e% P% {! J( w printf("a is %d\n", pshreRAM->a);: x* i }# t/ d6 t' f4 X
printf("b is %d\n", pshreRAM->b);+ D! X3 S, O' k7 n! K$ x; r, l
printf("count is %d\n", pshreRAM->packet_cout);0 `; E: h) X) W: |* T0 C+ |
count_copy = pshreRAM->packet_cout; q X; ?1 E6 h' y9 S2 N
}
9 C5 _: S0 t h h else
0 G, x) P9 }" `7 v7 V E) A8 E {
8 F5 P ]9 }$ [7 f. L) Q# X printf("No effective message!\n");
& y7 ]+ i B) K; |, x }+ b" K7 c8 D4 k
}
( D/ Y* j4 G: P- G2 y1 v& g" k, H+ l$ {" p+ L8 F: _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- x9 e1 x) N! `1 p+ J, n9 U# n/ t2 V) R# }, }" ^0 D* k/ i& y
6 c& S- s" |/ V( @# V9 K
" C- `0 ~- y! f3 W7 J' K# q. e ?3 p
6 v2 V% f6 D$ F5 x) p: b) @2 q+ {1 S |
|