|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 ]/ |6 t/ L. u3 @ m% G3 A5 [1 p
0 O* F( J* x' g. v5 e) W& h4 Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" Q( R" c- P. y' e#include <unistd.h>
: J! m0 d" A; ]9 b" ^% y2 l0 }#include <sys/mman.h>
) [8 M0 i- E5 Y/ t& ?6 Q#include <sys/types.h>( [3 P" L, H$ N7 t
#include <fcntl.h>
% a- u0 Y) `1 m/ i8 ~2 L+ Q) ~
2 s/ A0 w" A" |/ X( J#define SHAER_RAM_BASE_ADDR (0x80000000) : [* c# ^, n. V- Z
0 Q. j$ d, a) N. d2 Z
typedef struct
9 s$ G7 {$ T- V0 @/ d1 [* L) |! j{2 |) `- F5 I/ a5 E/ M
unsigned int a;
! }1 Q) k" H9 j k unsigned int b;
( {" F3 Y. X, n+ {1 |; \ unsigned int packet_cout;
! k& ~) @: \3 I: C8 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( c" Z q P9 C& E, C y* g5 w8 I, Q; v5 g+ ?( H3 _' Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 K! Y8 P1 ?. c1 e7 f! m
unsigned int count_copy = 0;
2 z$ S6 y5 m. b! x$ Z) R# ?# G8 K4 t
; K# X1 r, C+ \3 V) s4 s7 g
( P7 R0 {% R; J9 m: R) @int main()
7 w- J0 J1 @1 y$ k{- m3 Q3 I. H& l+ @6 M, V
pRX_MSG_PROTOCOL pshreRAM = NULL;! I! \/ k# e" ?* Z* j" w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 [/ \ d9 b- B9 R ]% k
5 O' m& z q. n- v& }% ?' n
while(1)
, I; h4 l5 s2 K7 B2 F {+ j: j( ^* x7 b9 J; O0 a9 z: b
read_MSG_buffer(pshreRAM);
) h5 j( Q: i, |* B: s( p+ @ } ; ?3 C6 O: F( g' X4 X* |& e7 Q
}1 n1 F+ \$ E: I* M, J
1 A4 K6 k/ b( y; @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. u; _' p/ `" h) I0 E; \, ?$ J- b{$ E8 b1 {1 \/ d% q. F" k6 w8 m
RX_MSG_PROTOCOL buf;
( J9 W1 O* ^/ m8 _( i
, ?4 k$ C8 O0 g. X8 j- z: _ buf.a = pshreRAM->a;$ d" H# G2 N6 o- V7 v
buf.b = pshreRAM->b;
, o/ @8 i4 n" }2 Z! Q. {' ` buf.packet_cout = pshreRAM->packet_cout;
# x4 [8 M$ p9 u. J( z 0 m0 d G/ L& {
if(buf.packet_cout != count_copy)
3 ?' \" y" _- W {, i4 ?5 {; Z8 D6 k5 |
printf("a is %d\n", buf.a);5 Z- G& g" R3 ]0 x, d1 f5 y3 V0 r
printf("b is %d\n", buf.b);. f: L' o- T' K7 |( v/ E% | J1 K. F
printf("count is %d\n", buf.packet_cout);5 O7 y3 `3 Q; p$ U
count_copy = buf.packet_cout;
& E% I% i& n6 W6 D0 Y# b2 V } t( V; z: J( t; i
else
. j& W3 a) ~7 W, t ~5 x( m {( @6 I2 Z5 s" E9 v* B
printf("No effective message!");" S# ]: y3 G# {2 e, z( N) e
}
$ S6 N. b4 @* J% \9 l}
0 m" ^: ?8 ~: Y% U% {' l+ @. k7 u+ D
& Z6 e# L; W: @* w- I% K) X. |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: F a' Z) _' c
使用下面代码,对内存使用了mmap函数后:
5 L% M I; p6 G: j* ]#include <stdio.h>
$ U9 R/ J& R9 T* z$ Q) F, j#include <unistd.h>* p2 {* H* M6 A# {8 k
#include <sys/mman.h>8 A" _4 n6 Y2 Z" k: Q: X
#include <sys/types.h>3 _( p- y% w* B
#include <fcntl.h>5 h3 ^+ o$ k3 z$ J
4 f& g' d1 h: {. Z1 l" v2 J
#define SHAER_RAM_BASE_ADDR (0x80000000)% ^8 e5 G0 e) r' I3 Q- H
#define SHAER_RAM_SIZE (0x20000) 6 W2 _ `8 |% V: a
) [' J3 ^: @9 Q' f8 a: h
typedef struct; x0 O6 \0 D# z8 `8 @
{
4 c5 D4 R6 i3 m! U9 Q! N1 n6 T" Q unsigned int a;+ `6 \4 S$ @) y' Z! B
unsigned int b;
9 Z' j2 v- P: D3 Z4 I8 G, N" t. B unsigned int packet_cout;7 T" \2 s3 z! e% C% T( c. s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 b$ x3 V5 B+ E, C/ E1 D5 {
6 G; G# g' ~ {. B/ z& P- _% k2 |* X
void read_MSG_buffer(int *baseaddr);( @7 w# R- w/ `6 ?8 p
unsigned int count_copy = 0;( W, _: h6 e4 N7 ~- s b
. y% U" H l f
int main()
' [8 T6 m( g8 v4 A{! z) \2 |2 w1 p' O) L$ @% Y6 `
int fd;( |% \. y6 D: T
int *mem = NULL;
- K# m5 n, L1 K! N; p' C j+ i
/ r% c5 y" {8 \! W if((fd = open("/dev/mem", O_RDWR)) <0)
- X4 P7 u4 ?" G/ Q9 e7 L# Y" X {
# \$ H/ E/ E" Z( O6 S perror("open error");! z9 i; o4 G. G/ P5 p
return -1;
' M) Z. `1 ?; \& ~ }/ R( \, E2 L8 Q, \ t
: N, P3 _3 o) J" W3 I% }. x mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* {/ r$ t2 y! P# a9 G- H
2 k2 Z$ d: ]1 b; I' I' X- u) V
while(1)7 g: g) g" `1 p1 a
{) B, i9 ^( f& R2 \/ Q
read_MSG_buffer(mem);% v+ l, K, d" O# I
}
9 N" x3 F3 I% h! x, X4 R}
! x: _! H4 `) K. a, U# g3 r
O( Z- a" e3 g5 v0 Ovoid read_MSG_buffer(int *baseaddr)) e) _; H- L/ l: s7 C& w( U. D
{5 t: o8 U+ g3 t
pRX_MSG_PROTOCOL pshreRAM = NULL;
" e( s, @$ j7 G" H+ o9 V8 y8 E: N C/ I: m, O4 J2 j" S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, {6 k3 [8 [. w* G1 [' D
5 ?+ l8 g! I* O9 V if(pshreRAM->packet_cout != count_copy)
r1 e; J/ v( h A( B {
% [* I& F, J4 i; c7 _+ Q printf("a is %d\n", pshreRAM->a);
* T* I" q6 |2 d0 s printf("b is %d\n", pshreRAM->b);0 I2 ?( r8 M7 W- \
printf("count is %d\n", pshreRAM->packet_cout); n! y/ [4 }0 x
count_copy = pshreRAM->packet_cout;: X! U' M9 x) V
}5 c1 p `. g; B: H2 {( H
else6 Y( w5 F: ]. g# N# Z' {0 g* Y, N
{$ O, B" ^7 W( f) F
printf("No effective message!\n");
, V1 s5 W- ?* e% u9 g* m. Q }
2 C9 F: s2 b3 k9 U}
' V$ p) Y$ k0 E6 R* n8 V1 W! Z& |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 O) R' F" u' L2 P
( O3 v0 N7 a0 d/ y" Q Y! Z5 q! `3 T$ T5 I$ o# h; }8 f
% `8 B4 i( F! b% i
7 [: a9 o: `$ G0 A, ?9 N/ Z
|
|