|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
q4 Z# d' Q; h3 q+ i" e8 K- L
k1 L- j8 Q3 B% cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
R' @" Z7 L+ {; V, n#include <unistd.h>
" x5 l' X X8 L- i1 w- o: t#include <sys/mman.h>' b9 Q2 O" _5 Y% h
#include <sys/types.h>
* C. c- J5 J, g#include <fcntl.h>9 O' a( o# D/ \2 G" w3 @1 a
- u7 Z7 r0 i4 |$ K/ I- c
#define SHAER_RAM_BASE_ADDR (0x80000000)
( ]0 W4 s% _5 D2 ]. }; X3 I; d0 A4 h; t0 P
typedef struct. s8 e+ e) Z4 C0 W4 _+ q
{
h+ H5 X5 t9 w( y+ N unsigned int a;
( {1 F) D) Q, _# M4 u: i& Y unsigned int b;
2 J8 S" r7 G& {# X: ~- @2 K unsigned int packet_cout;% d* v: Q/ N; n4 W0 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 c, k" b8 y( G0 a& a
6 o, ]! i6 J; B# I/ E+ ]6 w% k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, \# q1 _4 n7 ^ b4 h* T) h
unsigned int count_copy = 0;
0 j) s7 [/ Z! M4 r" v: e4 u* L1 t" M
7 z9 t; M4 J* m; q% H6 p- P8 y0 U% {: J! R: h4 [
int main()
: M+ e1 Z# J) `3 t8 Q8 T{2 V# R) d, Q5 h$ ]6 l
pRX_MSG_PROTOCOL pshreRAM = NULL; u, C3 d: \8 U9 E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" X! `# V* W% i' N* f) ?# n4 B( @
while(1)
" O0 z% h- u# N% n1 w {
- {* K2 V, j0 P read_MSG_buffer(pshreRAM);
# ^% }: k* p1 W) B- B: N: F } 3 {! _$ A. o/ Q7 M( p R
}
! O% T, A0 L6 S& V! j Z& p; f; p# k1 h# U2 s) Q. H' e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% D2 N9 D4 h% G$ d/ C) K, e9 |9 ^{
4 I& c& T. E' B% }/ q RX_MSG_PROTOCOL buf;1 h" ?6 h9 j: g2 L" i, N
, X. r4 ~% h7 s1 u2 n# S( A) m buf.a = pshreRAM->a;0 m* ?3 \" D# ^* c, B
buf.b = pshreRAM->b;
5 F: t" H& X# Z: }3 X buf.packet_cout = pshreRAM->packet_cout;3 X) p) I% d& z$ y; E
% Q# d! F4 g& y
if(buf.packet_cout != count_copy)
! h0 K7 y7 q5 x. u {
. O" j0 ~ u4 P. w7 H printf("a is %d\n", buf.a);3 |: z9 E* a0 [: S4 O; v" U* _. I5 P
printf("b is %d\n", buf.b);
& G1 [: N2 F, ?4 ^1 f* f5 { printf("count is %d\n", buf.packet_cout);
# ?3 Z i0 J6 D) t- P count_copy = buf.packet_cout;
% a6 A: l6 s7 V$ Y% v4 g+ J; _5 i0 ? }) M# P2 V+ ~* J
else
' U% G5 C6 P, ?$ T( ?5 t {2 K5 C6 t3 o }. H" A |, m
printf("No effective message!");- }# {8 E; p/ n0 k$ w" D# Q
}
6 f3 |# s! q- D" U. j/ P, v, ?" Q}/ ]" A, ]# C7 K. e2 K Z- p
3 |! j( b# H1 Q3 i9 E: \4 G
5 ~8 l' @( c: `: M% U* N+ O% m$ [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 I9 S9 l% [4 r' b
使用下面代码,对内存使用了mmap函数后:
' _4 a! g) p& R, c4 B#include <stdio.h>
; K, d8 L7 \& q" }3 e( N7 o; ]9 V#include <unistd.h>, z3 M) a6 x: Q" Y5 q* N+ S, G
#include <sys/mman.h>
4 p* C) q$ x( D+ m* J9 J#include <sys/types.h>
3 e2 I i f1 S# }! |3 w#include <fcntl.h> S p7 u1 c3 Q
- |! s" Z$ \' U. m7 p9 M/ K/ a9 J, B#define SHAER_RAM_BASE_ADDR (0x80000000)
2 J) A8 G" X/ |$ y( R- \#define SHAER_RAM_SIZE (0x20000)
' K! u) E. @4 m% u+ m" J( ]& i
- _ w: Y: {3 T8 B( Ptypedef struct
4 }- t4 u2 a" U1 x{; l% v: r! M. Y/ E" K" |9 ?
unsigned int a;
! V3 l! D6 b! V unsigned int b;
+ _% K) t3 ?$ M& D- Y: n9 G unsigned int packet_cout;
+ a; v& h; x% Y- s& f3 I6 B3 F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& x1 D$ d+ v5 ]9 l. u3 F% I
" K$ U6 T: _. w: |' U! gvoid read_MSG_buffer(int *baseaddr);
8 V/ C( O, \4 w& Y+ sunsigned int count_copy = 0;% n3 S! D: H! r4 v$ I+ @' R
) p8 d( r: |' L% |9 A8 Uint main()
" S* M8 y' z9 b$ Y! j# F! g2 o8 S{1 U4 M4 w! X0 x7 Y+ R/ u. _7 U
int fd;
' j! l m. j0 d( x int *mem = NULL;
6 F5 I: j% T% W! }$ ~
+ H( A* O. m; }( }0 ]# z4 t if((fd = open("/dev/mem", O_RDWR)) <0)1 j3 E( x7 O) ^7 }' U
{+ y: @( @$ \0 `- t c
perror("open error");
. _+ z9 S8 E" Z, }. N return -1;* e: ?# M9 D3 ~* m X& G) |& Z( c, O
}( C) U Q/ t" j5 J) I8 r2 y3 A1 W
% }0 \9 v- T* Q2 A4 x. C5 W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' x8 W4 Y' v/ v, k; h9 t7 Z! ?1 _" ^5 R
while(1)8 ^3 \. r6 \* ~5 U
{/ v' n* m+ Z& P: B4 _' ^, r0 Q7 W
read_MSG_buffer(mem);
1 U- J- U6 Q* o" S9 u: B } . J/ ]0 f" n7 a' Z" P5 W
}4 a- b3 v" B* O4 r' N
8 A! v* ^( i# c1 p2 a4 F- E) mvoid read_MSG_buffer(int *baseaddr)
& E" i, s+ ~4 O( n$ n{% q; R; W7 x7 g. D3 H/ U
pRX_MSG_PROTOCOL pshreRAM = NULL;. `' s( R) y j; y7 \' v* v
6 i" N% V; G& H+ \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 x- v$ H' H8 i
1 v9 g% W( s$ s Q% |0 k
if(pshreRAM->packet_cout != count_copy)' v. U% `1 U9 n1 m. n* Y) e
{
K9 M6 L8 s! t printf("a is %d\n", pshreRAM->a);) }$ M0 R7 N# o! A2 s' T
printf("b is %d\n", pshreRAM->b);, W& T1 w4 Y6 f. ^4 p1 e( o
printf("count is %d\n", pshreRAM->packet_cout);
! S) z5 H6 x6 E/ q count_copy = pshreRAM->packet_cout;2 V/ b7 L- I) F% T( `" \
}. f3 K4 x; r2 b
else3 [% _: u( p+ w, A
{
0 Q7 e, d! O- {7 P2 }3 c L printf("No effective message!\n");' t% Q2 T! M/ [
}
/ |1 [1 }3 E/ A2 l6 o* `}3 r4 T1 U/ f% h' H# u
% {8 u" L7 i* K/ O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ D& m% X& S+ p1 F/ \2 o. t
0 R7 L* y2 E2 Z( p5 h" x
7 A" Q& E. [1 v9 w4 T* A
) P' Q$ n8 N" Z' o9 I# t" v! i" i4 T" I E9 x, U U
|
|