|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * p/ s6 y4 q& U# j8 M: l) `
) r8 H3 `' w/ u8 _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 |% X, c# ~1 T. w
#include <unistd.h>7 Y( ^1 C4 O9 o7 U9 O4 ?/ O) T
#include <sys/mman.h>
8 ^* w1 B$ c! x; w, \; j2 ]#include <sys/types.h>* i T. {/ T/ w- r. I
#include <fcntl.h>0 e$ |6 s2 Q9 x6 p8 y8 c( O
8 ?* a( `6 i# @0 h
#define SHAER_RAM_BASE_ADDR (0x80000000) ' P7 \# \* }; h4 r u' Y
$ ]2 @/ f$ y5 p; K, Atypedef struct
. G6 c: B n" f: O) r5 @{- l( T. s. V& d$ A# H
unsigned int a;
! L0 a; O" X) i! b% H0 T unsigned int b;
5 E4 m: s7 g; G) @6 R1 Q unsigned int packet_cout;" [' O* i: @% I& b& Y9 _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) k1 z( f0 [ P% L* T$ J5 T( _# A
I( V; {- u6 ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ T$ J; i1 I. h" s s
unsigned int count_copy = 0;
+ D$ q, J) k4 G6 S. P+ ?: T# g5 N7 p
& F$ |% Y( w5 n& N" {
int main()
+ e6 R. w) o7 V! k9 J2 i{$ u6 }/ }% F/ _$ j6 G# q0 R7 @
pRX_MSG_PROTOCOL pshreRAM = NULL;1 b$ M2 E" Q- I. \+ ?6 ?/ o& \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 T, u) ~2 _/ d
7 ^$ k4 g; i! J( R while(1)# W, @9 d; w2 r) }
{1 f2 p f/ o3 ]
read_MSG_buffer(pshreRAM);) B9 W4 V% [. {8 \3 U5 ]% X" r
} 7 ?+ `8 _0 o: G; L
}6 J3 C9 p |; D
, O0 N N' p8 |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 z6 O0 \$ q; ?
{6 _) l* z8 y" b$ U$ [* V% Z! f, Q
RX_MSG_PROTOCOL buf;
8 P' Q" H$ l0 C / Y1 Y1 r$ I7 _/ b2 e$ s6 C! @1 j
buf.a = pshreRAM->a;& O) T+ Z) ^& N' O/ b
buf.b = pshreRAM->b;) o8 ]' u/ `6 g0 U' u& ^
buf.packet_cout = pshreRAM->packet_cout;
0 z/ B9 {, C7 k! d, a% q* p + x; y) B* z7 }% e( O- k
if(buf.packet_cout != count_copy)6 H' c; @( M/ |/ K, \4 Y
{+ J% n* O5 `2 ~2 G1 D
printf("a is %d\n", buf.a);' n; O' j" V% u) l! Y3 C
printf("b is %d\n", buf.b);
$ {2 x: V! p9 M3 t printf("count is %d\n", buf.packet_cout);( u/ X7 v8 O- O: R0 A5 _
count_copy = buf.packet_cout;
( P; y4 {1 N' q9 [6 | }
2 I9 b* Q: g0 W) G else
5 Y: E% [* w% ` {
- k& K7 v* M2 k: c8 M printf("No effective message!");
( q& n% V) S/ o5 a }
3 K) L; S+ [6 l& \* l& y}1 d* g. W' G" }# t" O* A7 ^ N
9 Z' o. w2 f# [# g8 e
$ v& @# U" B+ t0 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ T1 I& R: D% u. H
使用下面代码,对内存使用了mmap函数后:
* J. U5 {: P* N' {" v; K#include <stdio.h>" d% B8 d# _, ^. u1 {1 z. x" W% E
#include <unistd.h>9 c3 \. G x$ h. G; j
#include <sys/mman.h>
1 j/ X0 c k3 Z# A1 k8 @1 A#include <sys/types.h>1 ~6 A y3 z; V
#include <fcntl.h>
3 U; v+ V: I/ ]* d# V
( m; K6 t4 }% \#define SHAER_RAM_BASE_ADDR (0x80000000)0 R2 o0 @* @& I
#define SHAER_RAM_SIZE (0x20000)
4 L) A* t! R( I8 o8 I' t% g$ Y1 C2 P7 d: z/ E0 ~
typedef struct8 K: m8 J' u. n/ [( E9 x* V/ ^
{
* ^% o$ `. s% n* y( ~ unsigned int a;/ a" S. M& U2 D1 Y
unsigned int b;
1 O) C3 Y' ]3 a& x6 { unsigned int packet_cout;( [" f% O& M/ t% Z; _4 H2 x+ d( f. P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% m9 x( ~! S0 w! I3 X; f2 `. r1 A# H
void read_MSG_buffer(int *baseaddr);
# A% ~' f2 ^6 e9 u4 B! hunsigned int count_copy = 0;
2 b- z4 u- ?" u; Y$ m/ d3 \6 Y8 r& s$ G4 {4 b
int main()
8 R! R! T" O2 q7 }2 S{; g4 z. K* S8 c/ B# v" E
int fd;8 [# K Z+ _9 ^9 U; ]5 i
int *mem = NULL;
! i( H0 z1 D) f5 P8 M0 }! I C3 u- J& R. g$ F' x! o: j9 U8 V
if((fd = open("/dev/mem", O_RDWR)) <0)7 M6 ~- O% l1 Y9 q! o8 ?
{; D/ O3 n- a% |: X o* I
perror("open error");
0 V6 ?0 j/ L0 ] return -1;4 j! e6 Y& I& C, f
}4 K7 M0 ~" D( i, m" G" A" i
2 F; D S9 ]! A, a. F' b5 z mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& S- i6 `' o6 Y, L: L! H, Q7 J3 x$ A
' C) X( G9 O6 t( K' g- S! z5 d" b while(1)
) Y. n* L% p Y( Y/ k" r O {, @( q$ x( J% P) j2 W+ r
read_MSG_buffer(mem);
3 e- J2 S c" L6 T5 v } ( I% A* y( e9 ?
}9 E! i; Q1 s6 v. i: Z5 ]& N; ^
* V& P; p \. r! ~void read_MSG_buffer(int *baseaddr)
1 S- x/ c8 u8 ~, F- C0 i{/ h: [4 k; L2 \* f Y) U2 V
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 J5 x0 h1 a, S, i4 D7 o6 t5 P5 `: M9 F
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* r) C6 E# b9 t3 N1 x+ g; X' P9 L; N" h' t* Q* G! f- h, S
if(pshreRAM->packet_cout != count_copy)
) v6 i% o7 Z/ r/ q. t {
) `' [; E/ {9 d% T3 Y' ? printf("a is %d\n", pshreRAM->a);
% D/ a# q0 B( l( @6 o0 ` printf("b is %d\n", pshreRAM->b);2 t4 b' x7 P% U. _2 V, E
printf("count is %d\n", pshreRAM->packet_cout);
: v: C- z; J4 p3 U& y8 d count_copy = pshreRAM->packet_cout;) k" y, q6 ]2 A% H' Z+ B# Y
}3 X( j5 @* L, _; h2 i+ P3 O
else5 {( F. M# ]/ ?& r$ U& P
{$ r: w% O; x) ]" _7 _
printf("No effective message!\n");
* V: N# h" Z3 r* s0 \) U, Z }
; g& { M! D* B4 H. A}
. x* ^" h; z( W7 ~# m+ c8 W+ a8 k- C" _3 J2 {" a. g! f$ T. i1 c# }$ p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( p5 Q0 M9 J8 k. t. |& W, [5 O) ]1 T' b' [
; u& |- k! N1 D/ O- _" T, w8 g9 E
. \3 G) U& h l7 I0 l6 s, J; \7 \& c) @ G% p) {
|
|