|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ S% n" w' v# g. t2 u' @, @6 d
2 r1 B4 J3 p% Z, x2 ?5 K: X5 HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( M9 t" b( z K" d' P
#include <unistd.h>
- w m2 x3 n! a* B* E$ P#include <sys/mman.h>! ?& T4 x2 I, \# }9 F. }. U( ]
#include <sys/types.h>4 Y$ D2 C7 l7 A2 M" _. v7 M' I
#include <fcntl.h>
% Z: w% K. P7 c7 [3 I6 Q0 m
t G" o# M( N+ [) l#define SHAER_RAM_BASE_ADDR (0x80000000)
. I3 w$ l0 s: O% _1 @& J7 Y* x
& P6 A; h" X# E% m$ Y* @typedef struct
0 K. e. R0 ]( Z6 @3 B3 j6 B4 Z6 q{$ Y# L# ], k1 \6 j* Z# I6 r
unsigned int a;, ^" T" r- q* |8 L! m; k
unsigned int b;$ H1 g. X4 X/ v f! F6 r2 x2 D" K
unsigned int packet_cout;
5 }; _7 J6 N6 d. P5 s) K2 v4 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 k% B9 h2 I. A- O4 e( E5 _* Q( h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# C5 `/ A# e6 ]6 \6 {9 o. i% o
unsigned int count_copy = 0;# J7 e) H+ q& i$ H- n9 z
" k3 R. z/ D+ t* y& m- U
. t4 c: {) `0 v* I; Jint main()
3 `; y3 b8 @! C7 O$ E! M{2 q ^1 b- h8 o! }% M) ]
pRX_MSG_PROTOCOL pshreRAM = NULL;- M2 X+ X2 ~! ~4 I: x
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& y; y$ ~; i% s' s& h% j
; ?, N0 g" S: p2 v7 b, A) I6 n+ \% N
while(1)
- z; q ~6 m' ~$ g$ p9 A2 q {4 `% x4 o0 _% C* K4 z
read_MSG_buffer(pshreRAM);
8 o9 V* w M+ b* r; W# t } + C. u! ~6 M9 {- w( ?+ K# H! d3 D
}
1 {2 _* L; k. q% }0 s7 D2 `5 m1 F9 j9 D. e: M, O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 @2 ?1 w& b$ J
{2 R; e/ |- b# s3 a3 b8 }- c, p
RX_MSG_PROTOCOL buf;
- k8 q$ t2 E. N( X( G
4 [7 x# h+ k2 S2 X/ _ buf.a = pshreRAM->a;: F6 a0 P1 }5 l: e* h- o1 E
buf.b = pshreRAM->b;# E- \3 f" w* m4 u8 t ^
buf.packet_cout = pshreRAM->packet_cout;& Z1 R+ ]* ^; T- x1 I. x Q4 t
% w2 ]' g( {, S! f0 F if(buf.packet_cout != count_copy)
- t: d) z/ b: M0 p8 G {
' ?0 _+ Q$ l \# w2 U printf("a is %d\n", buf.a);) L9 ~+ }, }, y: m; V% `4 V1 f
printf("b is %d\n", buf.b);
! J! g5 }1 E2 P- `9 b4 B printf("count is %d\n", buf.packet_cout);5 a8 W; z8 m+ O* A" u
count_copy = buf.packet_cout;) y$ e' D P% S6 s4 n# d3 o
}% T$ U2 x1 G6 |7 ?& G1 U: {' F
else" X! K# |, C+ o" a
{
2 I* w9 Y0 {3 A- A printf("No effective message!");! l! e! M! r% v/ U' ]; ^8 R
}2 ~; s: E/ ]3 Z5 {
}
) [& H( V( s$ ?7 H( r- g2 O7 U( F2 P# q9 n4 c- Y- ?
0 u2 K% u/ h9 _3 T; h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 N( }6 R: G$ \% t
使用下面代码,对内存使用了mmap函数后:% _: a1 C5 @2 D
#include <stdio.h>
' V* F% R1 A" d. E4 u3 J% X# ~! I#include <unistd.h>! h5 z9 Y1 k" ` V7 K" J% K
#include <sys/mman.h>/ j' X) X% G: ^
#include <sys/types.h>9 w4 y& H0 ~$ L- l6 r) E$ A# C
#include <fcntl.h>
( q* q) b( z1 G( U( A0 ?& H2 s) p. B- Y
#define SHAER_RAM_BASE_ADDR (0x80000000)% n' Z0 _/ F- q$ h! k" g
#define SHAER_RAM_SIZE (0x20000)
# M1 k% v4 W7 L9 W
1 U% f# s0 t0 Q9 dtypedef struct9 q7 u. V' M$ z! ?
{
+ V, i9 k& t9 E unsigned int a;
" T \6 c0 w; ] unsigned int b;, B2 d6 n- e5 N5 [9 ^9 H1 P8 V
unsigned int packet_cout;
* m/ S$ j; B) j! y% `3 {* x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. W+ M: V+ W6 D+ D4 ^* V) a4 {, ^. L! k, c
) F. P9 a# R, @
void read_MSG_buffer(int *baseaddr);
- G5 W- `$ B( G% i Ounsigned int count_copy = 0;
2 f+ U/ ?4 Z4 ~, X5 L4 F$ ~6 x- M6 f8 B( H
int main()
' L: X. q* |% D! K{& O: n" n5 O/ M: J$ l
int fd;( m% ~2 o K# Z- e9 N( W2 l
int *mem = NULL;
6 {# x! ]' L% w
/ L3 D2 I% T- \) o! C+ {6 {/ S if((fd = open("/dev/mem", O_RDWR)) <0)( I; W! n5 t% R) [# m
{
5 @3 ^- m5 h: J6 D M perror("open error");
% I3 H+ P$ l# b& _, `+ S return -1;
% |8 w1 Z" i/ U. o0 K, v- Y }5 C+ `/ v% G _; j8 r
6 J( p# \+ c- C, O4 [ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 y! b9 A$ \" [, t- w. h
4 K5 }' @/ U) j" }6 L5 w
while(1)7 C; z+ [ Z, S8 K9 D
{
a/ b% O v3 E1 o) }. U3 R2 B read_MSG_buffer(mem);
t* p e; I0 I O5 U5 [3 `2 r } + |3 W& l6 l6 C$ X6 { L {
}
- D( {$ C2 j+ u7 J/ K3 [) C) e% O0 f- r
void read_MSG_buffer(int *baseaddr)
F6 n0 k; P& a; b* f{
* V8 O( k! z8 t9 F3 K: f! ?3 q# @ pRX_MSG_PROTOCOL pshreRAM = NULL;
. p; Z/ M& K% R3 T3 N/ j: a% e
8 V7 b- y+ w$ X! A7 D" ~) q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 ?" r/ z) m: z4 k6 {. u( q; ^; C
9 R' D( T5 H# Z/ ]
if(pshreRAM->packet_cout != count_copy)
0 ]" C# C$ S' B* e6 R. F6 B {1 \$ Q: T. q% j$ g
printf("a is %d\n", pshreRAM->a);
6 V) N/ P" C G, e( d$ s printf("b is %d\n", pshreRAM->b);0 T5 ~ u# J; P+ L$ |
printf("count is %d\n", pshreRAM->packet_cout);
. E; a& H. _; u( _% k% S4 Y- a count_copy = pshreRAM->packet_cout;
. Z6 _0 x9 L$ k4 C$ @ J1 F }! o. m0 X0 H \* Z( S' `
else% f( X9 S! O2 l) g( }
{7 C, n; N! G' \: R8 O4 M
printf("No effective message!\n");, S' S( L) Z! M
}% u- a/ t0 L: T9 k/ E7 y
}
/ h' [8 M2 C- p* [
4 Q: q5 Y; A! o: c: b( z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ m3 r7 j# ?5 [" R6 T: U; i- t5 V! u M
- t. Q* e: }5 v2 i1 d( @
$ ]9 Z; w! q6 k) `) Z
: |6 p6 L7 g$ h% q- @ |
|