|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & }7 p% A/ k& C, W6 o
2 _/ w. W1 I$ |+ c; vOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* u# w5 d) O3 e1 r* A; L/ n#include <unistd.h>
" C: m8 O- C4 O3 [: T4 V5 j#include <sys/mman.h>
2 L# o" M6 B0 Y8 c4 ^1 j#include <sys/types.h>% @2 c* `8 w3 v6 U/ P
#include <fcntl.h>: J: X J8 S6 k$ T
) P$ g& X6 A Y. n#define SHAER_RAM_BASE_ADDR (0x80000000) + b* i% u$ R/ G u
/ [% { q3 C+ p8 S
typedef struct
5 @: w" ^/ t5 I{ s+ B8 j- Q, G" A+ U- F2 ~4 e
unsigned int a;
/ F( H* I* J7 K# u) q, }3 t unsigned int b;
3 i. t/ m2 O5 B* l! y3 Q. A1 z unsigned int packet_cout; m- E9 l0 I- R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 H. N- {' b. B' ^/ Z# p9 o. x2 v' T
3 S& m1 r! N" b; ~1 d Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 k: K2 N6 ]/ i9 }. R5 Vunsigned int count_copy = 0;, B" H4 }7 c) H! H6 c0 {
! [9 P! M: Z; a; ~" L" V
$ C) X. u8 x* H6 `int main()* c- o( A0 H* t. W
{2 y# x3 [# ~, l9 `+ ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 a7 g% q8 i. s3 W; p6 t3 o pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" n: }% g- j# ~0 |& S& s7 [* G) a6 y* e. O. @7 h
while(1)) @% R, I/ H. T; v3 b* E
{# h6 V' g% h2 X
read_MSG_buffer(pshreRAM);, L1 T3 F; h$ w$ p7 ~# O+ h
} . `- F3 W& I/ a$ Q6 t
}
/ @! T( A. z1 k9 f9 q% f- E% Q
, }2 \1 c' L$ R+ a4 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* }* B E. p7 |, R% Z9 Z* `{& l5 T. ]+ l- U+ ?+ r1 c W
RX_MSG_PROTOCOL buf;. W# \6 m1 j1 d. b- G- ~
- E7 j3 s# t$ Q! b) a buf.a = pshreRAM->a;
/ W7 s8 f; g! d( c+ k/ X buf.b = pshreRAM->b;. J; j1 y8 y4 k# h5 [" E( p
buf.packet_cout = pshreRAM->packet_cout;* Q1 ~/ G+ I5 Z
% h7 U% B0 P \7 D9 G
if(buf.packet_cout != count_copy): Z0 a) x8 J$ [) F3 T
{0 w4 w8 ?5 `: @
printf("a is %d\n", buf.a);
: a- p9 @3 i/ T" k t; I3 Z printf("b is %d\n", buf.b);
5 v1 p+ X6 J& U# M printf("count is %d\n", buf.packet_cout);1 w8 |3 V+ B" M9 f
count_copy = buf.packet_cout;$ Z+ i5 z( ~" E% Q2 o) p
}
7 |) N* M5 {1 [ else
( ~" l+ S" Q; B6 e) o7 K0 }; Z L {$ X7 @% o, }% w, s% G; j! [1 g
printf("No effective message!");5 p, T* e+ y8 ^2 O
}: y/ \7 B; z8 I7 h, T
}
$ l [" c( d$ }; L, f8 z, L" X+ g! b3 _' U$ K
5 Z5 ~3 j$ c. I4 r- ?% T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% `7 h3 d5 Q. V4 K
使用下面代码,对内存使用了mmap函数后:
I3 Z2 ?% X1 z) E#include <stdio.h>
0 V- p1 d3 Y( t% K: q3 l ^) b#include <unistd.h>5 t% X7 S C3 Z
#include <sys/mman.h>( G! a0 I7 d" l, ?( O. h
#include <sys/types.h>
/ T: Z7 r' Q2 e#include <fcntl.h>
- _0 g9 V0 M, A5 {% u3 @! x; l$ J
' w; _7 g4 [# V# V6 u; X1 f. W#define SHAER_RAM_BASE_ADDR (0x80000000)
% V2 m6 Y& w" `2 O( e; t#define SHAER_RAM_SIZE (0x20000)
- Z4 b8 x- S( f4 C, R" p: g# @4 R9 {% v
typedef struct
+ U- v0 G* u0 S, H0 e! y5 `{
" W o. K! o! h, @; E unsigned int a;
3 a9 |2 H. i o3 f* X6 P* C# Q: h unsigned int b;3 l9 N3 _3 I' `6 I
unsigned int packet_cout;5 A+ |8 C* L$ h+ n- S4 y G2 a# l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ D, j: S7 |! T7 X: [5 S- ^" S+ P
6 t! ^. K% X# d6 p- w( `void read_MSG_buffer(int *baseaddr);7 n5 {7 {( H$ a' P
unsigned int count_copy = 0;
5 J* D6 x M& ~8 N0 Y Q0 l: F" [( W, b6 [
int main()
7 z* h6 U: H- n, `5 S{7 v) B5 Z7 y c/ p
int fd;1 w+ Z3 B$ q7 V3 h
int *mem = NULL;
, L# s- i) n# u, s' r0 Y
1 E# h9 D- p' `9 Y4 H; u if((fd = open("/dev/mem", O_RDWR)) <0)
& p9 E; i0 L, L2 ?* u {
& i( w) M" ^( c. H9 U- G: a perror("open error");8 f- b9 x( {6 V$ ]( T: h
return -1;
2 x# A" G2 R, E& l } F( C6 m9 i& ^7 r
. A4 s9 O. O, J4 [& B) V mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- K. R5 L0 t/ U1 n
. \2 w' b" m k, o+ h+ u; V while(1)' e. u: g% K( y: h# s
{4 Z! h& _1 i8 I1 l; A" Q
read_MSG_buffer(mem);: g# w3 E3 k5 w1 |. B+ y
} " A. e2 X/ }! h9 y
}5 z+ u6 O. }- L* F* `
4 \" n- ^+ }) q/ E l
void read_MSG_buffer(int *baseaddr)& W1 h5 B3 D0 R% h9 o2 T
{
% o) Q' Q( L, t pRX_MSG_PROTOCOL pshreRAM = NULL;
3 e0 a* ]# Q( r7 M3 U; k( m& b* |* q$ s* I: j; I
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; O; x5 U/ C0 a V7 d, s) @1 T
, b8 ^7 v( l8 E: c# n$ b+ [% i: o if(pshreRAM->packet_cout != count_copy)
; ^, U+ E" R" n4 h {
4 J3 r* |0 a" W1 Q printf("a is %d\n", pshreRAM->a);
1 `9 i" U7 I9 x8 Z. J$ x7 z printf("b is %d\n", pshreRAM->b);
7 i9 I# O1 f" J% D; i printf("count is %d\n", pshreRAM->packet_cout);; r& V6 m% l4 J$ z
count_copy = pshreRAM->packet_cout;( p3 Z* Y' G% ^" o' M0 |
}5 ], h# C- Z5 z$ }
else2 g m3 a9 g, ^ ?* n* p; ? n
{
; C. |8 {% r3 f/ @+ M- B" [; ]& w printf("No effective message!\n");
1 j4 e7 x+ L) i' M( e- W4 ? }
/ a( J5 N2 l0 r" g: j}& i2 `( @4 |# P( ^
# l& S. o8 C' B4 {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; N# i* k, M% ^ D# x7 B; Y5 w0 D" Y+ C- h+ r- a
& J6 x9 k4 F) I& T) A$ u+ E4 h
3 x& `6 `, g8 B% D5 Q
$ k8 L7 ]1 `: \. O+ q2 d
|
|