|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 t. p( k' L% Q! c, X
9 @- D$ h7 Y5 O# z, Y; x6 g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) G, h' m. x2 x2 w1 s( V+ L
#include <unistd.h>
, ^. R$ s4 U* s: C4 x" n#include <sys/mman.h>
8 u( H9 F' w2 d* ^7 }9 U#include <sys/types.h>
; z ~" l5 \& M* n#include <fcntl.h>+ @4 {$ K W1 O' B C! ?
0 n6 X @$ A: X$ e9 `# X- k! j7 O
#define SHAER_RAM_BASE_ADDR (0x80000000) ! t" f+ l- y( l3 I% u" O' H
2 o+ ~+ B. ^( [typedef struct
" f) u4 Q# I* ^, R( m$ B ?8 r# k{
! h5 a j, H8 c5 Q unsigned int a;
3 y" n+ t7 Z$ k2 @ unsigned int b;
+ n5 [. H4 B0 h) i' q8 U' n unsigned int packet_cout;- z1 }, A4 y5 v& ]$ Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 c. |8 ]5 j3 k& z
i8 i5 \# l" _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% {/ Z" p0 d" N3 J3 ]! W
unsigned int count_copy = 0;% _/ p7 L1 O: `4 [- P; ^
) R, n4 {: [4 T0 i$ I
@& \0 N. m# i6 |; j1 E0 R( G3 O
int main()
% I2 P+ Z G c0 d( E( p{
) X7 q4 n" A, I9 L4 r pRX_MSG_PROTOCOL pshreRAM = NULL; n& N0 l" A# t$ X. l: g
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; x; {3 o/ c' u9 O9 j2 M9 Y( c- W
& x% T' _$ I$ M( D1 U while(1)
; {6 H5 R. N$ R4 @2 \ {. Z; P; K: o4 Z' B! Y9 s0 Z
read_MSG_buffer(pshreRAM);
9 I$ c) v/ g) l3 T5 J9 N }
, f& {8 f* Q* u}# b% `- h4 {) S4 g5 k
: s6 D* I2 l* U8 X: a/ N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 F G% c# \1 O+ V9 Y/ G, P$ b1 J{
5 j7 R' `$ Y. l2 c( ^& U' B RX_MSG_PROTOCOL buf;
$ o7 f0 X# ]; r: O& w6 i: v 5 v, a" U V; {& x8 ]! x h
buf.a = pshreRAM->a;
( H/ e* P+ |9 S4 u. L1 N6 { buf.b = pshreRAM->b;& u5 O2 M1 J3 b& P6 ~( f1 i H
buf.packet_cout = pshreRAM->packet_cout;" u; V+ P, H$ v
* z$ s( Z- E7 A# V* J3 m3 X
if(buf.packet_cout != count_copy)" R# C3 o' W* _, [
{4 E0 g& a0 ]4 x4 _9 }5 \0 G" b
printf("a is %d\n", buf.a);
* O C0 ?3 I- d0 N& s. h. u! c printf("b is %d\n", buf.b);
0 g" L: M( i) c+ y printf("count is %d\n", buf.packet_cout);& ]; b/ m' W5 D! @) C
count_copy = buf.packet_cout;
' M, I( p! S6 U! K }
, a( {# ~4 |1 J- t6 R3 B else0 @7 Y$ I* k: z& ]
{3 \9 i( K: N+ O1 i; }
printf("No effective message!");" j& _$ Z. e3 |) c& ^1 T
}1 z+ x( ?' H3 p8 z6 Z
}
0 B1 `9 d( M) z" ~+ N3 e
6 B# j3 d% F: k1 {7 x' ~% F! E9 g1 f) i3 ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! Z+ g* Z4 B' b9 k使用下面代码,对内存使用了mmap函数后:
+ @. h1 ?4 m' }/ W#include <stdio.h>3 y) }$ E! p J; R4 z G
#include <unistd.h>/ c0 M3 @9 V% [/ E
#include <sys/mman.h>/ e& h% A3 ~' T! _: I' }% W! G( _& L$ d1 @
#include <sys/types.h>5 K" L+ k9 u, h2 L+ L
#include <fcntl.h>
2 T7 |0 a# H" [5 E9 {- E6 I9 Y( g
#define SHAER_RAM_BASE_ADDR (0x80000000). l% ]$ l! S' u! R/ k) F
#define SHAER_RAM_SIZE (0x20000)
9 `+ C* l8 p; N) ~$ Z& o5 R
( W8 B0 c* T5 p+ Q/ B6 g, utypedef struct/ w1 M& |1 [6 L4 k P5 e0 l4 i
{
9 l2 D8 L& S( B unsigned int a;2 A* F8 g! L4 y7 I1 I
unsigned int b;
: t6 S- L7 c. m4 B unsigned int packet_cout;4 B6 P3 N5 f4 B6 s" Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ @3 ~+ U+ t7 H1 c! U. [& {1 o
( t O M: J h. Q: V5 V
void read_MSG_buffer(int *baseaddr);8 g T$ z+ M7 A
unsigned int count_copy = 0; ]6 n: {' t" E- _
/ j ]1 t! Q+ l( e2 @9 H
int main()
% [; a W' y6 Z2 x; d* E: Z- r5 m{; k/ i; J/ B; H9 o$ S
int fd;
& R# [1 P# F* p4 B% N) ?2 n int *mem = NULL;
- J) w/ ?3 p: D* H$ C, H% ?8 i5 E4 Z* d" r' D" U; z2 S
if((fd = open("/dev/mem", O_RDWR)) <0)
7 \* _( s! n& j" S0 m {
/ i# p q% ?* C8 w$ U: G perror("open error");5 K4 s" F0 O/ ?- D
return -1;9 S# w- ^5 v( R! y' J
}
& d- `1 E5 t, y$ D- t- U
5 c4 P( A# T2 k( c( i4 R4 W" D mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( S7 b# w" [ B! v- }
" f9 D( f0 z+ o6 ^) f* Z while(1)
$ d q# f* Y* |# g6 @ {
; s$ v' r7 V6 O( z$ C9 S read_MSG_buffer(mem);+ o/ d. `$ O7 E6 Z1 D+ ]
}
8 F4 L, S" O' R9 h% A2 d) N}
2 D' L/ n( x5 v2 z& B ^3 g) R# e0 ]! [
void read_MSG_buffer(int *baseaddr)
9 B: `2 B1 n- @" u8 h{7 w2 [3 e/ Z, K( O6 w
pRX_MSG_PROTOCOL pshreRAM = NULL;5 d0 W6 j y/ V+ N3 w5 d8 x
. m k" G5 K$ V E: H pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 `- v7 h, T5 B% I' }; e# H V. T7 q
4 z7 @: P: g: `2 L2 ]5 k. I if(pshreRAM->packet_cout != count_copy)
; f" G3 ~! C$ h9 V, E8 C" t {2 S3 f' f) K! `" N5 {
printf("a is %d\n", pshreRAM->a);7 i4 J2 ]+ I% _8 P
printf("b is %d\n", pshreRAM->b);
4 s7 s4 D5 J4 k7 r printf("count is %d\n", pshreRAM->packet_cout);
# o' e& h- K$ U' G4 w% K count_copy = pshreRAM->packet_cout;) g+ q% a3 t7 G" C, q% n
}
$ r; D$ q; U+ i' ^& _ else) v, \! C/ F+ y1 F! P+ I
{
* D1 S* R+ N) W; V: c4 y printf("No effective message!\n");
8 I7 x, z; j; J5 ~ }
/ h8 Y( V0 R0 x v1 M: v2 g9 y}; `, F) t& p j7 P T( Q
' `' s4 U0 t% Y. f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! g! _2 R. S+ g
% u4 u) E* n5 ~ C% U7 l8 l4 G3 o/ C
) Y; z+ t! D" s1 X- z2 Y% k
. m0 A' a. U4 g
|
|