|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 S( k8 M5 l% O- s
( Y, j- T, [3 n7 DOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* q6 k2 D9 P& c( U% C% P8 W
#include <unistd.h>
: E$ J' S( r4 U9 @#include <sys/mman.h>
, x" s9 P; T h- i#include <sys/types.h>$ }5 P, t, M& N7 P: b
#include <fcntl.h>
+ m) Q$ d# Q) M$ u! g
4 p4 n1 @ \5 H+ ]# M#define SHAER_RAM_BASE_ADDR (0x80000000)
) U2 ~- U5 b* U0 P: [5 B8 c2 o" V* s' y* t* j/ @/ D
typedef struct
; h& V- r( ?/ J! C/ f{
1 S# k4 M" J2 c% u0 d I unsigned int a;( V1 p1 t+ K% {3 X; Q( ^- j5 u( j/ Z
unsigned int b;
1 M4 ]) }4 ]: V: P unsigned int packet_cout;
& y+ r2 B% ^3 x5 y( F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 H h6 U0 E4 Y4 Y6 w3 X k! v" ?
/ d9 U# d# M4 @$ uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 N* D$ z: `4 N( kunsigned int count_copy = 0;9 n- y; F3 S: w: C* Z1 _
; I2 b" Z% H9 m' p0 Y6 p" ]* a/ w
. n) b: g$ x }3 X5 mint main()4 G3 Y3 d. n8 @0 F* f2 Q
{
/ x- K2 {/ V9 ^* u" i/ E# d pRX_MSG_PROTOCOL pshreRAM = NULL;
6 S$ r! P* i7 M, M pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( k) L3 \8 F+ U! \% b# b, d
' \- p# E) i2 ^% z, } while(1); c; |0 ^6 k- O; o0 d+ k1 I& R+ N
{8 v$ ^. {4 O3 E* z2 g6 m
read_MSG_buffer(pshreRAM);1 Q( D" H) p, s5 R- z
}
( K/ w) G% ^! U5 _, d) _' f" Y}& z3 \6 L8 H( z/ j
7 |$ W6 m3 k. h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& o3 H. k! P8 @7 F+ D* E6 g
{
- b" ?: w5 d' _9 ` RX_MSG_PROTOCOL buf;
& V2 a0 K2 J$ b2 @8 Y+ t* U ) K# I# Z/ d* X2 c# \# W
buf.a = pshreRAM->a;
* D; K4 m( v! v buf.b = pshreRAM->b;
( Z. o1 p- x/ Z4 P t buf.packet_cout = pshreRAM->packet_cout;* b4 {/ n% @) p6 d; j
# W) }( C) ~8 | if(buf.packet_cout != count_copy)
4 w" |! d0 U3 O, ~% _7 C, ]$ ? {* S" [& y& a5 A; n) p
printf("a is %d\n", buf.a);0 i& M4 A) c& k* |% q
printf("b is %d\n", buf.b);" w- t+ g. ~# \! L! r5 g! b
printf("count is %d\n", buf.packet_cout);
8 K/ ]$ Y% j% i3 z( B6 X: K$ r' u. n: q count_copy = buf.packet_cout; r o/ L" t2 e
}
' C3 {$ J9 @ v* L1 V+ Z else) W/ K% T' \( F7 q
{: f& g1 N1 {5 J2 w
printf("No effective message!");# }- O5 ^8 Z0 W7 t; g! z/ F
}/ c+ k- n" @2 f# L) S% z
}
" f) |9 ~" M$ j& }7 O* ]$ T; I
: ]- z% ?3 s3 M0 r8 M% O) R/ I4 L9 N1 Y0 T+ {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) c' F' k5 Y) [) A8 u5 u* J使用下面代码,对内存使用了mmap函数后:
, O; Q; t* y r: G! @# Q#include <stdio.h>
" `, m" ^: I% O#include <unistd.h>
- t# T% |3 j1 H" m#include <sys/mman.h>( v: L1 @- i. o1 W
#include <sys/types.h>
2 w \2 p+ b9 f; R2 T#include <fcntl.h>8 |- r& p) i6 ^
2 o3 B, u0 R/ [% @#define SHAER_RAM_BASE_ADDR (0x80000000)
, K0 u) C* J6 r3 S1 H#define SHAER_RAM_SIZE (0x20000)
' B: b+ E3 \; H9 _: R
, T' C; \' z' F& ?- j" Ytypedef struct
& E3 ^1 _& H2 X+ ?: y0 q{
2 S# g* {2 H& B, e" D/ O2 F- g unsigned int a;
) X& `3 H# _2 r$ }7 N unsigned int b;
' S* P- k! P; U9 G: i% I' t unsigned int packet_cout;
+ `0 `9 x6 Y# p$ r* w0 l7 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 k. p5 V+ G+ s( v2 t" b3 k' y' W" `8 d
void read_MSG_buffer(int *baseaddr);
z7 ?' T( V& g# m# X) Sunsigned int count_copy = 0;
; q+ @3 ?7 j5 g0 y0 B
/ Q8 I( q# `' q3 t4 V9 m$ f8 Iint main(). _& Z- X5 X2 b5 m2 R0 i. G
{7 Y/ x$ b7 o8 N; Z8 j
int fd;
' ~7 [+ u; e5 L1 A: N$ i int *mem = NULL;
! o( H) L. x( l( A7 }% R9 W1 T Y2 L( U9 b* U
if((fd = open("/dev/mem", O_RDWR)) <0)3 e+ ?( |0 l- \. r
{
" I( d1 ^) N2 z% o9 h0 Q6 u9 V+ m perror("open error");# J8 p) C. A8 ~+ b. e* d
return -1; w" E d7 m$ H
}( V, p* Z3 h% }% c
& x' K7 |) l' x/ w+ ?1 _2 s mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ [( X8 K' S) V; N+ d
# W- E; v7 z) c2 r% C
while(1)/ K0 b6 n- Q: C" a
{
& i6 L9 q1 s2 V3 H3 Y& z# T read_MSG_buffer(mem);8 o: k8 l+ U: i6 L9 f* d
}
. M$ T* P H/ J% A7 d; g- ~4 i" |}4 ~# z: D3 K4 H. ^" K
+ c& N1 C+ w2 _. n
void read_MSG_buffer(int *baseaddr)/ U6 g2 M/ O0 u, H9 T
{
$ s+ g6 k$ L! H# ?* h pRX_MSG_PROTOCOL pshreRAM = NULL;
5 N& X( n9 p- L
2 Y; Z" j2 Q* O# u- ?6 h pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 X' G% F) v* g& D! o4 w7 S/ l6 h, t9 C6 b% K0 R5 ~" [- w7 X
if(pshreRAM->packet_cout != count_copy)
+ O4 z# j: ?$ z" F {
, W% R3 @" R; A- y6 A4 W printf("a is %d\n", pshreRAM->a);
. m) t. e' S- e" O. e1 e& | printf("b is %d\n", pshreRAM->b);
+ _& O: F' @( _: N# U/ [1 v printf("count is %d\n", pshreRAM->packet_cout);! E! X! w0 |$ Q5 U. x% C L+ w
count_copy = pshreRAM->packet_cout;, D) v/ d/ w$ X g
}6 C, n" x5 a: \2 Y3 |3 ^ r' P4 D
else3 O; O/ d6 r, j2 _
{
3 l3 x& h: L9 r printf("No effective message!\n");
7 n' O5 K6 P) A5 M# A }9 L8 o6 L. y( D7 t4 P) F* O
}
) [+ }+ q5 `& I5 v- o9 c( T* o& }' s. K: q/ \# L9 l6 H$ _) z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 R' v, C3 s* L1 O# U- `: q& K; u7 v+ P% e
# X$ S$ w3 D/ R* R( t$ W D( n1 E. U( k; F
: u; q# n8 s$ o; Q |
|