|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 w- ]& N2 R y3 E, l$ f" r# V! I+ J2 {. r/ m+ e+ M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 n+ b1 D- d5 e& H! b. u3 n
#include <unistd.h># ?2 g6 Y1 z6 U! s8 O
#include <sys/mman.h>7 w. M* M, V+ z I3 @
#include <sys/types.h>+ O# H- b; E3 ~$ n
#include <fcntl.h>
: \: E* S& r0 ^. g9 ~1 Z9 l8 G' C' r' h! L8 Z+ b
#define SHAER_RAM_BASE_ADDR (0x80000000)
% @! E' d6 K6 t T0 z
: \: t m& F* Btypedef struct
0 H9 b/ `/ A4 h5 d{9 m, `9 q; W8 Y# j! y. t& \
unsigned int a;
: m; v) C; b" a/ f: o, b+ X5 N unsigned int b;$ ^6 O Q% U3 I$ H1 c6 Z- S
unsigned int packet_cout;
3 ?, J' `. ^4 Y; ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# Z' O: I0 x0 G% \5 C$ a# e
) G# i& @* b: F) M; o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% Y3 ]" v" ]: B4 X; `unsigned int count_copy = 0;) f9 }3 q8 ~! {3 `3 {7 [
/ m, H) {- Y0 u/ d* }, i
+ X, I) V) Q4 ~' z! P/ C
int main()) c+ y- \% v9 [" K, l3 T" B
{$ w" @/ o# v6 S. Y
pRX_MSG_PROTOCOL pshreRAM = NULL;7 b, U0 @1 T+ k' E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% [7 h+ m3 i- ~% K% z/ `8 l5 `5 @4 Q2 O$ f% j, K
while(1)
1 Y" r& b9 ~. u4 {: j e2 v {
/ T' t) H A9 C- z" u0 Z' t read_MSG_buffer(pshreRAM);3 R5 i$ D+ T# N! ~+ _* N
}
& ~+ T! S4 w6 z' R8 J) v}+ a7 c O* R: b- \9 ^) v
% J1 ?' o2 t N% W6 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% K6 L1 J" ^. ?& f{: t- k3 M& a A0 a P" U: K
RX_MSG_PROTOCOL buf;+ l& F2 j. J) f, k5 ~/ f. u
" O/ o" H9 h b" F- W. }7 D P, }: ~
buf.a = pshreRAM->a;1 T( a; N! G; U s8 p
buf.b = pshreRAM->b;& A; a; \+ h5 @" Z/ |/ o
buf.packet_cout = pshreRAM->packet_cout;
5 n* b7 J* U5 ^! v % l1 u _4 L# S0 c, H
if(buf.packet_cout != count_copy)$ ^7 K; {( e% t
{
& P1 b. T: ?6 W9 Z printf("a is %d\n", buf.a);
2 r# R$ _. O1 A printf("b is %d\n", buf.b);( M; Y- p* a! E* Z8 h3 q' Z# d
printf("count is %d\n", buf.packet_cout);
8 N' s5 q6 E8 \ w3 S$ l- b$ k9 q$ ` count_copy = buf.packet_cout;, Q( Z1 U7 _8 z$ |! y! K! m5 r( K
}3 l' p) w( U3 H$ @. \
else, d+ H; N2 x1 j( Y7 C* u0 n5 g
{* W& q0 r8 D9 ]8 d$ M" |
printf("No effective message!");
# Q9 h4 q1 v1 D' _ } C/ b! O9 I& C: j, ^. B4 B
}
\5 S) O X: ^7 M0 t3 F; p0 _4 D9 y( Z) O6 K# }+ X/ X& k
- d! [7 I$ Y, u% F5 P5 c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' q: y3 m& C ^1 x* @使用下面代码,对内存使用了mmap函数后:
9 }% l: C9 M" Z# r# p* ~1 G0 h; A. I- m#include <stdio.h>
2 D% i+ b+ ~( q6 T/ w4 N2 I#include <unistd.h>5 E! O: D( q) k7 ^% f# m& x# y! t
#include <sys/mman.h># N" ]4 q& l% K5 A4 ]6 S. h" J+ i
#include <sys/types.h>* c7 C/ G0 Q p+ j/ L1 ?; G
#include <fcntl.h>
% y5 L! {$ v- d. A+ U" O# r% I2 E, s$ K- W2 v4 \6 f
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 W1 |0 p6 l( D& h; y4 Y#define SHAER_RAM_SIZE (0x20000)
! P* S9 y x: E2 b9 c( u4 u: F( I0 w4 H
typedef struct; x& C$ U0 j3 r7 k! ^
{- ~/ i8 e+ t9 E
unsigned int a;& S/ t) [3 P( `0 G+ i! L* v/ d& w" k
unsigned int b;; f0 f. N" }( _0 V
unsigned int packet_cout;
, N. f/ P8 G, a% D D1 A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 x! I" A7 g+ N* X$ Q. W
+ T' b) `% z4 W
void read_MSG_buffer(int *baseaddr);
2 i# @3 w# `" b7 E+ _unsigned int count_copy = 0;
. V- Z$ k5 C( l# U" }, |4 @! q- G7 ?0 Z& N0 }& z
int main()" i) l* `6 u L, {* N G
{
2 M+ q3 b7 N" @ int fd;8 C. q2 z" g. i+ y. k$ R' G
int *mem = NULL;7 h9 ?" ^. ?7 }& E4 Z7 Q
9 u. F7 Q2 K3 G% Y if((fd = open("/dev/mem", O_RDWR)) <0)+ @' O$ o# ]4 T6 M; b" d
{% Y( M6 ], @3 Z$ t
perror("open error");
( T' F/ l3 E. l% c return -1;
3 f5 m9 R. s- p: u0 g1 z: n }6 A( \9 C5 R/ p w. x# J
) ^9 h' M% m ~$ O6 `" Q9 E. r& S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ S. o4 f, Y' e' V1 i, k/ C% U2 t" c
0 {4 O- G% u. K: l while(1)8 T5 N5 d3 W2 z7 b
{
S5 }" i' W7 j; X- M; i' U' t read_MSG_buffer(mem);9 G* L0 x! F* r- w. K* j
} ; ~7 S" S% }. D2 V# E0 D. E. |
}. P9 U$ i7 e' O: V4 p( V
4 B8 K. M6 o7 v, H
void read_MSG_buffer(int *baseaddr)6 V! D0 p- ~7 {% ~# v
{
8 H7 v7 T/ e9 z; {% D pRX_MSG_PROTOCOL pshreRAM = NULL;
0 c) P- X: p ^
& S3 M3 e2 o: Y$ ~+ H pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 Z; u X; X0 J5 u& A$ Q
& X; C' C1 h1 ~" E. D b% b" P if(pshreRAM->packet_cout != count_copy)5 Y; k5 Q; h: t& s9 H7 J. f# e
{
# z# D" `% I5 G `3 i3 x9 S( d* G. p printf("a is %d\n", pshreRAM->a);
9 A$ _& Y( I. V/ C4 W7 ^ printf("b is %d\n", pshreRAM->b);
& a. Y$ i3 z4 d" Q- ~ printf("count is %d\n", pshreRAM->packet_cout);
3 v+ o9 _( \$ H' S7 q, d' d count_copy = pshreRAM->packet_cout;9 C* T7 t# C/ d$ Y# S: L
}
; X# H9 X& D& K% B else0 o( i7 U% B5 K6 Z, F# O
{
' r9 ^+ U* j- H0 l2 d% u printf("No effective message!\n");* R2 u9 @1 I& ^4 I8 n( F" |
}$ M- s$ ^3 b# U t) G( _
}
2 D# L$ Z% x/ [0 p2 t& s# @; g( }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 B2 h# h' g+ \8 l) [( d! |; e2 P. `
: N: z' @# `" `
1 @$ ]9 }5 x7 k% }6 ]4 K, D+ I1 g
8 M3 j9 k& N1 c |
|