|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : C7 l6 R9 L1 [4 D' N/ R
" o' r3 a/ e: |1 j0 a# FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ G- k4 v( V* _+ f( D
#include <unistd.h>- X Q6 J1 @! J8 r$ X% E
#include <sys/mman.h>
3 N6 ]5 V5 S( U#include <sys/types.h>
1 m2 b. i3 u1 X* z#include <fcntl.h>
8 I2 u3 P" \7 T# n: U6 ~
; L V$ z- F* |+ G! q+ B#define SHAER_RAM_BASE_ADDR (0x80000000) $ h5 t* Y* U8 I( z
% G1 V( P! w- D* i3 X% N
typedef struct
. m( j4 z0 q" N* O6 U2 a{
3 ]3 M* u% L0 c9 \7 _9 [% P' H" L; t1 i unsigned int a;
0 m l. a! q* L1 M: E; W5 ?) h unsigned int b;
. ]$ w' ?0 e F& M unsigned int packet_cout;- P4 e- u# d) c+ G& a+ c9 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 x* r' W7 ^/ d! X" f0 @: t
0 j; ]* [8 ]5 Q- d* Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( f5 F( p0 O0 E0 H! Z }3 Munsigned int count_copy = 0;
+ ~& T2 b- G3 P/ K2 B1 Y; V1 O3 k
; h7 F7 j" e, {int main()
- F6 f' [% G" {. g3 ~{* S, j( l/ Y. ^$ n+ \- U. a
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 m: s$ M. n+ i/ u pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 ?2 ^8 C! q/ }; `
4 j0 `( C7 R8 J" z/ n( R: ` while(1)
9 ?. B. q6 X$ J! G3 a4 i* [# U6 X& B {
$ c a. J2 D) L$ V4 `- Z read_MSG_buffer(pshreRAM);! c/ y! T& n9 M) U- Y- p
}
" ]$ H5 f" n T( X* t9 z: X) u' _}
8 V) C K D! J3 c; ]& f$ M
" ]% E5 A# F* w$ X1 s" rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 R/ E/ Q0 w: ^3 g{
' y! G- Y h* P+ Q4 u9 I RX_MSG_PROTOCOL buf;
. T* k6 B$ q4 l0 ]" z+ `
p! ~- G7 Y# [" `3 N s [# I buf.a = pshreRAM->a;- g+ f! K1 z/ v5 f% O$ H
buf.b = pshreRAM->b;. y ]" H: l$ U$ A% @
buf.packet_cout = pshreRAM->packet_cout;
, z( Z W# v9 y* c( D4 D . Z4 Y5 H; v% k
if(buf.packet_cout != count_copy)% Y& p4 C5 F, \2 `# C; R: b% e
{. n0 ]& g' S( { f7 n
printf("a is %d\n", buf.a);1 Q2 ]9 h/ y2 _ Q& d
printf("b is %d\n", buf.b);7 p9 M! Z/ I5 H5 [4 o
printf("count is %d\n", buf.packet_cout); n& U: K8 a- x" H
count_copy = buf.packet_cout;8 b6 U0 |. t5 U( i8 o( P
}/ ]3 \. a' L% V9 i% N
else
0 v& n+ l7 {0 q( F6 G. a {
# v2 Q8 ~) t5 {2 m printf("No effective message!");7 v9 \* Q9 ?4 E$ Q1 J
}
% f0 S, O% ^$ F) h: p7 T* \& V}/ B, J5 o9 b. o' f* `$ F
3 `3 j h- o8 C0 m3 X
8 g5 [" P# w @* C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; F! k4 }$ X5 i6 ?' f/ k) l
使用下面代码,对内存使用了mmap函数后:0 b9 _8 l% f- V. i) P! q
#include <stdio.h>
4 ?4 _0 z. l$ q' `) y/ L. y5 L. V#include <unistd.h>, p7 N1 g, p0 F) j. r: B j M
#include <sys/mman.h>
8 d- q/ @) u& k6 W1 b#include <sys/types.h>* A |* |6 y. s7 D/ F' [6 ?! _ f# o0 j
#include <fcntl.h>) A- r" t; {( d/ l$ Z q+ D
7 S( g n, H8 B0 l k4 E#define SHAER_RAM_BASE_ADDR (0x80000000)/ G: ^# v0 s1 O: x
#define SHAER_RAM_SIZE (0x20000)
K' I" M j8 U1 N) ^2 a9 R' X5 l/ Y4 z { e$ W
typedef struct
- ], Z5 o' ^, o/ F* C: w: p{5 p5 K, G4 F6 R4 D* b
unsigned int a;6 f q! y$ ~- o# a, V. F
unsigned int b;
. F' d4 x4 P* N, u unsigned int packet_cout;
( J, k' _7 _9 b" t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 E% a. c" `/ T+ b9 {+ n$ t, e* M, D9 H$ q$ R! J' D; S+ X+ e! a
void read_MSG_buffer(int *baseaddr);& a/ Y ?& c- L2 g; w5 e& u! y' a2 y& _
unsigned int count_copy = 0;- ]2 i+ _; F/ n
H) P+ R! w8 E$ j# e
int main()5 H) p l |1 Z: I# X
{
0 m' g& X* l2 h4 }- T; A5 x3 e int fd;
5 e8 f7 M# P% k+ A8 L; r int *mem = NULL;$ |* L" S$ q, C6 {* D7 w
, O/ i. B j- B9 O* y1 M/ g
if((fd = open("/dev/mem", O_RDWR)) <0)/ k! P W5 V4 o+ h* g
{
; w! Z) {1 }: Q3 e- M perror("open error");) P- J9 W* x5 u
return -1; C1 g$ C) c: v
}
. o# Y& i7 L! K! Z 5 J# D4 U7 Q. N* ^( a
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
F9 M! s- l) K; H$ |( {6 Z4 `5 M+ p0 ^4 Y
while(1)
$ V& {/ @% o( T. L, h" w {: O; s- [2 d9 _, N
read_MSG_buffer(mem);
/ B3 \: b1 E, P4 C3 M }
8 g9 N! u; h0 K$ K' |6 x) {: m0 e}9 l& m9 O4 |8 ^$ N* r
2 f- P4 p* M& w4 f) P; O4 u4 _
void read_MSG_buffer(int *baseaddr), z. Z0 d; Y+ K4 h4 q) T
{* ~% Y8 G8 N; A1 _
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 H! @3 `! i8 |5 H6 [
/ _; W( Y$ t8 x9 u, y4 @4 {7 G pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# Q2 X t ^8 [2 O; ~
2 ~ j6 d/ s* P" L8 ^% [ if(pshreRAM->packet_cout != count_copy)
' H+ x, k1 p# H9 y* h {; h! v9 Q+ q2 k' u# }
printf("a is %d\n", pshreRAM->a);; O3 w5 P9 R) m
printf("b is %d\n", pshreRAM->b);
$ j6 f x; K- [# t& n" m/ e printf("count is %d\n", pshreRAM->packet_cout);0 j- L. `' N- W8 R5 ^" u& Y) D: X
count_copy = pshreRAM->packet_cout;: X' @1 [: T. W! X7 Y8 B9 A
}( x3 W( O2 e1 e; O9 R
else
1 r7 _- }- V* b8 c/ `4 f/ m {/ \6 N0 [& @; e
printf("No effective message!\n");4 A* K. F# L( `" Z- k
}. a4 m# d' i: v' ^! Z" L
}
}5 z, @0 W# }$ D$ J% N1 F, j' T
7 i2 n/ V( N! q7 q l4 H7 Z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? l1 s+ z7 l$ }9 u% k% m
7 d& Q' e, B* c1 S4 o, C1 N5 `6 Z9 @9 R
- ^8 \+ d0 k3 U: E$ p5 f+ n2 N# F$ @ Z
) ] B, \1 X* ?
|
|