|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: z2 k6 h/ |& p, `2 O- V$ L8 C0 B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& b7 I2 s5 w( [1 Q#include <unistd.h>6 k0 R8 K5 y) L r$ ~
#include <sys/mman.h>$ \5 U6 N- V/ G7 `4 h/ _" z
#include <sys/types.h>
" M Z* ], T' ^, I; ]#include <fcntl.h>
# ?5 a5 R- p6 q- X
9 v0 W+ z( u) r& W2 F' x#define SHAER_RAM_BASE_ADDR (0x80000000) & u' T8 T7 n. b$ m/ U. Y [$ Z# j. E; t- g
/ ?' T9 {, r. C4 m1 [
typedef struct
5 |4 n+ F3 J1 S* Z% L# r{
9 i% ^# N( F, h4 A unsigned int a;: z5 X8 A0 R6 ?4 n' q [6 z
unsigned int b;% ~3 ~% B2 t0 |7 i0 w1 ?
unsigned int packet_cout;
! B4 U3 \; m4 O6 A- e) G, e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
s; C& ~( L1 q- ]6 b. x9 P3 G: w: P' x+ V" k# L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 t! r+ u6 }( |3 Y- O3 p7 G# zunsigned int count_copy = 0;
5 {# @9 Q! O: D: i& @
4 K: H4 d* Y% f: I! s: n3 f! [0 f, n' `
int main()
) G3 S+ u8 S) y( T9 |0 a" c{) |* T9 D. l) S) x3 W
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 q# x! R" X% V/ g% p& w6 e pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! t1 K+ M/ B9 p d
" d8 m2 g9 S1 ~" ?. ` while(1)
3 R8 @. w# V% I- R V1 C {
7 y* e8 G/ c7 k! t0 J read_MSG_buffer(pshreRAM);. c6 W o4 Y- h
}
+ f# h- q9 P* N# h1 ?0 O- p; e3 r}
6 }4 ~7 y7 d4 J e. t; G, z6 E% G; v8 P5 \0 l4 n& ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 m: K* B2 H. z1 A+ X{
4 L% v; R8 j. J* Q& j( N7 W RX_MSG_PROTOCOL buf;
' F/ x' G; w/ @' l9 R2 W . W7 f4 z2 g! s: a. D) f
buf.a = pshreRAM->a;/ g- U6 f8 R; q0 Z0 |; H: b
buf.b = pshreRAM->b;
2 _9 d$ X! w6 _; F* j4 N buf.packet_cout = pshreRAM->packet_cout;8 a2 J) {* M. U2 t' b3 Z+ i
9 l8 C. h, E ^+ m0 p6 g3 | if(buf.packet_cout != count_copy)
5 \- n) ^7 @5 l: l {) A+ t; H8 D6 b0 p
printf("a is %d\n", buf.a);
: b6 o9 ~# a; l2 V printf("b is %d\n", buf.b);) |; x/ k- [+ `' m" j' `
printf("count is %d\n", buf.packet_cout);
$ I& k( H' V7 B7 x9 {. ^2 q: i" t count_copy = buf.packet_cout;* \- e) `- B3 o$ ?3 {. q) s
}
( N1 m7 N& i* E' |6 `; [ else
$ i- q# f* c6 s: A- j% A {
1 U' {! p2 @( w6 I0 F3 Y printf("No effective message!");
1 G. k! S5 ]( `7 U/ {! F- C$ ` }" ~. u9 C' s5 K! N- E
}
2 o* W6 b" c* |) s* _3 t' g
0 p# v" K8 V' p
8 d0 D, n2 }/ g. y/ I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
e) F. J0 _: w# _# @+ m4 P( W使用下面代码,对内存使用了mmap函数后:% t1 T: Q, n9 y" U! i7 Z
#include <stdio.h>8 z+ \9 M: q' f+ c
#include <unistd.h>
, W0 ?0 w, d: \#include <sys/mman.h>
8 }/ i; J5 h9 _2 C% V3 ]#include <sys/types.h>
) T5 m0 z' j' @- e* ] A#include <fcntl.h>/ M5 Q4 q% q) V/ a: ^
, i4 u4 F: t. O4 Z; z+ g, t
#define SHAER_RAM_BASE_ADDR (0x80000000)8 }3 Y4 F4 Q& A/ X) Z7 f1 @: }
#define SHAER_RAM_SIZE (0x20000) 2 |6 U3 x! t6 {) N/ G+ y7 C
; q+ k5 H9 D. |/ ^1 d
typedef struct
7 i1 B2 e1 [2 t0 @- L{
( a& y2 `1 O$ f. a unsigned int a;
5 H0 L* m8 D8 E unsigned int b;) n" C; U/ ]/ `' @2 F
unsigned int packet_cout;
( m* n0 u9 m5 W1 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 {: m& D8 E, F+ C1 C( }5 M
! s7 T" W& M, U; E. _# r1 k7 h. rvoid read_MSG_buffer(int *baseaddr);
8 d2 D* y# Y6 d* [6 K& nunsigned int count_copy = 0;
- T# W. i/ H4 Y |, E. ^5 I
7 g- D+ l# p, p/ S7 Qint main()
8 Y6 v! W H' G% p# r" O{+ v8 s3 S6 c5 L* }
int fd;/ q) |* g8 y! M- O+ I* I; e( k/ x4 ?
int *mem = NULL;
5 E' }: e. v1 N. z9 B4 C
/ n0 ~( S: c/ j1 F4 ^4 j. Y if((fd = open("/dev/mem", O_RDWR)) <0)
Y- _, r; d8 k6 f {
0 g/ I. T* g3 k1 Y* \9 G9 C: W perror("open error");
/ M" A) N: Z- G- r8 k+ l return -1;' I& j2 p! R# i7 `+ k1 Z
}
) G: ]* G$ m5 g( r" l7 G
' l3 m6 P0 g6 h mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' x' V; H$ B$ [) r
* h ], @- \8 H6 F+ }; b. H$ |, x( F% B
while(1)! |$ O" Y0 Y+ r2 A8 {' p8 @
{: }& d! M; V# o6 b! A. n ]
read_MSG_buffer(mem);6 I8 R& k2 b7 M/ e$ c' h
}
$ O( j% i. o8 {$ r}$ }5 _! p& f% P: b& U3 L8 d4 n* K
$ P# ~" R: g% G- C' W- `void read_MSG_buffer(int *baseaddr)
, Q, E$ v$ m4 f2 \% [4 Y' [0 c{
" F; V( O8 f2 d; z/ e/ D pRX_MSG_PROTOCOL pshreRAM = NULL;- U# |5 p! {$ l% I, U
- G. _5 W# T) H! O; d pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 s) v. y8 p, x i3 o
! h3 f J$ z: s0 u if(pshreRAM->packet_cout != count_copy)9 Q5 t! _) N+ c' \# E% @
{* l4 O$ c& d! c# C
printf("a is %d\n", pshreRAM->a);
/ Z* k* [; K& Y1 F4 z7 g8 c |: G' G printf("b is %d\n", pshreRAM->b);
" Z2 e H0 f* a! o% V printf("count is %d\n", pshreRAM->packet_cout);
, h E+ W) {" ~) @ count_copy = pshreRAM->packet_cout;1 c% m& ]; L1 X; z& \
}
1 G, K, A& p1 a- [$ { else0 o4 |7 ` F# |4 Q& }! o# ~
{5 T' A( c% h3 @. [9 |
printf("No effective message!\n");
" G2 A6 ]# U9 y- y' {8 v; t }
7 V$ p- i. @% [( k}
# V. A. v( u' v& O! y
& g) q2 x0 `6 ?& f" @# W& b, d7 f没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" t% w s! P! l/ s: @5 K. ]) M4 A8 c/ ]4 ?& i/ F* Q* ^+ p, P
, R8 k& g- V+ ]( _
. l6 e2 Q% E. }# a0 q' P0 z
u/ X. H; ]' H |
|