|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + h% c3 [4 f, V7 q R( ^. _( e; n
$ G* K6 r% l- J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) h$ C6 s7 x- X$ z#include <unistd.h>8 _8 r8 D) N) r! Y- n1 Q/ y5 Y
#include <sys/mman.h>2 ]3 P9 Q4 B1 T3 V
#include <sys/types.h>+ f9 I/ ?. V; T/ a
#include <fcntl.h>' H+ z) c' e- K* ~
" _0 }% M1 D' M& j' i* W6 ^+ P& S6 j#define SHAER_RAM_BASE_ADDR (0x80000000)
% u. E, \7 @, |6 N3 r) S
! {- y0 E/ W4 z& ltypedef struct
: p% o9 J! O, G! M{, Y$ M3 R" l, O; p) q6 Z6 |
unsigned int a;
, s6 G5 q' K0 b1 l unsigned int b;, u+ m/ Z( n9 J7 P1 P
unsigned int packet_cout;$ T- t/ l1 x, S+ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- R$ K$ d+ S. d3 t" K; S
" J" I, S! J5 l7 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 a. V6 D& h8 l0 Q2 H) I/ sunsigned int count_copy = 0;, l U, P1 S2 X. Q
' g9 ?2 @* E' i! g5 A1 @% N% ~3 R7 t4 Q
int main()
8 y" X" k" Y" }' w{% w4 O9 L2 U, {* U+ [& R" @, S+ i: i
pRX_MSG_PROTOCOL pshreRAM = NULL;
# d& r- P [4 \* X+ `' b pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) `1 N( P2 c5 f2 r
/ q, j' n/ o5 ^' C2 D7 q% ?: [ while(1)& x. ^# q' S/ l$ f$ n5 R- y7 _
{1 @! s. z ^+ q4 V
read_MSG_buffer(pshreRAM);0 ^" l. n1 f4 `$ t( n9 w& Q
} " T [- t% W4 q: d; a
}
8 G/ _& }$ L- ~! e5 U+ \# Q, D3 p8 r) p& a" U; w$ h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ t- P# X/ Z( O _/ T{7 L) X9 P( o; @, K1 N5 _
RX_MSG_PROTOCOL buf;
4 ~$ m2 |/ s+ j9 g ) F5 N" C+ T& Z
buf.a = pshreRAM->a;; a5 v8 Z* W) a3 |+ B
buf.b = pshreRAM->b;
: P# u+ Y: ?+ A. I buf.packet_cout = pshreRAM->packet_cout;
! ]" d: t v: G5 L# p; n/ @
8 I) g: v: Z* g6 J, Z8 Y% k if(buf.packet_cout != count_copy): D: f1 K% D! q0 e$ `: c% _
{
$ {5 f0 {- O; v printf("a is %d\n", buf.a);
! R+ @% C' [0 {7 g' D$ s* R# C5 x printf("b is %d\n", buf.b); C( ?: N# D1 f" |4 l o
printf("count is %d\n", buf.packet_cout);* X" |( U6 @; c. J$ C5 L" [
count_copy = buf.packet_cout;
: U) l: I/ V3 A# |* O' ` }
) Z z$ Z5 A' \- Y7 C else) g! r4 u; O2 ?4 D, x! c, ?$ m" B8 y
{, h3 I7 S5 Y$ m g( _. } Q+ m
printf("No effective message!");
0 U* k( ~! |( J; Q* _" W }/ k: P" x! B8 ], K" z
}" j4 U; _' b! |; @9 x
1 S: O6 V, z( y1 \/ X6 c/ f# C( G. m6 D* Q$ L/ h1 x( |- h5 w, s2 h3 e' f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 S$ P. {$ W0 n5 n7 l使用下面代码,对内存使用了mmap函数后:7 E5 J; x Y+ e. x' u
#include <stdio.h>1 {+ d. c; `" t3 Q. |8 B! b6 Q
#include <unistd.h>. \9 u9 x. ^/ w
#include <sys/mman.h>9 r$ s u1 Q" t$ f5 h" u& k
#include <sys/types.h>
/ ?) v; r) k0 ?2 b& B. J, L#include <fcntl.h>
5 c$ y, C4 {, \' X2 l- Y0 V: v* _$ _ Q( H! V+ R9 O1 w; H
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ Y: u5 G; X7 Z#define SHAER_RAM_SIZE (0x20000) ! l Z5 [8 f- I' M2 g: y, K; ~, k! N' _" V
2 X1 a3 N1 g, a- Q) j- B' F
typedef struct
4 s, S5 Y w0 x4 S* G( E4 A{- @" \2 z" j& E; R- F
unsigned int a;
. y; d/ \7 j9 U, }! R/ R7 L unsigned int b;: P( N, d' G3 r1 @* G
unsigned int packet_cout;" V- ~. D/ r/ j# d2 z/ w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- A) S1 w3 A: Q$ T: M# Z2 E; {, Y y0 d+ G" _2 I9 ]
void read_MSG_buffer(int *baseaddr);
) h5 x% M. C, Y+ A: x" u& tunsigned int count_copy = 0;
% c) D3 {& Z. u v# k2 l; ~
7 e8 O* K6 M B0 e" X; Cint main()
# m) q/ I4 x+ @! P{
( i8 p0 B7 t) h. r: H1 U int fd;
) M; A! \: S/ Z2 e8 m/ Y int *mem = NULL;
8 u% D# v; A) i# ]. S* ^
) b( m5 W) w- \8 H8 J if((fd = open("/dev/mem", O_RDWR)) <0), @( R* X r2 M! I
{5 |+ |0 o7 k% E& j
perror("open error");+ B4 X( r f+ B O& A$ g
return -1;
/ M: |* e! _4 }/ f# c2 ^: N: g }; @, D5 f1 J( f5 B9 ~
( Y7 V' S! `/ y2 K mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 s* L6 [8 e6 {0 ?+ j8 T8 j% }* V. `, [$ Q
while(1)
$ J9 n$ {( A. \# \' D& N {
+ L. L( k, X3 e( i3 x read_MSG_buffer(mem);+ z/ u5 w) _% A' J
}
. O- o2 k8 _) Y% _4 S- R}6 f% p ^5 `% G! l: J
/ t: U- k- q* o3 r G
void read_MSG_buffer(int *baseaddr)
; G5 |6 v( m+ r/ q$ P{
7 ?2 S5 i. ~! y% y1 E pRX_MSG_PROTOCOL pshreRAM = NULL;! j1 t2 s1 M" d, j+ t' B: y
# h3 o/ v2 M! s- O; S- |6 z0 x; @/ R" v pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& M$ r, g; K- @6 g4 G
2 N: R! d) q6 N" w+ y if(pshreRAM->packet_cout != count_copy)4 f; R1 F2 V3 G) m
{5 v& h; M7 U* s: |
printf("a is %d\n", pshreRAM->a);
' i# X" n1 z- {4 e printf("b is %d\n", pshreRAM->b);
3 k5 f! d/ n1 }! k printf("count is %d\n", pshreRAM->packet_cout);
$ `% ^8 T0 w2 {# T; G/ f count_copy = pshreRAM->packet_cout;
- e* B: Y" ] P) V& T y }* Z1 `+ x) ?) Y
else1 O* v" f9 G5 Y' I# Q
{
L+ ^, O7 g6 l1 k. P printf("No effective message!\n");
! y% J- v* S5 P/ ?* w }
6 r4 [0 m2 @; u! W" g4 z: |/ q5 q, j}
8 t) t3 @' U" W2 ^3 J) P3 @' k* c5 X' ~* t- d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 W: l; U- _$ p' L0 B& a Y
" O0 [2 @0 C6 W1 `/ L& f0 d5 }
! T& [8 A# l; y5 W" _$ L Z$ t
: p) }2 ?8 s5 J2 d0 {3 Y, Y' f* w3 b/ Q- t' t0 d8 ]- }
|
|