|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 U: u# {! E% l' c: {* S
/ o g# T5 I0 K* k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' q v" F. f% X( h/ L' `#include <unistd.h>7 r4 e& d% ~* y% m4 y
#include <sys/mman.h>) E; d: l" @2 Y; h: X) X; Z
#include <sys/types.h>
# j( L( C. L) [# b#include <fcntl.h>
/ v. t9 R) z" n, \% E- g% n, T2 \* i) J( X |$ K5 T
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 k; h* r6 i1 i1 m; G8 l
' f6 @0 b5 y& ~* etypedef struct
% O; j4 Y; X1 P6 R4 P; z{$ l1 k) X7 j9 P5 z3 Y3 H. F4 j
unsigned int a;
* g. d( C4 y0 B) C: p unsigned int b;
/ z1 a! O& n$ T! c2 \: S unsigned int packet_cout;
0 M' r9 P( \& N: v4 P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; p0 G* G5 h* {' Z
& h- d+ N# J. x; k8 F/ |, L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, L- y* m( W _9 R Z! |- `
unsigned int count_copy = 0;" d- V, Z8 {3 g7 j
, ?% \( X" f+ K/ U$ h: {7 v
( ^# Q- U. L, B( Fint main()
+ G2 r8 b ]+ C% B. H{% x; D- t- D3 X. W' {
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ v* O; p5 ~3 i( M* @1 r9 Y pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 d; T: o& X, h% d. E# S4 ]7 j* C6 p4 x S# F
while(1): C' i5 `/ ]' F" C S& C x
{
! |3 ^: k5 L0 t" ~6 T* Y read_MSG_buffer(pshreRAM);& W3 n+ g: ^+ Q6 l" r. K0 |
}
. w( e1 ~& ?- o" n+ t" f7 |3 d, u}
* T! \% d g+ S6 i O( a. ]6 x2 y. M5 d4 o V- N* ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 t& Y# H) p1 Z0 s{
9 S0 q4 f" _1 J# r RX_MSG_PROTOCOL buf;
3 S! w: B$ N) R/ s % F. b, p. v( Z* [4 w- z
buf.a = pshreRAM->a;% T- n, y( K. ?+ ?% t' r, a
buf.b = pshreRAM->b;
8 b4 ?2 t/ H9 c8 V3 I8 n buf.packet_cout = pshreRAM->packet_cout;
: J- b- T0 F6 g* p # t9 |0 |# h8 z& m* R& h! H9 `( r: f( I
if(buf.packet_cout != count_copy)6 k( L k- K5 }4 R) ]9 U, ?& P
{
1 b' g/ o; `' M7 e; D printf("a is %d\n", buf.a);/ t4 d+ @+ j& {9 ~" r! u7 G3 a
printf("b is %d\n", buf.b);
# q0 x8 c2 D% a' ~/ M printf("count is %d\n", buf.packet_cout);
! h! j: d( m1 K: k2 C! e6 K8 } count_copy = buf.packet_cout;! k2 \3 I, v/ j( J9 f' p* y8 C
}
0 t$ z# ~5 x* G% a else' G' B& J: g: q
{
9 _3 I b! G* X printf("No effective message!");3 C( L7 q4 F. S+ ]
}
& g$ R2 M" X1 C}
# |0 m2 i. L' ~9 H- g3 X" o) `$ a" e0 n4 c
9 y* a% c8 i- ]5 p8 K2 Y8 g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& `5 R$ f1 A9 `6 P2 j7 N: {8 _
使用下面代码,对内存使用了mmap函数后:
4 t9 I4 j. ]8 v0 ~' A#include <stdio.h>
# z7 m4 H1 ?- _ m#include <unistd.h>& t* }+ i* R0 u& L# d
#include <sys/mman.h>9 E5 a, I& r( g; B+ E
#include <sys/types.h>' D1 |; I( w$ z F8 s2 ? x
#include <fcntl.h>/ V/ H7 }- G0 g) c- q( ]
+ P* V% U) _7 V. z& N#define SHAER_RAM_BASE_ADDR (0x80000000)/ x% k& z, {- E/ [
#define SHAER_RAM_SIZE (0x20000) + P) z- m+ B9 [- @% ~7 T
. E T, j9 Q L+ B- u1 U' \+ ^
typedef struct
5 N! O; H0 P) X4 C: m{
; O. z' E* U8 {9 ~8 _( o unsigned int a;, L* K3 k" Y. E1 p/ a0 q$ Z, L% {
unsigned int b;
0 s( a& g; `4 |6 h9 h& K" E& L unsigned int packet_cout;7 x: R8 v) J$ g$ S2 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 b9 o% Z7 ?! N
7 n8 {5 K+ m$ @; @( F2 u) E- i
void read_MSG_buffer(int *baseaddr);
* N+ t( s, k. ^8 a% junsigned int count_copy = 0;
+ `+ N* N& W" @( G& H% U: d: `
& u& N: n# g3 h+ T' ?0 \/ f* x: dint main()
1 K. e# f; t$ S3 h{! b2 r- t5 N) I9 r& Q0 I4 U
int fd;
2 f' Z/ h* l% f1 G' U- ^: j7 d int *mem = NULL;5 y. f6 o4 g6 s
; _% u- ?* K3 I' _& I( j8 I if((fd = open("/dev/mem", O_RDWR)) <0)! I& ]8 e' T, G' }
{
/ E1 H1 a( e( ], E perror("open error");
( V, ~" Q4 g3 u return -1;9 v6 d/ U0 [6 G; k8 n0 i
}9 z3 ^5 o. t0 v) n' P, z0 ?
2 Q$ F& c. c5 \* z1 }) H mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 R; s9 T6 R* v
* j3 f0 T5 [& M2 D; V
while(1)
0 O! Q3 _! t+ c5 N p7 R5 r {
( i) i" x) i9 q* g f4 P- |3 j read_MSG_buffer(mem);) M* X' R1 ~9 t" I( k
}
8 y( a7 `$ }* f( Y}- M7 t2 m P( n `9 I
( l( ?( ?$ b" B- `
void read_MSG_buffer(int *baseaddr)
: A% W/ W( |$ b& a9 x# r{+ Q0 u7 b8 U! {0 D! F+ E+ X, F
pRX_MSG_PROTOCOL pshreRAM = NULL;
; b' ?, M3 J3 O% [2 Y6 k" u1 a
7 D" I6 B2 c' ~3 W S7 R pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( q8 c: N. ~, l4 Q- Z- i2 b' O
: w. |- {* ~2 i( r: z% _ if(pshreRAM->packet_cout != count_copy)
; V; ~; e1 }- r; B {
- v8 F8 t2 t' H) w" f* E printf("a is %d\n", pshreRAM->a);3 A9 d, ]2 M# h
printf("b is %d\n", pshreRAM->b);, h: r5 E! J, J* z
printf("count is %d\n", pshreRAM->packet_cout);
$ A, v' b, y" N) G count_copy = pshreRAM->packet_cout;4 A# M# ^! R& x6 }; p
}
. `# D. u& A7 h9 ]2 n( J, }) x3 a else" R1 y! E! p1 R. H5 z
{4 a; Y4 k1 e8 F8 p Y# q* k
printf("No effective message!\n");
% H* o1 Q3 w: I5 Q8 p: D' c9 q }
* j! s# {4 M. i8 w! |}+ z, C$ x# E% A, q* |
" m3 Z Y3 ?& Q- H! E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. |3 \5 ^9 I# H# J0 b0 i
r' X6 ^6 z" A( ~2 e/ q* ~3 O
) A$ g% `8 h) _$ g( j8 J! L6 b6 n" @
; P V* b+ q" V |
|