|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 T* v4 v$ J$ a! B& F* j$ N! L* M) q2 H" b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 c0 V/ l2 u; P! @4 d7 h#include <unistd.h>( e- p! G) }! J1 i1 ^1 v$ m$ |
#include <sys/mman.h>
+ R& |1 O0 \& Y: W0 Z7 h#include <sys/types.h>
U; V! K, x6 f7 ^# |#include <fcntl.h>$ Y5 |# @1 E4 B2 }6 S
L( Z( z; L; u9 K- U* B
#define SHAER_RAM_BASE_ADDR (0x80000000)
- Y2 X1 ?' r9 \0 S, U: D" b" N
' `6 d5 |* K! \typedef struct- T& N* l. o& R- R E3 T0 A
{
3 A2 |0 g0 ]# R0 e2 o unsigned int a;
( D6 Z. W( |8 r0 t9 K unsigned int b;
5 [$ j" H8 [6 a unsigned int packet_cout;# e% A+ {$ f6 f# _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 i$ e9 h8 ]1 [, p
1 b4 y w, h$ }: [3 [, s. J9 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& Q+ L" J( f* H, H* G+ j
unsigned int count_copy = 0;: y# Q; F' F$ L9 ?
/ C$ d/ c$ ~, m4 R" u7 @' H5 |0 K# t0 v4 Z
int main()
; J6 i( \, s/ q- x4 Z{0 i$ G) s# ]2 ?) t% I8 Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 y- O# d1 f' ~ E2 x pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' T) F" X% M* y% h" ?0 |" F4 I
* n8 z$ [( i; ^$ [# G0 {3 `% M while(1)4 S p& m) h5 L8 ], @3 i
{
7 H& {' T) t: _0 S6 r X7 ^ read_MSG_buffer(pshreRAM);/ G/ ^+ _, m8 |8 k/ k
} # A% {6 y. {; W9 r, B& }6 s6 W
}
/ R2 T+ s# l L3 s- @$ m' F
5 C/ g5 \0 @8 E5 `5 ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, E9 t0 S9 f' M" T{
7 E& v* s( a. V: C RX_MSG_PROTOCOL buf;
" b/ D/ `1 Z5 X8 b% I% y3 r* ? 1 u1 v: }- J) w: }! y. }
buf.a = pshreRAM->a;$ C, z; {9 t' j/ Z$ D2 p) p8 ]% v$ m
buf.b = pshreRAM->b;3 F" x) [% I# r
buf.packet_cout = pshreRAM->packet_cout;
4 c2 [5 D9 G& `( b; i' i
) T4 }5 g }8 _ if(buf.packet_cout != count_copy) v: @9 [2 S+ s$ L% k9 K' m
{
! J# x# t( W$ d printf("a is %d\n", buf.a);
# K" K+ U1 G# V9 e7 } printf("b is %d\n", buf.b);/ b( n. D9 A1 z( n
printf("count is %d\n", buf.packet_cout);
: [& ^4 u. C& z2 X- v% @( s count_copy = buf.packet_cout;
: _1 V# N5 {# t }7 }: q" x( x2 a7 f1 g
else
9 B D5 T( C% C: v0 ]$ k3 X {
) Y, D# g( R$ b, X J" x printf("No effective message!");) H5 o6 F6 I$ ?6 J* i
}( S* ]2 ?: B; P+ l b
}1 b3 e, x' K3 {! k& j& }3 X! l4 E
- S/ P) [2 t# F/ G! A" ]/ l9 u' ~
2 P" p5 R6 l7 h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ e# I# H, _* M; e使用下面代码,对内存使用了mmap函数后:3 e& p" V L4 k/ t
#include <stdio.h>
) |! s! Q* p, o8 F1 x4 a- p5 u( l#include <unistd.h>) x7 Y b2 _0 q- @0 V7 F! Y" \
#include <sys/mman.h>
. I5 |' e) A5 X6 O0 {" o# }+ K#include <sys/types.h>
7 I' u( @# O: c9 g( y4 u! w#include <fcntl.h>
. z; |$ f! p+ T3 Z, X' c# Q
4 P+ M# w6 H- @0 y9 T5 L#define SHAER_RAM_BASE_ADDR (0x80000000)- @2 h9 s; m8 b/ l
#define SHAER_RAM_SIZE (0x20000)
7 J" B, r! u; q9 x8 r' y O* p+ z6 u9 y
typedef struct
/ G4 T* ]) ^# o% f{- \$ S+ F! L" ]8 b
unsigned int a;$ Q/ H7 X5 @5 \1 a- z" E
unsigned int b;
% ?- l0 [$ o1 `/ f t( V* y unsigned int packet_cout;
2 j! P" ?, u6 f$ c' @2 n5 d! B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 r, m6 G: x# Q1 y: N: X, D3 l
7 ~1 }9 w: N% ] k
void read_MSG_buffer(int *baseaddr);
3 ]0 d5 ]- j. }- R) f4 J9 Bunsigned int count_copy = 0;
X+ j F5 Q1 w. v c n9 R3 _! @4 \5 F
int main()2 w, ?& \: q6 Z$ f: U
{
; {7 Q4 w. o4 w+ | int fd;6 P% A O/ R; X8 Y
int *mem = NULL;7 w# z7 Z9 t$ n$ E- a- {8 g
5 u* c! N+ z# s1 a; R if((fd = open("/dev/mem", O_RDWR)) <0)! b7 E' v7 ~! l" ^6 M: E" | ?
{0 L. f+ Y& O1 a8 D8 V( W6 }
perror("open error");; Z$ ^8 b; S! a) ^, |6 M! O$ c+ r' h
return -1;! f5 h: |. c& G% l# F+ j4 C
}
6 ^% y2 A- Q% p L( V! |4 S% E ) P5 A. J7 D2 P* S5 u! ]% u. t
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' X4 p8 O7 W. Q8 R
# \0 w& A% E% f8 ^5 a- I q
while(1)
B: z# q; [* _7 d4 S- O {
- W" l- V) A3 L- u; o* [0 e read_MSG_buffer(mem);
6 ~. p% J, v9 N } o5 p& h/ k1 e/ u, i: R6 j
}! C/ `' V1 s& p
9 t0 y% z, T7 R+ L2 R, F$ G$ Wvoid read_MSG_buffer(int *baseaddr)
, s& ]$ k8 i9 i* u{* ~" |+ O7 F) W/ b9 S
pRX_MSG_PROTOCOL pshreRAM = NULL;: `/ S) l! n4 M% L6 ~8 T
+ C/ w: c7 y* ^7 Y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 J+ J/ D( m9 x/ F
4 G: o. {6 B/ d' u if(pshreRAM->packet_cout != count_copy), b* V; u, U% l7 o6 ^0 {! q5 F
{
: Z/ \/ _- w. V% Y7 ^ printf("a is %d\n", pshreRAM->a);
+ R2 j0 c) X; }* S, u6 C( }% A printf("b is %d\n", pshreRAM->b);
# T5 n( W2 m- Y! w printf("count is %d\n", pshreRAM->packet_cout);
! [+ z0 ]! [, \0 M, k" b: c6 k count_copy = pshreRAM->packet_cout;! p9 L( W# R) @3 W: M- L0 l
}
7 Z- c7 Y l$ m$ N else$ \5 k: |- @; ?! S* I& \. v
{
. s9 n: l9 s$ B7 s. e' v printf("No effective message!\n");
( u, i8 u( v0 c8 D2 K: | }5 n& l+ e4 [+ k: K, e/ X v
}0 w$ q5 o; l) a2 O8 c
4 W; K* W8 N3 c% o. x; d! b. Q* }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- a! H: w, H/ v1 i- C
; o F* z% ` ` A3 f0 d
w) U; Y/ Y& ~9 _7 K7 v% \% W# C9 j7 X& c4 `0 C5 L& p' ] `" I
* a7 z( b1 M3 R; A9 b
|
|