|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % n, f6 {# }: F# i7 h9 x5 z
; E' d/ F5 {4 M+ W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 Q7 C) W- x0 I- t0 b+ C: y* F6 D( N#include <unistd.h>, u5 O% Q! B% E3 t+ \
#include <sys/mman.h>
- [ N8 C+ b" }- h% a Y% ~#include <sys/types.h>
/ ~: l0 s) l. N1 o#include <fcntl.h> b9 U* h- ] z# Y8 B5 v
) @, y% J! Q4 e$ {( o#define SHAER_RAM_BASE_ADDR (0x80000000) + w: \2 H9 ~1 f9 S. l* ~
" b- d7 D1 ^9 I1 M
typedef struct2 F! b! r' K* i3 b6 }% n- n
{3 c" |5 @$ U0 f, D. H# l) T7 P- l
unsigned int a;5 _. b3 V2 f% V t
unsigned int b;. ~$ l3 r5 Z2 K% g
unsigned int packet_cout;
% [$ R+ R. v3 B: A9 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 A- Q; K ?6 U& e5 j- z2 C) {
8 m$ V, F3 F9 U% C t1 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. o: K( w: K/ u; j
unsigned int count_copy = 0;
) {& C& k( t; M7 b, o. z- y5 f) B3 \2 W( \ ]9 e+ |$ p
1 X5 h" W1 ^- zint main(); ~/ q9 g7 A0 A5 s
{
/ I' [ Q+ B& h pRX_MSG_PROTOCOL pshreRAM = NULL;+ s# ?1 v4 T5 R9 t3 \6 V% d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, J, x! H" j* n
. G% n7 j2 e4 F
while(1)
( c5 O, r# L$ a. G& v: D4 Z" ^ {, j* F5 E" H6 m$ G3 R8 |
read_MSG_buffer(pshreRAM);& S1 I. N' i5 _4 d
} : d; f# s' A- Z2 R
}+ V. f; T% M: ^9 d o: J* g* l
6 b# J" a4 E$ ~0 l% f. M% F! P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; d0 g9 ~! F8 j' f \- @8 j' B{4 {& m, h5 S+ S8 b; C6 Q) C2 R
RX_MSG_PROTOCOL buf;
" T( n: R6 F* J( t. | ; T' u$ X) B3 N7 i
buf.a = pshreRAM->a;
8 \& K1 l% P I& U: I buf.b = pshreRAM->b;
. S3 O, J, Q0 v/ h5 `( ~ buf.packet_cout = pshreRAM->packet_cout;
8 r: u/ H# d& Y& V( m0 U
% H" K6 E, T( I- t; e N if(buf.packet_cout != count_copy)0 X1 ]2 f" k, I, c7 U6 E
{& Q6 g6 k! T3 P8 H, L1 o
printf("a is %d\n", buf.a);1 Z) [" M' v1 b/ `, c5 U. k
printf("b is %d\n", buf.b);
) z; V. p& b& I7 |: {4 r% M. h printf("count is %d\n", buf.packet_cout);4 ~5 @# Q9 Y; P6 w$ d) n# n
count_copy = buf.packet_cout;: [2 L t; A( n+ f4 Y
}# o/ y/ @7 q9 ^: U! A/ k
else
% i3 Z1 H% V, m& f! X4 ^2 s {
7 T+ c* a7 @4 d! Q. X8 ]7 Y3 X printf("No effective message!");' q, f6 z+ U( l* }, T. E: Y
}& z2 J' [/ N' b% k
}
% R: o& A% d; n9 x1 ?2 c
1 S6 A+ N; w! s- x6 L
% m% C: i3 t( o2 { Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; `9 [& ?* r# b2 T' s& _. J$ N使用下面代码,对内存使用了mmap函数后: b! C) Q, p9 V/ k* q
#include <stdio.h>- O# a R5 y# B, |1 {
#include <unistd.h>9 ]4 d% A9 N$ S; Y+ Y4 T
#include <sys/mman.h>; `8 S* l2 K: x
#include <sys/types.h>' c& x- e" l2 T* x) n- W8 F1 c
#include <fcntl.h>
2 D' ^# b* B9 L Z1 C0 S! |3 i7 i
9 w7 B4 E3 @4 w0 J3 S, s7 g. G#define SHAER_RAM_BASE_ADDR (0x80000000)
7 b: U+ l2 ]8 ^, p4 g+ H7 |#define SHAER_RAM_SIZE (0x20000)
% U |2 X H* |& j6 ^, t
5 f1 F0 v" Q; B/ G. d, Z" C; ctypedef struct9 }3 O; ^+ P H, R
{
) [& W6 r( {1 i/ z5 \ unsigned int a;
I, h T' i- ]& ?. K. n& f0 c2 v2 p unsigned int b;
N. ^7 o+ n* T# B: k0 T3 t unsigned int packet_cout;
P" z! G4 E" G k! u" s; }% H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 [: ?( ?! E: }8 L) N
: d2 o7 F6 \& V' O: @6 k/ evoid read_MSG_buffer(int *baseaddr);% [; e+ E4 Z+ n5 p$ Q
unsigned int count_copy = 0;( I _$ u8 Q7 D9 `; d) m
3 L' `% N5 s4 t, N3 w8 ~0 q
int main()1 S7 g/ j# l7 B. {% v7 H
{! {! [& b) Q% S/ ?5 G# |
int fd;6 Q) R; V$ D" H4 f/ x2 A% k. R
int *mem = NULL;
; ^: a) ]; e, @+ ?; d7 Z) R7 m" L& I f6 n h- ]. V6 Z
if((fd = open("/dev/mem", O_RDWR)) <0)8 M! W+ N8 v. h' {! C# f5 k
{+ q. z W5 n1 s7 x3 B- B
perror("open error");
' D0 o7 k, z# ?) G+ p return -1;
; N. @0 C9 g$ H( s }
; s) v M) s% J% c- W i& \ ?- b% }) r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 {2 J9 @8 O4 h
9 u: i6 |' D; \7 U; b& F5 i" r* g while(1). a8 }6 K' v. h
{
! w. t+ s5 n3 } read_MSG_buffer(mem);
, i3 M" R3 _8 f }
: C" T' P- K2 N8 v% S' Y}
" H: o b" m0 I5 S, X b, Z# A, G$ L- @
void read_MSG_buffer(int *baseaddr)
, G! d& s- N: c+ W- O{5 p: D$ z( g5 K5 r }4 N, b( e
pRX_MSG_PROTOCOL pshreRAM = NULL;
- h+ p5 N6 N( z9 x/ R) l/ ~% q- [
y1 B1 O: e4 _$ E. Y( G pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' i0 @! \ ]0 ~0 s0 j
$ D- u% M1 h# R4 N* C \+ _ if(pshreRAM->packet_cout != count_copy): ` u' J8 ?& t; d3 t/ U- y3 F+ z! L
{8 \3 }/ K7 g8 ?* W
printf("a is %d\n", pshreRAM->a);5 V& k% r7 M7 P' U/ [: D4 q6 E" g4 H- s
printf("b is %d\n", pshreRAM->b);
! T& j: B2 I& a' a printf("count is %d\n", pshreRAM->packet_cout);. J% d4 L% O5 v
count_copy = pshreRAM->packet_cout;
. Z" |/ k7 l$ K& f+ P; f }6 V( L2 b# c* Z* o4 | g5 H! Z, w
else
7 j! G' u' R2 T {; X4 k/ S- l |, _( `' t! q
printf("No effective message!\n");
" E1 P3 Q: x& C2 T( ^+ G }) r+ K6 {0 D+ O7 Z
}
% P9 o1 `9 }9 `8 o
- ^: F6 ], x' M8 w7 @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 N4 D8 [6 r2 n# d
9 Z1 T+ D r8 ~# P
8 O2 m5 ^0 G5 p6 Z- A6 r; F$ C% L' u/ d9 [ w
5 _* h) T4 y0 h0 r( R3 o+ t |
|