|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 W. R2 m& D0 [; t
$ b% G" s V, u2 D1 y+ b' y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; Q2 x' |; e8 a" P5 \/ }7 @
#include <unistd.h>7 J7 T% K1 p: A% h, z& Q0 k1 z; f
#include <sys/mman.h>2 a* }4 s+ D" X0 j* o) z
#include <sys/types.h>$ y9 z: f! y& l! w: o
#include <fcntl.h>! \4 y# j# B& A/ |
) h% n! N$ n. H- R1 Q& t1 L# W
#define SHAER_RAM_BASE_ADDR (0x80000000)
* O7 H5 J: |# P/ f' H1 D: m0 g/ z. ~7 b8 j- d0 K! o4 t
typedef struct
; s. G) _$ [9 J3 n5 L/ z+ e{
3 ]. h$ V6 ]. g2 P" r unsigned int a;4 i4 ]( i9 G) _
unsigned int b;
9 {$ R2 M* V9 ^ unsigned int packet_cout;
" Y) a; j6 ^9 ^& L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- o7 l& T# T9 }' B% u) @% Q! y" Q% d6 W' Y' k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. z; @' C" y7 R; Q: O& u
unsigned int count_copy = 0;
) n1 K% s: y4 a) g# R1 }& E7 |% s/ D0 D" b" X; y; V2 s
- D. \; L6 V; a9 n& b. X% m3 ]
int main()
+ |. a. L& x1 X# {{
8 h1 @4 e/ L4 n+ p- |4 a% \) ^ pRX_MSG_PROTOCOL pshreRAM = NULL;. f+ r8 \. i3 E9 @, i2 u
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% s& ]1 L: M6 a7 H' m" _. d
; n5 I$ G0 s% C- E* y' e7 F
while(1). a, I7 B- K1 Q# y9 g; k
{
; }# [5 C& B- t i8 r read_MSG_buffer(pshreRAM);
3 H0 J4 `3 B& k1 t# ^2 \* p3 c% C' ?" _ }
* \! _0 _+ H$ E+ @4 e8 k}6 i* I* r" [0 a
$ ^$ k$ @) g, _) n* E# D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# _& e |( x2 Y9 [. \ {8 p
{
1 R% L5 j# Q1 |4 P6 {$ \+ p RX_MSG_PROTOCOL buf;& K7 n! ?- Y0 o4 l% q# \0 ]
! a" f3 y& `+ n& U( T8 S" D
buf.a = pshreRAM->a;
+ t7 a4 g+ ^, A* m buf.b = pshreRAM->b;8 k6 A( b* a6 Q) v$ @
buf.packet_cout = pshreRAM->packet_cout;
4 [& d5 B* R" |1 J% y& A; s; ?* N
4 | h! Z9 i0 m; e( Z if(buf.packet_cout != count_copy)& m1 s6 s/ o( O
{ y1 }$ \' ~0 }$ X; @
printf("a is %d\n", buf.a);
5 n% u" R% z1 Y! Q/ y" X, i printf("b is %d\n", buf.b);
% S5 l( ]! \- K+ |/ B printf("count is %d\n", buf.packet_cout);/ v* S F1 ~3 S/ B- L7 u
count_copy = buf.packet_cout;: `- X1 h6 V! m/ R/ L7 c& T) S! \
}% f* @# ^. ]* ~* i
else" ]' S! f. y. \5 l! R! K6 j0 ]; ^
{% i9 p: @/ [6 x: q" t! v
printf("No effective message!");* M; Q: ~) c) \
}
( G* p0 h6 }. y4 F}% G; ?/ H7 ~, I" ~) G
# m+ ] s6 J. p, K
' m' L" V" G3 |/ K7 u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; i9 d! {4 W! O: ^
使用下面代码,对内存使用了mmap函数后:) J8 h* W! S) M+ x% `6 e: r
#include <stdio.h>8 q& ?# n! Z# d) K* X X1 i
#include <unistd.h>
$ A/ I6 W3 l2 \( B T#include <sys/mman.h>" n! \0 f- a5 l" D" c
#include <sys/types.h>( I0 ^0 w8 A) E$ F1 U* d. R \" ^& O
#include <fcntl.h>4 O$ n1 h$ m, t1 r& K) C; S9 x3 g: d% n
+ r% ?$ I+ S0 L9 t$ _
#define SHAER_RAM_BASE_ADDR (0x80000000); \4 [" X0 W- M, j0 ^
#define SHAER_RAM_SIZE (0x20000)
* Y# ?$ B, |- I7 D3 g& Y' |3 z
/ U- E# }0 @2 Q X5 a6 t! Wtypedef struct! _0 B# ?/ C/ g) y5 ]5 B
{( q- k9 {0 N0 T0 F$ g5 t+ z: t! {
unsigned int a;0 G5 o8 `' q7 K# p) L
unsigned int b;; e: u* q7 \5 l \# I- g
unsigned int packet_cout;
0 F& f% c( L, H p/ U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* r; J% t4 r% E6 E
1 l; Y7 v: P) b2 _5 i
void read_MSG_buffer(int *baseaddr);
: L' Z/ W4 g5 I3 Q5 Q' m Zunsigned int count_copy = 0;4 a$ Y! R% J8 [& h4 ^
# f7 N' M7 f# W1 G& F6 gint main()
U, [* |* X# J2 m: D{
" i8 ~- l7 t* I/ Y; G2 T int fd;
: Z( C+ z, O5 U; T! i# N int *mem = NULL;) a7 E8 ], l$ X I& k
3 C9 V' k5 b! N* a: b) Q5 R if((fd = open("/dev/mem", O_RDWR)) <0)+ M* B' `! s+ a
{
5 Y' i- W$ Z7 e0 |5 G; y# E; a g" o perror("open error");
$ {& {# ^9 O( J4 F5 M return -1;
* f% m; A1 b' @2 l4 `. W }
- w7 O4 z& a( U. k ) }3 N9 B ?; j) H+ a6 M5 o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 p0 B: q3 j8 j
, N/ }/ P8 _$ E1 X while(1)
; ^* F3 r" Z' C3 B/ g: T2 t {
. W" n4 N1 P) \ @5 [% I2 t read_MSG_buffer(mem);
y3 t$ R0 H5 R% u$ ~2 X6 Z } " m& Z5 b4 k0 B% [" D' }
}4 m0 P3 I: l5 g0 M
\: X1 u7 G7 V3 D( m. \void read_MSG_buffer(int *baseaddr); m; Z3 d* {4 X$ O% X# s7 Y
{7 _% ^8 J6 x" S q3 O' s0 h$ a+ C
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 ^4 g5 A" @2 |2 l" w" v# l8 s" z6 T
& o5 |/ e) j9 W! @ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# R7 e+ i" W- [) ?8 u! s+ O9 \
G5 z/ C4 {# n8 T4 H8 q4 \- a
if(pshreRAM->packet_cout != count_copy)
* T( I9 G/ @$ u% n {+ }+ h- j- E7 b) ^: v6 e
printf("a is %d\n", pshreRAM->a);7 Y$ k" J4 t0 y" Q3 P' _* [
printf("b is %d\n", pshreRAM->b);' g% |3 J2 a- j; L6 q4 W
printf("count is %d\n", pshreRAM->packet_cout);
! F# e- t! T/ Z) o count_copy = pshreRAM->packet_cout;
8 ^: i* X2 B1 c6 d( ?- i; Y }
* @# S# {' X3 F/ L! x: W else
' ~4 G* i+ S* P; U# u% {% H* _* b {
* w0 P" n, {- W. A2 ^ printf("No effective message!\n"); R& n3 _4 R- m& y
}
- W' l- C1 k+ ~}, ?! Y/ D) P8 s$ I# k% p1 G
: u5 A3 `7 F- J/ l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) Z; h6 |, t9 Q6 f; C: }4 \' ]
/ ~% O1 G3 [( u* {; F4 D- S; W0 F# [, w/ x( a; t0 ~
" ?, |& I& l) D6 ]* d' y
9 P, z, Q4 |7 Q) ]* w. Y) [0 b
|
|