|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ T" Z. D- f. R( T1 K
2 U$ A+ B- } j. \; M* O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ d1 p& A# o. z! A9 V) l#include <unistd.h>
! o. H1 m, P3 h4 R#include <sys/mman.h> D. ~0 G9 m- d2 n2 v+ [& c
#include <sys/types.h>
0 g2 I1 Z, u' R0 i' V" B+ J#include <fcntl.h># n s8 {& q2 u" t3 \# k
* B7 w* N: @) S* u$ j9 c( V9 c0 v#define SHAER_RAM_BASE_ADDR (0x80000000) . l$ O9 O5 P3 G) ?2 O% P* a$ P
2 ^4 L0 Z0 Q! R q6 Q' ~1 R
typedef struct- s& r- w8 W" U7 j& ^7 k: F
{
$ `* [8 e0 g) [3 m. A5 e7 | unsigned int a;
$ i/ k1 Y/ i- w9 P; n( b5 Q unsigned int b;
* u8 m6 f. P0 h" f unsigned int packet_cout;. o- d) `/ x& w, @; ?0 ~! S% [; N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: T9 ?4 {6 v. U1 q6 }5 O+ |, g3 C4 ~7 F! _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ Z: `6 y6 I( q% b1 m {unsigned int count_copy = 0;2 ~/ m2 n: |# B
* k3 F+ Q! r4 e: ^ E
9 A @4 N7 d+ zint main()2 x. p: s, p5 P2 Z1 q& [' l
{
; q0 K# G) m: v2 B, O5 N pRX_MSG_PROTOCOL pshreRAM = NULL;( A- f# z& J+ G& d$ G
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) F" w! S; E" W2 Z& K5 W
8 ]- Y3 L: n3 ?7 t; o; L4 K* l while(1)/ `2 V7 J# C0 F' _( y3 o# n
{3 U! _5 a0 j+ a" l% e; g: b
read_MSG_buffer(pshreRAM);6 H+ R0 I8 {' u$ ]' b% Y# _
}
3 _/ @1 l4 p1 @, }( b: f}
2 w. c3 q% m4 y
* e: B. s: d! Y3 J" J2 svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, a$ |1 f7 W- ^' a6 h8 }{
9 T) J. x' I" p: X RX_MSG_PROTOCOL buf;
3 R3 x- K& Q3 w* n
: v1 Q: P7 c; m2 M2 E8 q" ]5 { buf.a = pshreRAM->a;
$ m( ?2 q7 T2 S8 @ buf.b = pshreRAM->b;3 t; z6 n4 c$ }! [6 p
buf.packet_cout = pshreRAM->packet_cout;
. O: B7 m0 J, T: \: X; M2 [( C* [
" K9 e; h( I- q; m' i3 ` if(buf.packet_cout != count_copy)( Z! D# ~: P9 e& ^/ I
{
! z, G) x& K) n- s" K) x$ c( E8 M' Q printf("a is %d\n", buf.a);
5 o9 @! ~, G2 R5 U! p2 f) y! n printf("b is %d\n", buf.b);3 @& q! ^4 y9 c# i$ H
printf("count is %d\n", buf.packet_cout);/ a2 f" p3 m- ?8 Q9 M
count_copy = buf.packet_cout;; u( Z c7 G( O) l) Z
}
) y; e6 e% q8 z2 K9 l& U3 k: S else, M1 ]" k2 t, t f; f
{& C8 w: z% X: g
printf("No effective message!");
! u4 b# @; D* ?. C7 l$ e }
, y* k( |4 L/ ]8 g" f# Q}
8 {* O5 z- Q) I9 a: P# ]0 g* M0 q, B4 t% t3 F1 M: Z9 w
/ W: R I; P% v/ U+ H: m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( n4 S E- b V8 |( I7 @5 P& a" D2 ^9 v
使用下面代码,对内存使用了mmap函数后:4 w2 {% F) N. @( ]: G
#include <stdio.h>/ h# |/ d) x w" L% k4 M0 U3 i4 R
#include <unistd.h>
7 p. J8 r" e6 z F$ `) D9 S#include <sys/mman.h>1 I v" \8 P3 ]
#include <sys/types.h>
3 \( `. d8 j; M; H; [. x5 m* }6 a#include <fcntl.h>
: V# X1 G. o6 n. }% l: w* a e( q7 F) r7 d/ ^9 m6 k5 i: Y' t( ^
#define SHAER_RAM_BASE_ADDR (0x80000000)
& [2 T ~* ]- n9 ?' G- h Z2 `- o$ `, Z#define SHAER_RAM_SIZE (0x20000)
+ c5 c7 j- ~- w$ e. _' e
7 Q% z- y, _ {) A$ ]1 g5 L Qtypedef struct) {/ @* D( l" z w) u: e$ }) R# H: P
{
2 C1 j- [1 k6 ]$ ~ unsigned int a;/ }# X. D0 B7 p5 H, B6 r' m
unsigned int b;
0 w+ f5 `, z) Q4 Y# `6 M/ ? unsigned int packet_cout;( h" u9 S! f- x5 G, ]0 i+ U6 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: E5 {; F" `) {+ _" y8 p3 H' ?% I/ V. n' w( L
void read_MSG_buffer(int *baseaddr);2 S! g8 Q. F( l. t' t; z. b
unsigned int count_copy = 0;7 u( K+ P$ V0 v; U
8 d0 Y2 s( J* p% \# k- ]
int main()
% \+ O* U% @: z3 N+ Z{
* H& X' n# o1 U* ~9 {( e3 _% ^5 D int fd;
: g* T1 Z! A/ z5 `5 r( K int *mem = NULL;" |* ?; k8 D0 [& [& L" F/ _ G4 S
8 I& Q6 b# x# S4 t* [0 a5 K if((fd = open("/dev/mem", O_RDWR)) <0)
( p1 k& ^- a+ E5 X" ^1 ^4 { {
* w6 y t) D6 I perror("open error");, T9 _, \* m. R+ g+ e8 g
return -1;
! |+ f$ q/ j9 Y& V& O }5 R0 {) E) B& k7 o. l g9 @
: e/ E3 ]3 ?: P; o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 U* C( f7 ?# K* t
( @0 \% w n1 D5 r while(1)
9 m- ^8 ]% Q1 h+ c( U {& L: e1 p& p5 \6 J, k8 U
read_MSG_buffer(mem);1 e9 h' x1 K/ l5 p+ J
} 0 V6 B- X, S3 L% d$ d/ {/ c0 ~
}
2 ]* I7 g z+ c) ^0 _( E
( e$ ^" r, \' Q% Nvoid read_MSG_buffer(int *baseaddr): U) X! ~2 \9 m9 F! u
{
" D! a* ~7 k8 v( s8 w pRX_MSG_PROTOCOL pshreRAM = NULL;& s. ^, N5 Q9 `! c/ _3 r
1 ?6 L7 @2 k, B/ o: F6 i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 q3 {% |6 Y* F
! Q. @5 u. `! @ U( G7 c0 A, B0 | if(pshreRAM->packet_cout != count_copy)
& J* w, J0 P9 R3 H9 t {
+ z+ k9 w3 m1 ~4 L, y' ~4 c printf("a is %d\n", pshreRAM->a);
/ ^0 f3 J# }, k5 G$ E( ] printf("b is %d\n", pshreRAM->b);
\; m- ]) U0 a% z! x% S% c printf("count is %d\n", pshreRAM->packet_cout);+ z- a f4 C2 |# N5 J0 R
count_copy = pshreRAM->packet_cout;7 _6 c+ Y* d. x- ]0 ^
}
( R& I3 T8 }. S: E, `1 ] else
( ?) t; f+ e U% ~# G, d, e {+ ?/ ?6 M" @% ]6 H) u/ V6 ~' P! K5 Z: z
printf("No effective message!\n");& y6 e* @& J3 y5 E! ]
}
7 Z/ C; Z7 s) m/ A! n}( @0 h" I7 H$ V& ^+ L- X2 m! G9 V
$ v5 n$ v- V) }2 C( W. P" J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* C$ H8 j; h1 Y$ |3 y2 G8 @! l+ ?3 }- ~. b2 b4 W
+ K/ E7 P4 I& u) U3 e
% D3 _# P% ~% k3 p+ i
. ^2 X( k2 }2 s( o* g+ J |
|