|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 f/ F- F8 B V( s9 t
! [1 u' y8 l+ L3 ]7 Z6 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 ?( J: i" K- Z* M0 Z#include <unistd.h>
. z) Q% G; h$ d/ w! t! n+ |#include <sys/mman.h>; w2 i8 G/ {2 t7 h( m8 X i) o' Z
#include <sys/types.h>
; l0 u1 c( _; G M/ w#include <fcntl.h>
+ A @# Q1 N" M/ _
! T7 [& Y! L8 r#define SHAER_RAM_BASE_ADDR (0x80000000) ) f$ e$ v2 f, [0 e- X k! j1 q6 K
7 \5 J+ j- {3 s0 A% o$ a
typedef struct5 j7 Q: a* c( s, _
{9 n5 @' q& @' z! _+ N; i
unsigned int a;/ }3 f, T. t/ ]
unsigned int b;
1 [+ ^8 f0 G/ X( d3 i% r$ W$ X unsigned int packet_cout;- \5 ?6 a& i. m" V# L& }, b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 _- v6 f* L- ]/ U
P+ N6 n6 {" K t# Y; V# Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, A' B8 e, c4 P; F: X) f o5 |7 p9 Q- kunsigned int count_copy = 0;& E, x$ S. D8 c
5 C7 d* r! u; J& ^- ^/ z' e% }( t4 F8 I4 D
int main()5 N3 R/ T. \% ?) s0 B. |: g+ ^' @
{
$ e) z3 n5 T: H pRX_MSG_PROTOCOL pshreRAM = NULL;
% b9 M3 ]! Y* O# O# T; Z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( c0 K7 e$ T- p0 O5 U
( k3 ^: j5 F+ U+ i0 t. B4 E0 _& ? while(1)
1 |7 X0 a) _8 |1 b0 W {+ `5 Y; L+ ~) s2 \
read_MSG_buffer(pshreRAM);
7 ~/ n2 ^8 j7 Y* _% u( t7 x }
! |" R" n$ [' @2 p# X& V9 L. h1 j}
/ S4 z& N. P( r% p' i# T J1 J# `3 A6 V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- x9 M) j* o5 m# N{
% M: I; }' X" [( z+ s: z! ]" |/ B RX_MSG_PROTOCOL buf;/ j9 b" S1 H/ B) x7 I- E- _0 Y
( C5 F8 S. j! {
buf.a = pshreRAM->a;4 l1 B' K( c s, H" O
buf.b = pshreRAM->b;# C3 T, m& p, U
buf.packet_cout = pshreRAM->packet_cout;
8 s0 w! K+ t8 c! T" x5 T0 S % P! I5 Y" i6 g; |0 v% u
if(buf.packet_cout != count_copy)7 q; i7 y2 T ~0 }( i
{% Q/ A1 R6 C5 M a- m9 J2 g
printf("a is %d\n", buf.a);
/ p1 F( Y0 n* `6 @7 s1 L2 u0 \ printf("b is %d\n", buf.b);: {* n1 {. e1 o+ L6 s
printf("count is %d\n", buf.packet_cout);0 `6 c7 b; u, |1 o: I. U
count_copy = buf.packet_cout;
9 r/ e* _! \7 f. ?1 K }
W( ]7 s0 V c; H4 D else
* H6 v$ v- \% @- S. v {+ _% W6 [# |5 R7 w; C6 @% \. J
printf("No effective message!");
$ l% Y5 C, Z6 S8 Z: J0 g! B- Q4 p* i }
: \7 Z: n5 _/ L5 n! G}
) K3 a+ j( `8 A; e; a+ J0 M
; F7 |' f: R @& m$ F/ B' p" N2 W# h+ F: l& e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, T$ ?# L8 B9 m6 @- O$ l使用下面代码,对内存使用了mmap函数后:/ E! N) s$ m- _* P) y
#include <stdio.h>6 ]; a" m# F8 m& I. R/ }, K9 P- A
#include <unistd.h>
/ e9 w9 H3 T' D! ~$ s; a& b#include <sys/mman.h>, K* d, b' v9 I! C6 u, `9 y9 `) R
#include <sys/types.h>4 t: A' @" ^# l) T4 ~" C Z
#include <fcntl.h>, v2 p- [( R: y: @
4 `/ X8 Z Z# r. U#define SHAER_RAM_BASE_ADDR (0x80000000)7 M, i5 q/ [! E& g
#define SHAER_RAM_SIZE (0x20000) ( `/ g. y* Q5 x% |4 \* n
2 B6 l- x- [3 O* M- B# m' p- Jtypedef struct# \4 r5 K- m9 _: Z4 @ D
{$ y3 h3 X3 ]! U& u! w( s
unsigned int a;0 C T* P% m" _* f, o
unsigned int b;7 r" S/ |5 p% b% x! B/ @" D
unsigned int packet_cout;$ }* Z9 v8 w: M8 W C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* A# M* d6 }; [+ o6 G: R9 N l; Q6 z
$ o: K9 _- s7 k! _; l. U8 fvoid read_MSG_buffer(int *baseaddr);
Z4 b! z( ]6 b& n# Z4 iunsigned int count_copy = 0;
/ R3 w- n/ Y- B; u6 [: V
* v6 r$ J/ Q; l$ R y# Iint main()
6 i$ }/ T$ W$ ?{; j$ F. M$ A- A
int fd;6 z' E' H% s3 G, v
int *mem = NULL;
* Z) g$ k* V* v) _6 [
% p/ B& ]" v* i6 X: y' a if((fd = open("/dev/mem", O_RDWR)) <0)
) l: j1 U& V+ n `% A {
) e' U: } K- w1 {, \ perror("open error");
; c5 y2 J! p5 n+ R return -1;) t! I2 }9 I0 g- E
}' }& f' }0 U5 N( P ^
* N. O4 m/ M1 G/ b( B mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" @8 I, O! G& F3 o4 |( B* b9 P6 _ y4 N2 r6 E- j3 f
while(1); A+ U$ `5 S. l/ n
{, z2 m& N6 [% K& S9 M
read_MSG_buffer(mem);% x) K i, z/ G3 x
}
* t0 V: H; N. f# I% |4 s3 V! N}
* s& [" }1 k g3 j! W( v( n0 ?8 {- ^/ q) Z( Y3 S
void read_MSG_buffer(int *baseaddr)
% Y: i/ p, @9 Z3 r8 R- `{
2 i) T0 w$ P {" `! H9 U pRX_MSG_PROTOCOL pshreRAM = NULL;3 Z0 C/ L) l4 k/ W" j: _/ Q
8 c4 O& Q0 T4 y% n4 s6 |$ O7 C pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ Z( D; p( e* d D# h' H
# N7 ?* O. d4 K3 r) Q; j
if(pshreRAM->packet_cout != count_copy)
; x. {3 Y" u' M* s) Y2 b/ a0 Z5 K- ` {( {& L a9 L7 _ p' n
printf("a is %d\n", pshreRAM->a);5 r/ K$ R5 p- N( z( L" B
printf("b is %d\n", pshreRAM->b);
+ ~' Z( e0 ?8 H! W" w# M7 T printf("count is %d\n", pshreRAM->packet_cout);
7 R6 Y/ j4 [. d. O4 Y/ m7 T count_copy = pshreRAM->packet_cout;" q' a/ Z+ A8 S
}
6 @, n! E' ? \ Q" { else
& R. e0 l! ?, ?; W: Q {
( ^8 u) z. W/ J7 ]0 u printf("No effective message!\n");
) @9 ?; ~2 r5 f! ~8 O. {% M }( a& b; z, n% \/ S. K
}
& W1 ~6 A4 S. \& Z- [. N" b: g3 f* x; ^. U: T; j9 Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 a: z( G* c4 l! ~8 v
. L7 }7 }; J: ]1 u7 P& j0 H
$ `$ a: ^: S* P( @
/ v" J4 L+ I5 p7 d# D+ I, K
! w! }; R1 Q0 {! Q, b |
|