|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 ?5 e( T! R7 Z7 \
) H$ c2 |, t2 n; b; P3 nOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( Z3 Z8 q6 \9 u& |- B6 p3 h& _
#include <unistd.h>5 s+ N5 B0 F& C C* O
#include <sys/mman.h>1 \- p! c% A+ {! u* ?
#include <sys/types.h>
~) k" J& h9 q- m% W0 S B#include <fcntl.h>3 ?$ T9 j O2 I: o$ `' v) ?7 D- a% O3 j
7 H$ f! j) @9 o#define SHAER_RAM_BASE_ADDR (0x80000000)
6 B& N6 n5 \$ O: b5 g, T" ]* p4 f* q% X. U* L
typedef struct
9 |9 M' y: s# m0 ^' K- i- X{/ \4 I U8 s1 D* j3 O( Y
unsigned int a;
. i9 c1 K' C5 e2 d1 f unsigned int b;
' \- x: I a1 s) h% @2 d unsigned int packet_cout;$ W9 ] b5 p( x6 I5 v( }9 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ J2 F9 S- O" e6 W5 w/ a
& z7 H% j! W9 n" b8 ~2 b t/ a lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 G% Q4 u0 t' x* P( a
unsigned int count_copy = 0;' n. l7 S6 n \: a& V% a% @2 Q
% a* b- A5 Q9 J+ }' G2 |1 C9 w: I* Q$ d2 P! c7 w9 X
int main(); ]' i! k/ Z9 }- y$ Z7 U5 P
{; B2 z" c* G; _, ~
pRX_MSG_PROTOCOL pshreRAM = NULL;! W( M6 K+ N0 m, Y9 }
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- |2 _& k8 @* Y$ X7 @
4 N+ q+ @; U0 e6 b" ~0 S
while(1)
! [0 c9 H! I' f5 A y1 S# C {# |* i! G# V& {& G5 E
read_MSG_buffer(pshreRAM);4 R- Z4 i( _) ]6 I
} , ]8 D% ^. p; U3 e0 c1 ?! j
}; F0 D G! {0 E9 Y7 e
4 X/ l5 e- j6 K4 {3 lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); V8 j& [& s% u7 @( q# W7 _: V. V
{0 S. I( v5 s4 d0 P r; N9 D4 R2 \8 e
RX_MSG_PROTOCOL buf;
. B$ Z" A# u$ S
) A. d: {. h6 h7 w C" E% j* N buf.a = pshreRAM->a;
& N' ~! f8 K J+ } buf.b = pshreRAM->b;
# ?8 K/ m$ Z2 a' K3 N+ l& U$ J* A buf.packet_cout = pshreRAM->packet_cout;
8 T$ j3 r+ I. W6 j
2 j+ E2 k& y, v6 v% P+ Y if(buf.packet_cout != count_copy)
. }2 J8 P4 n7 P2 t {6 O, [; S1 `1 ]2 i
printf("a is %d\n", buf.a);
& j( A6 z3 d1 r6 Q- b+ @0 L printf("b is %d\n", buf.b);
- i7 t+ N0 x! Y' h7 Y printf("count is %d\n", buf.packet_cout);; j- h0 V6 l6 i; c9 Q ^
count_copy = buf.packet_cout;
" I9 p0 D s' O$ U8 d }& Y, C t6 j1 c0 [
else) N0 A* R" {* ?( v( [0 ~3 i" ^
{
8 E# T1 u! Q/ T# e3 C2 j- z, f printf("No effective message!");
+ Q1 d% M1 U3 ]7 n }+ W" n6 @" H) R( Z3 m7 k+ i
}
0 J3 c) ~. n8 O% G/ y) @- F& h; P0 e/ o( W# j2 G S9 B
. B$ R; @- y7 m* O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% K9 t4 H7 s I5 q3 c! y使用下面代码,对内存使用了mmap函数后:2 ~8 C* L5 z8 g, U/ \) j
#include <stdio.h>1 m, L( y1 c) x& W4 ~
#include <unistd.h>; v, E6 h. X7 z
#include <sys/mman.h>
% g# _6 c+ L) G" L. n#include <sys/types.h>
% Q9 K7 B1 F3 I7 s( |2 m#include <fcntl.h> g+ _: y" E6 _+ J: l5 j6 V. F
5 w _4 |( Q8 {# B% D
#define SHAER_RAM_BASE_ADDR (0x80000000)1 @ H8 q2 f1 O
#define SHAER_RAM_SIZE (0x20000) 3 F) X' C; m: v
6 |# O( H3 b9 E! |0 K
typedef struct
8 I2 J9 C& u" e; j* b- s{
+ t9 P" N$ A. I% K) Q$ Z unsigned int a;( p6 v0 U' r$ s6 Q( G
unsigned int b;! B6 b. x! I0 {9 c% H+ ?0 q
unsigned int packet_cout;
- j v: y* [, P2 v& P0 L+ V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) [3 }9 R) D; Y2 f/ E
1 `! b; w/ _7 ~- _
void read_MSG_buffer(int *baseaddr);
& a- w! F# o5 h/ V5 a- \, x4 H' N$ dunsigned int count_copy = 0;
8 s" e$ n, S% X7 i/ j0 i" S# s. @# _6 D! p. a _& V7 D( R
int main()
/ f, F* i$ O5 z' S& q) m# K{8 B( B7 P- ], C9 a/ }: Z4 k. N" z/ E
int fd;, ~& c9 ?3 W, Z: d, N L- E
int *mem = NULL;
& n( J6 b+ u+ h$ [
- V5 \0 H$ Z8 m6 _ if((fd = open("/dev/mem", O_RDWR)) <0)
- A2 N0 T: o9 t% J" P1 D9 z {
& h- s* J7 f# M5 K perror("open error");
+ |9 y& {" U9 P7 D7 r$ V6 P return -1;( w0 O3 _- k. ?) w* Q# C
}
Y9 x) v2 F) E" F% g$ G ) K$ x$ H& v5 Y( ~- s- h
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% \2 q/ [( s; [. X: g% L) g. u. x, E0 S7 w$ B2 N' ?
while(1): x; ~, t, {2 l* g* n( Q0 {2 i. ?
{; ?: e4 r, J" g8 p& I' Y
read_MSG_buffer(mem);
. Q% |+ c4 v! {# Z: H- b0 g: _ } + @) R9 N% M& U, O% u
}: M. v8 |3 T& `
. ^1 T5 e* I. b1 G! H1 g, \. Dvoid read_MSG_buffer(int *baseaddr)' g* @+ o; V2 k, F# v
{
! A* l1 j8 D4 `/ l7 { pRX_MSG_PROTOCOL pshreRAM = NULL;
. y! T' C" ^& L+ l' D# J; ~ U i* e8 o. D; |) \+ b- v% X6 O
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: m/ q, @2 x- S2 S: F/ i& q
8 ?( _5 n/ I# V I# w8 Y if(pshreRAM->packet_cout != count_copy)# H8 X" [/ L0 R. z% ~2 a
{
; }, Z3 Y' d9 r T! [# W5 \ printf("a is %d\n", pshreRAM->a);. `8 _( l/ u& W5 m
printf("b is %d\n", pshreRAM->b);4 s* t- c7 z3 Q! r8 j: ~ j
printf("count is %d\n", pshreRAM->packet_cout);# E y* M6 w" o8 w R$ v8 ~9 y
count_copy = pshreRAM->packet_cout;6 K. R6 y0 c, D9 J6 G
}
9 K' B: i9 w7 W% U& q+ H8 g else. a! Q; M/ v$ a1 P1 X
{5 j; A4 z, x$ a+ s
printf("No effective message!\n");3 D$ ?9 k' `. Z5 M) p# z( K" z
}) X2 e+ l1 t) w8 B% I% R4 s
}* Q. K6 @+ I6 Z2 w8 n" F
6 ]. ?% o# I* U+ N. ~' d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: _$ ~6 z9 g9 C/ C( ~* ?( k
+ B- P0 C' N" w4 b6 X4 }
8 @$ q% ~6 T. X+ S" [
5 m! T" b& C w' Z- w- l' {& n" W( m: [1 G0 D
|
|