|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 R3 }% b0 i8 _ L& a1 N/ N: I% W- S) f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! ^/ q8 Z& |( A( @- W1 I#include <unistd.h>
- n; C: S3 a$ z! e2 M, \; o#include <sys/mman.h>) I) J3 z, O1 M* _. l
#include <sys/types.h>
1 A" A7 \4 |6 o7 h8 u a#include <fcntl.h>) Y; G% W+ c- \5 z K
) {6 w3 J0 Y/ \8 C; z/ e, u#define SHAER_RAM_BASE_ADDR (0x80000000)
; D* R3 L4 O& f' y( ?+ r5 U2 Z4 i3 b
typedef struct
' @& R' p$ ?8 I! K( d% o- `: O{4 Q. x+ H- k* f) Y/ |# n3 }
unsigned int a;. S0 H, a& t- S! G; }& ?
unsigned int b;
: s' [' L- J8 u0 b" h$ y* G unsigned int packet_cout;
3 D3 j; r$ Z3 a) z' C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ k& T& }5 R3 R! H
7 p9 e7 _5 E, M3 G* k L2 g8 D. w. }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; n8 |. s q2 F4 {6 vunsigned int count_copy = 0;
3 s1 w% f" ?1 i* \8 j% ]; p! Y) U, @+ [( Q
" O' o" Z3 k' r* P( g9 C# ]+ ?
int main()
2 O1 |; V& h6 G7 l! Y7 \5 n{' s v% D$ {. e! b3 N* f; b6 w/ f; t
pRX_MSG_PROTOCOL pshreRAM = NULL;
' c! V5 @, }. T( C1 f0 e7 E) p pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; r3 u4 j& H% @6 ?9 O
5 d* d* J( Z: |: g
while(1)0 U9 e* ^+ x" C a0 s' n7 j
{6 p. y) f: m: r; I0 z( i9 r
read_MSG_buffer(pshreRAM);
7 p* ?+ a; o* g4 h0 M$ Y8 N }
. H5 g5 B6 ?7 O; d; B) O}2 B. N/ J4 }9 V: V4 a
( }, g+ o% L0 y) A$ svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& U, t: p3 q& a( u2 O) W' K{
) q: _6 I. K2 d1 s RX_MSG_PROTOCOL buf;
1 y8 {( h1 e8 e# m# G; ` 8 q( r; { F6 |- J' @+ ` R
buf.a = pshreRAM->a;
u# O, d7 S% o8 }2 T buf.b = pshreRAM->b;( k- M; E' |; l' {0 t8 m) a9 X7 ^ i
buf.packet_cout = pshreRAM->packet_cout;
/ z$ q f; N5 g$ v& M
- o: ]% [5 Z! E" v4 ^ if(buf.packet_cout != count_copy)
6 F E1 ?' J% V {
; S1 a1 [1 o" ]4 k" X( d printf("a is %d\n", buf.a);
7 X/ M Y# U: F. j printf("b is %d\n", buf.b);
5 i0 Y9 }+ h! p/ U' ?2 _ printf("count is %d\n", buf.packet_cout);' o6 F9 b/ m' a
count_copy = buf.packet_cout;
& |/ Q. C9 |# V- ~ }
: {& ^) r7 M& u1 Z$ t; t6 s# K6 S. n else( q2 y5 {% p5 }, v: Y7 l. l
{
( J) K( z, d- I0 f' G" @" j! h/ q5 R printf("No effective message!");
' ~* _& [% J! E% m+ R; V' P }4 w, P# k# J" Q
}
+ a( M3 d* o# y3 S: f6 O( Q0 J G' |
' W K! G& O% O" F0 C* \. V# Z1 _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 i( {: p6 t% W" M! `; V
使用下面代码,对内存使用了mmap函数后:: x4 H* \3 a) d8 T
#include <stdio.h>5 J$ p m# v& T, n z
#include <unistd.h>2 r# y4 \) T7 o- b- q
#include <sys/mman.h>1 c `, f0 S* M& r# c
#include <sys/types.h>
) H1 ~9 y$ ]" z8 G9 @, H#include <fcntl.h>) V' z; [4 P/ L6 S8 V
2 y8 D) \5 W) i. Z6 ^( Q. r# a* A#define SHAER_RAM_BASE_ADDR (0x80000000)
3 V; `$ {7 }4 e- ?7 T#define SHAER_RAM_SIZE (0x20000) 3 E) g$ C5 ?3 I4 t: C8 U9 U
5 b; O8 ]3 w( [. a: G' ^- ftypedef struct! n6 M& j* u/ a" q( S) o! N
{
7 ?- d& `8 d7 [% x7 U, A7 o unsigned int a;
- B2 H0 @& W }* b7 u unsigned int b;
K- g7 W Q* g) v- C! E& o unsigned int packet_cout;
8 X# w j' B5 T$ B- P( t# W" c4 _; y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# T* I- V7 M2 ^$ Q- i, M/ G+ ?2 S& t
void read_MSG_buffer(int *baseaddr);2 O( h7 J0 n2 y, X4 u) j E
unsigned int count_copy = 0;+ J; a9 }0 a. V( u1 `/ g0 }* i
; I: i$ L1 N; _, B# ^( `: y4 X% l
int main()& X* q- r! a2 L* ^
{' l: `1 X# d0 o9 f# g
int fd;0 I W, n6 e& x) i, S
int *mem = NULL;
. ^- _8 }" W* j0 H5 F& h# o: B4 Z7 ~- N& O7 s1 o% w+ c! G
if((fd = open("/dev/mem", O_RDWR)) <0)
0 S: j6 ~8 P$ Y: d {3 \( I! Y2 d5 n0 X2 P
perror("open error");( B* m. U- S u9 S8 B3 m; v }
return -1;
5 x" G. y( l) K2 w4 t) n }- d% j, J) f$ t' R: g" N4 w
, `4 b& O! o/ G! j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, `! V8 n9 T1 x( t# X. I# T
5 ~3 n3 M$ S# H+ \ V+ a2 @ while(1)
+ n1 I8 |! V1 Y8 ]7 c {
8 u/ p5 ^% t5 {9 O0 E. g read_MSG_buffer(mem);
/ I( @, z) U( R( K1 s5 Q } ' o0 d- n% [2 d& p& `
}
. y, a" b. \# q+ N
! c. \0 h3 h w! v6 Xvoid read_MSG_buffer(int *baseaddr)
0 ]2 _% F( _8 Y' h% B* n0 a{
+ n3 ^6 e( j! O, N% i6 n! l pRX_MSG_PROTOCOL pshreRAM = NULL;3 i# e5 ]% I8 I* i* d/ j
/ d% J N7 g3 o6 s' U pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! }0 R+ R* i8 g! ^/ ~- h, f
% i! L* s# x, C; }& F2 ?/ h5 R
if(pshreRAM->packet_cout != count_copy)/ }8 i# w6 k- x1 q& v& T( [& H
{" M) q; n0 \' _; \+ _
printf("a is %d\n", pshreRAM->a);1 F6 f6 R9 O' l9 M F; j% I
printf("b is %d\n", pshreRAM->b);
% E) `7 W0 `$ C0 `2 N printf("count is %d\n", pshreRAM->packet_cout);
+ P; }' E% o+ f7 V count_copy = pshreRAM->packet_cout;8 K$ P0 j2 z' w+ Q/ L5 b
}
6 U6 J: J) J7 o4 j( t/ R+ v else1 Q7 f. S9 ~2 Q
{1 k2 J( {2 o: s, T
printf("No effective message!\n");
6 J# ~. a& ]1 x: I1 ? }- V1 ~- |% `" y7 r! {+ [4 @( V
}0 \, @( l- z h3 V; ]3 w" o! s5 y+ G
$ d+ Z3 c; Q$ X( [) ~1 W2 M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( I4 f/ o; i' h* A G. d( Y0 W# n% u
1 h, G) S, V% h& { H: S: q: |
2 m7 U7 n/ x, C& z9 }# S# l! @' i& X6 v( s9 m- P/ Q1 ]; N
2 c+ D* ]) [; f4 G. ` |
|