|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 W4 q( O) j$ R
1 k: O' y3 s9 D9 E3 H2 c7 d! XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; i# j4 j4 p& e9 W9 |& y, d#include <unistd.h>
* Y+ O" k1 j5 [. D) J#include <sys/mman.h>
6 n" l8 L- ?8 P' C4 @- Y' y#include <sys/types.h>
. ?8 |2 O$ [8 h#include <fcntl.h>0 k& U. ~( T, P& s+ c2 E% X
) r. j) ~& o9 Q7 T! C4 \! @#define SHAER_RAM_BASE_ADDR (0x80000000)
+ q' |4 t7 P/ v% ?4 c1 E
" g. e9 i2 H8 x( [4 f+ q, Dtypedef struct& t& S6 e1 e# c# N: Q4 C
{
7 c. w' X2 h) l* f3 @- g% t unsigned int a;1 I( I+ c9 t( u
unsigned int b;4 N! @- [0 z- e( l5 [0 h
unsigned int packet_cout;
# |, K K4 ]) j6 a, o# S; q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 [0 h4 x, s- `
" _+ P% l) W- [6 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% N- h7 n9 B6 y2 w. J, r- ?unsigned int count_copy = 0;
) h b6 l' T& G% K: A& S1 d0 t+ f" Q* _8 }
; F. O* A7 o/ q7 b p' {int main()
5 t7 K+ T$ {& ?0 U{
/ `6 {' ?3 H: c D- ] pRX_MSG_PROTOCOL pshreRAM = NULL;' w1 F: v5 h, B% A, i- w# [ n: S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ e' o+ T" p8 s% A) _8 n1 i
% a- b w% A* o while(1)
1 K2 S6 G7 ]0 S3 e1 M% q& i9 H2 h7 Q {4 ^5 q! K+ G" X6 @
read_MSG_buffer(pshreRAM);
9 N# C. [, Y& B9 y( p }
8 L1 c7 }/ p' S" m/ `2 U5 K}. Q5 V, C6 G1 D9 n# O0 t" z
+ W: H3 u# d' R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) _8 b3 ?( Y7 }0 X m8 U3 P{8 D4 G! _! p4 L g; Y1 Y; m+ Y
RX_MSG_PROTOCOL buf;1 W0 i4 u: ~5 D
0 V5 D+ r6 k! n% \ buf.a = pshreRAM->a;1 Q9 d' ]4 K g1 p7 X7 p2 U
buf.b = pshreRAM->b;
: F0 G5 w- O* `; _( F buf.packet_cout = pshreRAM->packet_cout;
8 {2 r) _2 ~. v8 \1 L9 T) D" B, A9 q Q( o
, g2 m% [6 _: P1 u) z7 p if(buf.packet_cout != count_copy)4 y( Y( H( y7 Q' g6 o, d
{
& x( T; J7 `$ ^0 b$ U printf("a is %d\n", buf.a);
; i% R& i; C9 V$ k8 z1 C# s$ T printf("b is %d\n", buf.b);
3 w; P2 G( V( f% L3 ]+ U printf("count is %d\n", buf.packet_cout);2 v/ W. {; M2 t! s& P/ A5 K, b7 Y
count_copy = buf.packet_cout;
; ]( `5 {2 m! `, W( X# L/ c! B% [& l2 B }
) @0 N, @& [& @0 J4 \ else
7 R5 c' h4 A) R H/ X {( O& Z4 j3 F1 R4 F' P! S6 L1 u6 y, S3 w) l
printf("No effective message!");
0 _! z; A8 V2 w& B- J9 u }5 [4 u8 o: P8 e) P1 P9 l1 I
}
. b2 I5 ]& [% @# u" o& \/ s- q
v% @8 O2 D, o7 ^" }2 ]" t$ A2 r9 ^. U2 m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' J; `; Q3 b0 x. i. L
使用下面代码,对内存使用了mmap函数后:
+ n' ^2 E" k1 w8 v+ H0 [' R#include <stdio.h>/ A2 C" j) r, Q
#include <unistd.h>
/ C& d2 Q; ?) r& V" t9 x#include <sys/mman.h>5 H5 h9 s) l) q( ^* H: d
#include <sys/types.h>' W0 I" P& D1 V& C: t
#include <fcntl.h>9 a: T! e. ~ K5 f. A$ _
1 [3 a" }) H( E5 q* c7 l/ S8 @
#define SHAER_RAM_BASE_ADDR (0x80000000)3 V, L4 T: \5 ]
#define SHAER_RAM_SIZE (0x20000) , |8 S+ G+ t8 \/ E6 F/ k1 ~
" x& l5 }' @, d- R9 o" c7 |$ Btypedef struct; |9 ` V B2 `4 R& `0 j1 } s
{, F% h6 V s5 \4 ^* r; ~6 o
unsigned int a;2 Q0 \' S/ u# {8 ?; H! L
unsigned int b;" i. _/ m" s. \$ R' D
unsigned int packet_cout;( X. e9 h4 `% m# S8 ~6 P A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' {) b f5 ?( k# p
* T: v+ `. y. P
void read_MSG_buffer(int *baseaddr);
/ ]# a7 `% ~& o- z0 \, gunsigned int count_copy = 0;
; c* I% U3 U6 u# d$ C4 J! Z
+ H v/ E* G6 F; s+ p! |- Fint main()9 ], Z8 A6 Y4 L3 C$ @6 l
{" v& l7 e7 P) c5 x0 Q! a/ R
int fd;/ s/ a+ n' N. ?( w& U6 @! B
int *mem = NULL;* D$ f+ K+ B7 X7 d# X
' z: U, o! y# Z7 F8 |/ n if((fd = open("/dev/mem", O_RDWR)) <0)" `) | S5 \1 ?2 c: w
{
3 q# b/ t0 S; N* G `5 P0 I5 N. h8 G perror("open error");0 k+ I6 d4 C, _% t& d/ l$ q' ]* s
return -1; l% L) z" i4 V5 P; q
}; h: D+ P* a4 t6 a+ w
3 `1 I; E! X1 c. t mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 d2 c s3 P6 t/ Y: n; ]& [3 S' Z( K
while(1)
+ R7 E9 K& p( u; d# f" w {
& Y4 Z+ F$ Y& a read_MSG_buffer(mem);: j, ^1 e9 W: J/ |: [& x
} % y9 |' i4 C6 k) T7 s
}6 K3 G8 v' M! n( ^% V/ v
5 i- e) {' A! O, @: Yvoid read_MSG_buffer(int *baseaddr)
2 {; i4 i* c8 H& u q9 Q8 s$ O{, o! m+ O3 Y8 n" }% a/ @9 O2 L5 D
pRX_MSG_PROTOCOL pshreRAM = NULL;2 p2 C/ y" K: a' N S8 S
9 {( } d0 X; J O; ? c
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 z7 G4 V' n Q" R# z! V3 e
0 h9 d" A& b0 P( f3 W" h2 p# f
if(pshreRAM->packet_cout != count_copy)8 h: n: z2 [' j6 S [% @9 j* ~6 t
{
+ t2 X5 R; E( z2 A printf("a is %d\n", pshreRAM->a);% M$ }8 A5 F# _% x
printf("b is %d\n", pshreRAM->b);9 T1 V& f" `# W
printf("count is %d\n", pshreRAM->packet_cout);/ f; h/ G: d1 P. N0 h( n' H9 ?) P
count_copy = pshreRAM->packet_cout;
4 j$ t# m8 s! W3 ^ }
* p7 r9 g4 k" B7 `4 @: ~ x else
$ w6 V C% q9 N$ H6 u# b8 D {1 r! @/ r' b, F1 U; m1 t8 C% l- ]3 g
printf("No effective message!\n");% V/ v0 d0 v) N2 `7 h
}
. S# j9 K* Z( x$ m$ h. M}
( _) ?5 ^: b5 f" I: ?" ^# p' y6 O2 {& V5 c& R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) O5 g! u. {" X& t7 l) f1 n# v" v f% k6 K0 h8 ^3 N
2 y) P+ y2 u+ l4 \' o2 Q) @
. K# V" Q3 B' Q
Z7 w: d' m* o7 n. K5 D# M7 C
|
|