|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 N% P8 [, u$ k* v9 z7 T6 Z( k1 l9 I+ a2 O$ ^* h/ [& f) h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ _3 v, x% a7 M8 X5 t
#include <unistd.h>
$ e& ^. f+ q; p2 T6 ~" J! K#include <sys/mman.h>' O) O/ Y* r3 d8 M3 L
#include <sys/types.h>; k* r2 q3 Z4 j' h; |$ n0 ]! I
#include <fcntl.h>
% y2 z& E# W0 B* I5 e1 }; i: ?! ?- Z- O( {, O
#define SHAER_RAM_BASE_ADDR (0x80000000) , F% A! n* ]5 K/ a2 T; [
* v" S" d" ]7 ctypedef struct
9 [4 b2 y' C& l- }{
) d/ h# ?( [9 J& a* E unsigned int a;/ w2 ]: M- w1 _: E* q( v; [
unsigned int b;2 x( X3 ?% l$ P, P9 ~4 y
unsigned int packet_cout;5 [" x1 g# n; F6 d4 D1 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 j- P& K& @1 u8 x' ]. b6 R* f$ X2 j4 I! N" D7 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, P' m( Q0 N6 V5 a: w. lunsigned int count_copy = 0;. ^2 |& }7 D# d3 _/ M# V: [
4 q7 d- d( a# J1 L! f/ _) {
. I- d8 u- Q! k
int main()% }: ]; [/ k+ Q; o+ ]
{3 R. d0 u$ X" T
pRX_MSG_PROTOCOL pshreRAM = NULL;4 e! D' j- u3 D- j. ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) J' D) t) W& L3 G$ }) l7 _1 a. x% W" F6 I7 A, ?- ~) j! s
while(1)
8 A8 Z% F% s7 _- e% U2 t, Y" d1 E {
! d$ Z3 U* E- { read_MSG_buffer(pshreRAM);
4 \ k& E- w0 M, d8 [( q }
: X' \( j o' m$ n1 U/ q. F9 ~$ D}3 r7 E6 b2 E8 H9 O, e
: K+ X n. N( u) W1 r9 Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 {+ g4 S* T( r8 G{
$ F+ {: P0 M& _4 l RX_MSG_PROTOCOL buf;, M7 e0 n% l, N, J
; e4 F+ [7 c$ X+ ?; Q buf.a = pshreRAM->a;
9 s& t9 v3 O0 C2 m buf.b = pshreRAM->b;% ]5 x7 T* n) n$ L' w8 v
buf.packet_cout = pshreRAM->packet_cout;) w( Q4 Q2 v- U2 z g l4 J
. u* B$ H& C1 j1 i8 d2 S if(buf.packet_cout != count_copy) e( X$ T8 K; h! p
{8 i2 G6 {% g$ R! `
printf("a is %d\n", buf.a);' \7 H; K1 E) N9 }5 P9 ^2 m' v
printf("b is %d\n", buf.b);
7 M4 f7 }- K9 a9 n- k printf("count is %d\n", buf.packet_cout);0 o; p. c% B @: ~! ~) a5 J
count_copy = buf.packet_cout;8 r- l* `5 ~9 F5 L% v5 k% U
}# f# M* A; T; t. T! T1 u) H& o
else+ x- X5 q8 u, f" }% }
{
g5 x0 ~, M7 M1 p N+ i) z, j# S# m printf("No effective message!");
9 O5 z5 _, i# k! F; l5 k1 i0 _ }
V+ U2 Y3 t& }' `. B; ]}
- a3 ?; Y& j' C- s+ N$ W# I0 D' \$ ?; N+ R G; J/ Y% y0 k0 Q
2 i7 K S, u- P2 f9 V) n. L' _: m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 b* N0 |: v. I* P/ Q+ M使用下面代码,对内存使用了mmap函数后:
! d: x2 T4 A1 @: A9 C#include <stdio.h># H. |8 z0 p# Z6 _. y
#include <unistd.h>
5 O, D1 L2 `' c# G$ ^6 G- b#include <sys/mman.h>
. }" i6 W8 l. J) r- I% s y |, x#include <sys/types.h>
# ?3 Y+ s$ [* H, n: Y& o6 k; u#include <fcntl.h>3 `. X1 l% t7 d! G3 U( K
1 D: C" w! u& s, ^% [* r8 U
#define SHAER_RAM_BASE_ADDR (0x80000000)' |$ S, i6 _! i2 Y# q- w
#define SHAER_RAM_SIZE (0x20000)
' X& Q2 m8 ?+ \( h& @. n0 {0 K" P' i2 d$ e
typedef struct
1 p+ J7 z8 ^7 p{- M. b/ A0 w* S4 E! c E
unsigned int a;5 E( E- Q9 ?2 c) L3 ]+ g3 V, U. X
unsigned int b;
5 ^6 b$ Q/ [2 S8 i; t unsigned int packet_cout;+ ^+ c+ G! U D% O2 I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' E* K0 x4 m* k7 p8 d+ u5 V
' y8 w7 ] r" t# ~void read_MSG_buffer(int *baseaddr);# q Z8 \ |" Z4 {# E/ G& Q
unsigned int count_copy = 0;
0 i6 ]+ z$ E. j9 c: Y' H, M+ x. E- T! A) v2 N5 N
int main()
% q8 f/ k C5 ?4 f& D{- k" h S5 S# o" x/ a- ^2 v
int fd;+ }7 W- [ {+ A" r# v- w: W& a
int *mem = NULL;
# J- A2 w/ Y3 X* U7 v0 l$ x# Q3 l
' a7 J( i5 @5 f' D. G: b- q$ ` if((fd = open("/dev/mem", O_RDWR)) <0): |* ^4 N. c1 ~& g7 Y2 k
{
' r- b2 G' ^+ E) p$ T X perror("open error");
: r* b$ B% o6 F+ ~0 y+ Q return -1;
. M( q8 b/ P1 M& b& v' U! N }
$ h1 A- C; D. W1 Y
9 ^% B* e; X; N( B5 d* E mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. }! t! X @' b0 h: ]7 F# k
@- i/ q: P- W+ ]/ g while(1)$ G' T3 d4 d( u5 o" a" ]
{
# k9 s7 M* @9 q9 @& j4 L read_MSG_buffer(mem);' @0 w3 V, T0 [( Z
}
/ i- p y* ^, ^' z5 Y9 m0 s+ v}( b* y- e& K1 D2 U
* _2 v: J7 c$ T {void read_MSG_buffer(int *baseaddr)% |/ g6 H$ _6 K6 B2 a
{' T3 A6 x L6 V( N/ Q; E
pRX_MSG_PROTOCOL pshreRAM = NULL;! Q; X. E5 t1 G8 t, o
1 w; ?! @9 S: W. i& b9 _$ N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ U5 I0 b* N+ h7 T3 c
* N: W! N) c, c( R
if(pshreRAM->packet_cout != count_copy): v k7 o/ m5 t+ S9 o
{* W6 ~. A, p4 O
printf("a is %d\n", pshreRAM->a);6 p- d! |6 f6 D$ \9 b0 n& |
printf("b is %d\n", pshreRAM->b);
. }6 S4 P9 q1 }4 f% ` printf("count is %d\n", pshreRAM->packet_cout);/ \$ l& r$ X8 V$ V, _# d$ ?" ^
count_copy = pshreRAM->packet_cout;$ c" E. o; V. z U% f
}+ {! ~9 @. p- J3 @# y
else
W' G8 i8 M, ^) t+ V0 f( W {) Q! D4 j, ]9 r- f* @/ |
printf("No effective message!\n");" b7 P) X K Y( p- c- A- |
}! k9 T3 r1 V/ i- e! y2 N7 l1 v
}
" l( w- a0 k' ^" x+ b+ I' E9 g, W& L U$ ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& U$ M5 z/ X- l$ ^2 F- k9 ?$ n5 o* C
8 |) B( L: O3 A' B
( o5 }/ M' H4 k' Q+ T8 ^. }
0 n& e. a8 r }6 e, q% u0 ^6 ?- S |
|