|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 U/ C& }' t+ J& J" k
k- w' c6 e* p! A( H1 ^- UOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 [2 d# ` P: h( ^: g4 _: s
#include <unistd.h>* `5 k4 s3 ?6 n1 d( t
#include <sys/mman.h>
8 m4 q. ?1 V5 d" n# _3 D#include <sys/types.h>( P' f$ C* Q, i2 c; }6 g, h
#include <fcntl.h>
, C/ X& O2 I: D& K* c$ H" v
& z2 W3 {& w& @5 |+ V$ b#define SHAER_RAM_BASE_ADDR (0x80000000) ) I+ i, Y& ? [8 z
# a2 V J$ X7 j w0 N" i
typedef struct" o+ P+ E' c6 U4 S" ?: U# q
{
7 j8 h& w# I9 u1 O# y; `" Z; n unsigned int a;0 A& `4 W# c2 `; r/ I
unsigned int b;( n1 M- q$ ~; }, Z9 m3 f# T
unsigned int packet_cout;& ]8 ^& M7 H0 n7 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ B" c7 Y: L1 ?9 _
, Q" y4 p) B8 P0 D [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" `) b3 e9 P6 u5 R, Uunsigned int count_copy = 0;6 p6 Y* K$ d8 q0 h) G% J$ e
' e! X! }# z" ^/ x" z1 G/ H6 T3 k
( g0 ~7 K% m) m5 F9 J/ O( G Lint main()
9 a3 {* U2 v) N0 q; l5 p4 O. Q8 _- n& s{
0 |! _4 j G. ^4 j; t pRX_MSG_PROTOCOL pshreRAM = NULL;8 h7 Q) V% l& x! K2 N" C) z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ W6 n. s' G. o; L
% H0 z9 \! C* c8 r- | while(1)
6 ]2 i" L% D, r- ]7 N: g6 N. B {7 h' ~- E* e! O' Q9 r
read_MSG_buffer(pshreRAM);, a U3 e$ t5 G1 s; P4 J
} 5 o2 W% {* x$ x! b7 _5 U) s
}% ^" H' g! A0 h- c) _# h8 V
; @' A) h- g8 i& \7 i+ G2 V _2 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 S& o$ l: c- F4 a
{
- C4 e5 o, r+ ]- q/ J+ @ RX_MSG_PROTOCOL buf;, n" B/ ~) D* @! l8 o
# `. ~6 k9 j) Q' n) c buf.a = pshreRAM->a;
8 y2 @: R4 e# z. `' v- ~. e) W buf.b = pshreRAM->b;" r; o2 @! c! Q: Z9 Q# m2 @5 q
buf.packet_cout = pshreRAM->packet_cout;
+ i z/ Y& n# M Y! Q, n3 t3 z5 c
if(buf.packet_cout != count_copy)4 u4 X# {$ ~9 M3 P) H M0 C
{4 m; y. y2 u4 C }9 p1 u+ u' x
printf("a is %d\n", buf.a);1 z! k) |1 F0 E9 x3 E
printf("b is %d\n", buf.b);
1 `) ^2 D6 U: V' U9 C printf("count is %d\n", buf.packet_cout);) w. s1 | e7 m" W# \
count_copy = buf.packet_cout;
$ }9 Z( a: c c }
* B( i( a' g& }, Q) r; g else
( _4 X* }2 T0 b2 Z9 c3 S {' S& ~; x4 g$ Y
printf("No effective message!");3 w4 u V2 K7 @5 I
}
4 Q( x( _4 E$ j4 [* J+ z}5 w. |! @8 T: @) W
4 K9 `* j3 J+ {$ P& Q) l
0 Z( U) E- e* W/ F! l7 ]; _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. M* c! l, `( _6 @
使用下面代码,对内存使用了mmap函数后:
2 R+ F: r# W* v+ w4 l6 |#include <stdio.h>
2 t; ^4 }% `" o# N2 X3 x8 B; S#include <unistd.h>2 e8 D2 } R; S- z! I8 X$ O
#include <sys/mman.h>
% b" b, }5 h+ g' ^% i, B#include <sys/types.h>2 `) q* v( a$ E
#include <fcntl.h>/ E' y# j$ E6 f. E- r
& g. h: Z5 r$ N" L
#define SHAER_RAM_BASE_ADDR (0x80000000)
# d& g1 `! K" s#define SHAER_RAM_SIZE (0x20000)
9 y7 L. D5 R/ x% ]3 J5 b: o
9 ~& d% y# D+ l' Y: m9 ftypedef struct4 r, L1 U8 g4 Q" i
{! s/ G1 ], M ? o' J
unsigned int a;
6 l7 O% W" q ? unsigned int b;$ H/ |; j$ y* C! a
unsigned int packet_cout;% e' _2 k& d: r0 L( G, z, a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. Y2 _. V: i* p+ M( E+ ?7 x
2 _. t' o h( @' k+ x `void read_MSG_buffer(int *baseaddr);
9 Y5 R4 I7 N5 @0 C* D+ {* V+ r* S; u8 xunsigned int count_copy = 0;
3 w5 C6 X9 h9 J5 x. O! @) U2 C8 D: ^/ }7 m4 I
int main()4 R, C# _1 ?8 u3 ^
{! c& C6 z; p; V- B$ O
int fd;
2 N P a1 ]. Y- \ int *mem = NULL;4 T* Q: [4 t- y' M
{" F3 p7 ?1 g0 w5 C5 V% j if((fd = open("/dev/mem", O_RDWR)) <0)
4 ?( ?* j' I. c; X7 s) g- Q {
, G' p) I9 @9 \% k perror("open error");
9 U8 r8 Q5 \% U$ B) W- s8 }% n" g return -1;
U$ c, m$ |6 H5 \% |: C' g }( P5 p7 i9 e1 t' r
" _! g6 t. Q5 N% u mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% G; ?, }7 E5 _, M& W% }3 s
0 ~5 m7 h x1 ~' d5 x/ F
while(1); r4 i% K, e, s# n9 f& z
{
4 R$ n9 m/ s, V1 C0 w& _8 `) ] read_MSG_buffer(mem);- N: Z" R6 v- ]# W% v
} 7 c* Z3 T# w; k6 E
}
t. |0 D& O! ?4 A9 Z$ B* W- U- _- d, ^5 l% z
void read_MSG_buffer(int *baseaddr)
m& N, c1 r N3 q) A{0 B3 Z% W, o! I" a
pRX_MSG_PROTOCOL pshreRAM = NULL;& L; `' b8 e, w, W; m2 }
" C% G7 ]( s0 J- d
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 g4 F) }# R F; r) A; f7 h d/ i h3 _+ H8 i/ r' E4 P
if(pshreRAM->packet_cout != count_copy)
, M# A! U1 D( P) O) V# ? {
5 W p8 r3 h! ^- k% [$ ^ printf("a is %d\n", pshreRAM->a);
3 M" O+ v4 O' [/ v) n0 L! n% e printf("b is %d\n", pshreRAM->b);6 E/ L- J2 z" M$ S$ |1 Z
printf("count is %d\n", pshreRAM->packet_cout);0 ? h& ]8 @7 s% e$ b4 p4 z
count_copy = pshreRAM->packet_cout;
; x4 p P8 D# ~, n }
+ S; |* ]2 s& A) J' t else* i Q! ?$ N/ j
{; a- q# Z# T7 T! ^; K8 F
printf("No effective message!\n");9 J; o* ?( B7 R2 K: k7 Q1 O& a
}
& F3 O6 `4 ^1 V}
4 U0 \5 E( S7 X0 T1 n; T% v+ B
}6 v4 P& c. N+ P( T2 |没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& ]+ m* M2 K7 l
6 G7 V3 \' q7 a+ [) }2 R3 p" V& g8 M6 G8 S
I# o+ f$ Y/ |% F
, m% G- ~6 ], w |
|