|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 r' c6 J$ T5 ]7 n8 }$ S6 x
_4 N4 l- v- KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 b3 F9 P9 F, f9 \- U+ x#include <unistd.h>3 Q' Y$ V9 u: }& W% h0 k5 e
#include <sys/mman.h>
* r4 o9 K) ?0 |& D2 G/ I#include <sys/types.h>- \. ?: ? O1 h; l6 _ Q
#include <fcntl.h>$ J* |0 v8 ~- s. G6 q
6 k+ p. v; y8 W/ \* y+ f% j
#define SHAER_RAM_BASE_ADDR (0x80000000) / |, g* W) \6 i: I
b" U4 q& o7 n% ?typedef struct& b# v4 u, x. N y2 G+ X
{
( ^4 G- {9 A' x+ g& a1 r2 z unsigned int a;
5 b3 k/ f& U$ H, L+ Y unsigned int b;# K! k, T2 z( @4 u/ ?/ i& ~
unsigned int packet_cout;, l" [ I' V8 A7 M- d7 i- N) u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) _* r. y$ k$ U. e
$ @# _6 M4 y s$ T5 e2 v$ x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" C& x/ G2 n7 \. Wunsigned int count_copy = 0;) S& Z9 _7 B- P
% U0 P' {2 ~; N' M2 o$ b% i) d
6 a( C9 _$ C; E- Dint main()
! P( q6 W7 R; K: E. q @# q+ V{1 r7 u# }( r: ?% v* @* G( h
pRX_MSG_PROTOCOL pshreRAM = NULL;6 A8 d1 D, E5 ?9 M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 n. d% N+ r7 A. X
/ o& ?9 _6 |: k8 | while(1)
L9 }3 Q- o4 Y. J/ I! d {
/ R& q0 P& ^) o, w2 h* b# B7 x6 N read_MSG_buffer(pshreRAM);
* S5 e3 {% R; P* e/ ~ }
/ |! ~5 Q( ?0 M/ M- V}
! n8 t, a& `5 F. z+ T
8 J% H, @; T1 I+ gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* J& d. t, H( l2 H2 e* h
{
- h. x+ u- ]7 n RX_MSG_PROTOCOL buf;
; C7 S, |0 H; t! S
j% ?: i% A. w: d! u buf.a = pshreRAM->a;
! ?( z' I3 K9 a/ ? buf.b = pshreRAM->b;& o: G/ w( K m/ I0 q) }
buf.packet_cout = pshreRAM->packet_cout;0 s, ?$ m0 e6 T1 e; ^1 i8 I7 f
& C9 l5 \; F5 O7 n
if(buf.packet_cout != count_copy)
4 Q" l0 L9 z( F {- O8 c K! ]" s& s
printf("a is %d\n", buf.a);
' y/ L5 V8 E( }# H printf("b is %d\n", buf.b);
# A( n; F% C+ i5 \8 m printf("count is %d\n", buf.packet_cout);
0 E& ^6 x5 u& C3 c# `" l count_copy = buf.packet_cout;
" B( _* C- r( U' [" C+ ~2 v8 x }
7 `8 z/ l9 z& W else: k# f0 r: @: ?3 {1 W+ D
{( H$ i& z V' ] m$ h4 m3 L6 v2 j
printf("No effective message!");
( T/ K8 B" D. L; _/ M }
5 ^3 B# Z; u8 D) e. Y2 V: N0 @! ^}9 @% A; q5 ]+ U @ G2 D( [4 H7 I
# T. ` F) P9 w' i8 i6 c# ^; _' L
% R" q, v# T& ^! l! @4 s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: Y, ^% N, R& O7 A: g# K& u使用下面代码,对内存使用了mmap函数后:
7 C) _* L0 ~& a' @+ E#include <stdio.h>
( `0 F' Q1 h( {1 E& m8 x5 g#include <unistd.h>( _$ `# R" `6 `/ C5 P% \
#include <sys/mman.h>
+ ^+ Q8 L3 ?/ O0 D; ~#include <sys/types.h>* C5 i N* i9 X3 {1 u- w
#include <fcntl.h>) | S( q5 `+ L1 D$ ^- W& b
9 B- p1 L& x+ _4 ?#define SHAER_RAM_BASE_ADDR (0x80000000)
9 F9 f1 f6 K# I; C; W9 d6 F#define SHAER_RAM_SIZE (0x20000)
; a/ o/ ?2 g1 ~: o
1 n, f) N5 p3 |6 ~typedef struct5 X# T5 i ?% M/ a' o: a
{* {3 B# y) f& Y' g* D% t
unsigned int a;
: L( q$ w5 S ~* L1 r unsigned int b;+ @- Q2 b5 f- E) V" F `5 x6 P
unsigned int packet_cout;
4 y% f# [1 ?2 X* N" v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" A% ?5 X) j- F3 z
, y4 F; l" i* H$ c5 F* c
void read_MSG_buffer(int *baseaddr);: d/ ?4 d& Y2 k& S' ^% Z) A
unsigned int count_copy = 0;
( m) J4 G3 c) E; Q o& h. V6 S! }6 q) l) X' |+ a
int main()
3 C5 a3 |4 c) n$ t v. H{
o2 |, z" E3 Q5 G1 o int fd;; X- p2 d& a8 {0 r" G! V% A' k0 V
int *mem = NULL;1 u9 y8 h9 \9 Q6 L8 r9 |
6 j, `# d; k# m6 [
if((fd = open("/dev/mem", O_RDWR)) <0)+ f! t% s4 l9 X
{
' p4 K4 a8 I9 e perror("open error");
; _- \2 S8 M2 d* S$ [ @3 b! a return -1;9 y3 e* J9 n& g
}
0 w+ n! M- ?& r( m" z
. @# \6 ~. X' M& t! ? mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 `+ z. J2 ?# x
3 r- J; z9 A& @! G0 k while(1)
9 ~, ?3 Y0 W6 s6 N2 S {
: u5 f2 h. Y( d3 a5 K* f/ H read_MSG_buffer(mem);
: N5 n* s# \8 ]( w9 T }
8 q; j. y6 O; R9 V- {+ ]}
& U7 o) a1 p& G4 J s
0 F8 a! G9 S6 Ivoid read_MSG_buffer(int *baseaddr)
: Q/ `: ]3 d9 \" u{
" g; p, \/ y+ o1 ]1 t3 x# X. A8 p3 d pRX_MSG_PROTOCOL pshreRAM = NULL;" k0 F+ S& S d
: |6 [9 d+ N2 o( [2 J
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 {* J0 i [2 X" b) E/ l
) B% F) O( @; N* U
if(pshreRAM->packet_cout != count_copy)
) j/ b5 [3 x; E {
. t8 V; U. j' S, q& q/ w printf("a is %d\n", pshreRAM->a);
. W! C5 h D8 X! ]/ i1 s4 [ printf("b is %d\n", pshreRAM->b); ]6 n' ~! W0 x) j1 H
printf("count is %d\n", pshreRAM->packet_cout);4 t1 ^: m% a+ u1 H
count_copy = pshreRAM->packet_cout;3 g& F C0 H1 [- h
}
! o# K$ m0 _1 [# L$ A/ ` else* [# v- O' v; K2 ?
{
/ W* [0 p$ ?/ A: L4 ~$ T1 _3 a printf("No effective message!\n");
. [ V9 M% A- z* H9 c2 S- y }- P, j' u. o! o( }* v& u
}
1 C! ~5 p* L4 v4 f9 e+ {8 w3 V
" o* i0 Q' Z* T1 G6 W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& o! Y3 t8 e" c3 P3 p
2 L. x* L. g( ?" W: N4 _# S( a
* x' r+ x# `. I4 e, k) s! n
6 S5 k5 @+ W% X |
|