|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
p; _; D' l7 u; T8 I( ?& l( z0 X. E3 O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 n6 c1 w! X* J3 K, M
#include <unistd.h>
1 x ^( A+ J0 x+ ?#include <sys/mman.h>' n/ c; f+ ^' f! M& c
#include <sys/types.h>
* i3 h. c4 E" e. _& N#include <fcntl.h>2 g0 V& [5 |! X* l
) j1 b9 V! P d3 G/ Z: }
#define SHAER_RAM_BASE_ADDR (0x80000000) . _' ?' q+ r/ j7 n, N! j% j% @ V
& E9 \0 ]2 N c1 |& jtypedef struct$ M! I) c1 r- W, Z b' S
{
3 L# h' I5 }% E' Z# A! R' U unsigned int a;7 I1 F0 U; B0 B
unsigned int b;2 o2 o+ m) H" _6 x
unsigned int packet_cout;
8 B. n" e% h3 C) ^! O1 r' t+ o+ M8 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
s+ Y2 G' [. B( i( u4 o* T3 I4 H& K2 H$ I8 r1 m( J6 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, `% b% @! V8 g, Lunsigned int count_copy = 0;5 t5 i1 u! I9 h, c( _$ [9 W, ?
- \# D' ]5 j& @! j0 A j, {! W+ q) H6 O& C2 |, }9 a& j
int main()+ }" A _9 v1 A2 ]7 u1 R7 t
{
( `( N! {0 d* p# z" U- N pRX_MSG_PROTOCOL pshreRAM = NULL;
. F+ n! a i$ y pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" @ z# m8 _& k& I2 Q7 \$ G4 t
* b4 p1 F! M# d1 U while(1)5 o4 W5 a: l' T( ~" `
{
+ o: R3 O$ U5 J3 m0 G ] read_MSG_buffer(pshreRAM);
6 ~* T! K; o9 b: e* t" ^1 e }
6 {' G; r1 l0 ?) B! X6 _6 [0 m}
: d! C+ M6 S* y! R: N' E c+ n6 b9 f$ r( }* W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) z! F+ ?. I5 g' u* h3 k0 z6 \{
7 A4 t; l" V2 x/ O RX_MSG_PROTOCOL buf;; z6 I5 b' n1 f! B
6 e' L+ @" @# ^8 f' d6 t# V buf.a = pshreRAM->a;
- p& C) m- v& F8 n+ l3 |; q buf.b = pshreRAM->b;
V" Q' x3 q( g% a) d6 B5 W! m9 Z buf.packet_cout = pshreRAM->packet_cout; }3 i" Z( x" K& c% H3 j; h, h
& Q0 f# f# e }4 o7 z: h' U7 ^6 }# M
if(buf.packet_cout != count_copy)
( P' C' O4 { h* s {
1 Q& y/ e4 _) ] printf("a is %d\n", buf.a);1 z( V1 J5 W# A& U W
printf("b is %d\n", buf.b);( g; o+ s4 O/ |: X
printf("count is %d\n", buf.packet_cout);
. q) A! p& i9 Q' G" w count_copy = buf.packet_cout;
3 g5 E; T2 U& m r2 c( I% C }6 \0 v* {% a- B; I( _- {- o/ L
else# J$ A J: q; t5 P2 }% d& n
{6 m1 b/ B. y" v4 h( V
printf("No effective message!");
+ Q/ N; l! [" X; ^9 M6 K( m) s }/ Y5 _ h; L7 b5 R, ~# a7 L
}
+ b+ ?/ ^$ F& M) X9 i6 N) w) v5 z3 t& U+ ^; u* f( r3 S1 T; x
$ h1 g! ?- [' N* Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 ?" j G! B! f7 U% [+ o) h
使用下面代码,对内存使用了mmap函数后:
0 H3 s( I; H* s: x, ^( |#include <stdio.h>
) F" O" t* ^7 V#include <unistd.h>8 `) j4 l8 B! a
#include <sys/mman.h>- i+ ^! a9 ?( V P$ i+ n- i
#include <sys/types.h>: Z# n8 E, Q3 X* M
#include <fcntl.h>
$ g. W* t( i. j( M T: J8 m4 K; b3 w
#define SHAER_RAM_BASE_ADDR (0x80000000)
* ]$ @- ^( r" r8 W#define SHAER_RAM_SIZE (0x20000) 2 [4 U5 }' I. V/ K( M0 J( f2 H
: o' m6 F. \5 S7 K
typedef struct
@+ a) I6 e$ i) t0 M; o1 P4 j& K! G{
5 s7 C4 Z0 V5 H+ v unsigned int a;; e; L) F' ^ Z: q2 q( S
unsigned int b;
) K& {5 G6 P6 }% _7 Q- a. j7 m unsigned int packet_cout;
) a1 g/ L* K' P8 U2 @3 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; A+ B6 U! |, @! y; M
/ n" P6 x- J; v
void read_MSG_buffer(int *baseaddr);
! p$ k+ ~% F% W/ s! Uunsigned int count_copy = 0;
+ E8 P0 ?2 ]/ U0 D% h" x# N+ Y8 m/ } d% f( m
int main()6 @) D+ d6 W' x6 C$ t
{# @* f. H! M1 I0 L1 {
int fd;
8 d5 \- s' O( R# ] int *mem = NULL;
+ I* V/ L" `0 Y1 `" D: V' p- Y1 ?0 W8 ]! m
if((fd = open("/dev/mem", O_RDWR)) <0)
9 c: Z" I( w! q! N( } {
+ y4 K# P/ i) [9 p perror("open error");
+ h8 y" A1 Y1 `7 y) z0 T( ~4 L return -1;
" \! }/ M: e. G/ U }
& D7 R' J+ Q7 s1 i9 ] 2 Q, l% X# K) E3 i
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! ^% c) h& s) b
" @/ Z& U: g- G# y m8 p- ~+ ^# W
while(1)5 p8 d; C" t8 w' Q+ p
{; E& h* ~' {9 J/ T( z
read_MSG_buffer(mem);: f P( t% f$ o+ f
} 9 ]9 x# _2 X& T- K. }+ d- @1 X
}
5 I; d: J1 R5 [% i' b" R) i8 `7 g% X% V6 d# h$ G) X3 Z
void read_MSG_buffer(int *baseaddr)) t% K+ X, O) @! M1 ^2 Y
{& c. L7 P V4 W% [5 U
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 N5 k9 s( ~, N- Z0 h, ]# v5 i g! ]: _5 `% H: |
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. k: @! U. Y. f% `8 O1 q- g+ v, V u- F
if(pshreRAM->packet_cout != count_copy)
6 O/ L2 r! V$ H9 E [/ e! {- T, D {1 L& b; R! E+ H% _' m, B
printf("a is %d\n", pshreRAM->a);
' y* `- E+ K7 C5 P printf("b is %d\n", pshreRAM->b);$ |9 l4 R: Z1 E- Z3 I) V5 i3 X
printf("count is %d\n", pshreRAM->packet_cout);
. m& F; o* \- x& ? count_copy = pshreRAM->packet_cout;
6 S) U8 l# n/ |, `/ j4 Z }' l( W e3 ^4 {! x8 v* Q" R. n
else) v) f8 Y7 z& i
{" b( V& ?$ v' `' o, }2 c. A
printf("No effective message!\n");5 D- ~ w& q5 n: s
}8 v; i& C+ \/ D5 I/ g9 Y# }+ g' z
}
4 I- g5 W. F0 X; ~
* ~( z8 n2 l; p( z! u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: ?2 S- ?% Q) C8 J
" P( c3 L2 S* l2 Z# f" v3 v( x
8 O) Q2 }" |: `$ d: U L/ @- ?& R# t7 `8 m& P: K# I
: Q: `) J3 ^$ M4 {. Q' [+ R
|
|