|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. C* p+ i. ~9 G6 s: z
* K: y6 f3 q+ Y' G2 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) j0 [+ f# A- `$ H2 R
#include <unistd.h>; Z, J1 Y& o6 H( h* `7 d
#include <sys/mman.h>
: X/ |, L0 N* A8 r) c: k#include <sys/types.h>& i, Y7 w/ A3 d2 W( y
#include <fcntl.h>- l& u5 e' Y1 G: p1 j
! _6 `6 Z! b2 T$ c0 e#define SHAER_RAM_BASE_ADDR (0x80000000) - M8 N; x( i& |: H
1 z# {4 s6 h' jtypedef struct
' {% S# y- f u% K{3 S7 M# ?. J- m% G+ a$ N
unsigned int a;- z8 u1 Z3 C; w1 c6 Q
unsigned int b;
$ n/ p" ^9 U' R( J( O V1 n" g unsigned int packet_cout;2 C0 T3 f0 v! L3 ~$ c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. f% _7 {7 J# a$ a! |: s. r5 R( C$ k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! ]9 J$ L5 ^# c2 Dunsigned int count_copy = 0;1 z z( ^6 P. ]) @1 ]4 N
1 t7 D# q* E, J% j+ `/ L
) h8 k4 h$ C' v( _3 i1 p& G$ kint main()
2 f* c9 z+ Q. Q/ F* d. |. E! S) G9 x{
- V' f1 h( e8 X, ~ pRX_MSG_PROTOCOL pshreRAM = NULL;
2 u9 x6 ]; N& \! h) h1 Z6 [' N pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- r- q5 o8 M1 Z7 J7 G) R( c4 g( A
~0 R8 ]! i: ]8 O* W
while(1)
@3 d0 h* r; j3 [5 H3 n {5 y# O: J/ ?( V( {* {9 d, }
read_MSG_buffer(pshreRAM);
7 f1 t) r# s4 Y- p }
% u2 F% n" _- N% Q- G$ j) E}
/ K7 x; A/ [! m2 `# \, q, L
* [( ~* W/ t5 i% ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 g g) Z8 x8 h' \9 R) Y{
/ K6 V! t. g& x; C RX_MSG_PROTOCOL buf;
& H4 v- B) H4 | : m6 G+ k6 q* l
buf.a = pshreRAM->a;
- o! i5 Q/ v& B( D$ ^) P buf.b = pshreRAM->b;
( L& N" h6 j' U buf.packet_cout = pshreRAM->packet_cout;8 Q# N$ M; Z) f8 D( B- H" T
* ]! i6 k3 _* `9 F7 ` if(buf.packet_cout != count_copy)9 B2 _7 v D% o, s5 d. S; S4 n f* Q
{5 t; x5 R0 l0 J+ U+ ]% B7 r
printf("a is %d\n", buf.a);9 }# a+ j5 a$ L) Z {
printf("b is %d\n", buf.b);
G7 I* s! C' ]/ b* }1 |6 c& H3 @( l9 ] printf("count is %d\n", buf.packet_cout);
# O, W" w. _/ O" C count_copy = buf.packet_cout;
0 w% w2 |6 I/ C8 y) g }. \4 B6 |7 n4 v9 n1 b
else+ c& R: t% I6 `
{
5 [& j' h7 ~0 N printf("No effective message!");
% D; i/ z+ R% j+ P7 r. [' c+ W$ b }3 Z7 A- p; N2 S- E6 ]( d5 o) Q
}8 S l/ N+ B$ {/ c0 s. L+ c
3 U8 R6 L6 U% V6 k- I2 D" `
% o7 |8 W j+ O# t# [2 X1 l* _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ k/ n `( ]( q1 o8 s" v使用下面代码,对内存使用了mmap函数后:
3 s" s7 K& h6 O3 o#include <stdio.h>1 g6 B: Q9 X1 A1 ~( N% f
#include <unistd.h>
8 G' n' K* ?+ G9 V#include <sys/mman.h>* ~6 d4 [4 g7 U
#include <sys/types.h># o( ?, _, d ` s& z
#include <fcntl.h> m4 ~4 q& K2 {5 k( y
2 o' N% e/ B0 O, [% o7 M
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 g# P, o" s: ^0 |#define SHAER_RAM_SIZE (0x20000) / t/ i" B! P1 F
% f! S* i0 x, }* }, z
typedef struct! B1 N7 J3 f. [* S
{& f& d( U4 }: K0 y, g5 J+ w. l
unsigned int a;* M" e( S" \# r3 j- m; E
unsigned int b;# e' S2 R8 F5 P" [ r* d* b. K9 @
unsigned int packet_cout;
( @8 J2 E" F& C' F2 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' N9 @% I+ E1 s2 H$ q4 [
n9 ]! J5 Q' q- Z/ }! p8 v A0 yvoid read_MSG_buffer(int *baseaddr);
" I+ j$ u* o- F+ l s% v# cunsigned int count_copy = 0;9 e" R2 h& a7 G3 B3 P: C+ {% I' o# a
( l0 p& l. f! ^' G8 r- Dint main()% Z' ?" \/ {+ T8 o+ K' p
{* G7 t. p: T2 t7 X9 i* |$ {
int fd;
. R: o, H' X; K# i. ~: R8 `: z int *mem = NULL;8 @! k9 x8 W8 S" D
- a2 t% Q% ]7 u- P. k6 V5 f
if((fd = open("/dev/mem", O_RDWR)) <0)
7 _% C, G7 m1 r1 i Y" V {* `4 {8 j, u, g) u
perror("open error");8 @" t& s+ m" S
return -1;+ E- a2 m$ w! k" I( L+ G
}
* _ R6 e# P4 x8 L
8 o x- v" L/ C& m9 x6 P mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 v3 z a A4 o4 m! j- \! {( I# o
7 c% G% D9 A' u1 ^ while(1)
: B: ]: Z8 Y5 X& ]! k8 O9 V {0 I4 ~/ w+ Z" p, N u
read_MSG_buffer(mem);
) T# u9 V `# ^) m& T n2 g h }
: a5 T: b$ O# k ~+ J9 c Y2 W6 X}
) t: s+ g! S s8 C3 Q1 o/ ~& x: w% }3 j( h( B- Q
void read_MSG_buffer(int *baseaddr)
& D8 y; `, C! X% n. V. b{
{+ E' |1 t0 h; y3 s pRX_MSG_PROTOCOL pshreRAM = NULL;
+ I. l, O+ m$ Z# i+ v
1 U' o$ C5 |7 A8 B' a pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 d/ i0 m3 V. h8 n7 Z y
$ d/ E: Q5 Z' t
if(pshreRAM->packet_cout != count_copy)4 v( m: {' t; v, l
{2 B! R' U" K. C$ U
printf("a is %d\n", pshreRAM->a);! l8 i% @+ |5 v2 n1 \: A3 L
printf("b is %d\n", pshreRAM->b);
i( V& ^7 t% x2 E1 e& P printf("count is %d\n", pshreRAM->packet_cout);- H q! d0 Z: x, I) l" a
count_copy = pshreRAM->packet_cout;
# P4 ?& ]! ~( x) v% x) G- C) X }
9 l- d% W# \ H& L/ b else
0 k- S3 c5 v3 s {" r4 W" p) R& M: h
printf("No effective message!\n");: x6 c! y0 d0 N3 w
}2 y! {( K0 {% r1 |) x
}+ D- L! Z1 O# v6 u0 A+ L4 X: y
$ `' R& C/ M8 F* E7 l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ i8 F4 |# b9 `& [$ i, \8 t5 p
7 x0 E( Q0 G% u3 z" q1 J( }! h* y! _+ u( H
& |6 j" t& b2 u `+ q9 a3 C
( s: |: m" f b1 ^$ m( J |
|