|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 H7 p# A7 V* s+ h6 `
5 C% \& I _1 i0 O9 w) HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: Z$ [, Q+ w: r7 a6 Q#include <unistd.h>
) b% I/ F3 B2 E. M/ Q#include <sys/mman.h>
) |, \: p" Z( E2 `#include <sys/types.h>
) s w1 y O& _0 I n V8 j6 }#include <fcntl.h>
, r: D) ^2 X) y' V
8 f- M. j ]/ P6 I" k; n; V#define SHAER_RAM_BASE_ADDR (0x80000000) Y$ k) N1 Q6 r. l
5 R8 x# q2 G$ n) m Z$ u
typedef struct
3 q x5 o( c, U# ]# C{
0 O# K! Z- Q" k4 U5 E0 Q J unsigned int a;
) O J" u! p @) ]( f unsigned int b;
) n. z! k) |: K6 t2 J% d unsigned int packet_cout;2 g: x# l! {3 O9 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ k5 T/ a# H5 @; O( U- i$ d
6 l W z s0 f+ O7 wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! y: ^# e' _. A* m9 t5 qunsigned int count_copy = 0;
) z5 m. y; d, }
" T3 H- \; k* E; N% ?0 `9 f% }1 @, \) ^( W3 B
int main()% Z ~% {/ q( N+ `* \) _: o: O
{# |* t. x3 u7 Q6 h
pRX_MSG_PROTOCOL pshreRAM = NULL;! s$ P6 B9 Z( O" a6 d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ T. ~# e% `8 A3 ]- |7 C
, u9 S, [' l6 g0 H* l/ e) Q
while(1)# j3 }: ~" T y2 a
{
; W0 n$ H3 [6 j5 I" {& R read_MSG_buffer(pshreRAM);
8 ~( D! {& B3 }. u/ g4 E0 H }
+ A* M0 W" _" R/ p7 y}3 z" E) H; S/ F% n
% O# A" B( Z, m& R [$ Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 B! b6 ] f: p7 T{! P* a2 I0 G+ {! A
RX_MSG_PROTOCOL buf;
5 H2 S0 H& s; @3 i8 U9 U : |$ G! T1 |* K3 H9 v9 Y' N% }
buf.a = pshreRAM->a;
# U" D/ ~6 M2 ^ {* @! p' S$ P! D% k buf.b = pshreRAM->b;4 j* d( r5 f- W$ U3 P
buf.packet_cout = pshreRAM->packet_cout;8 H1 n) H8 T4 k, p9 L
' O9 u# a8 D& u0 u
if(buf.packet_cout != count_copy)
) b6 `* W4 d( v8 G {. Z% ~+ @' D( P- ~. j/ ?
printf("a is %d\n", buf.a);% k& `/ L- z' k( P0 @1 n1 j
printf("b is %d\n", buf.b);
3 |8 O( i4 C! S# [; L2 J& u printf("count is %d\n", buf.packet_cout);; w1 p0 k, R* } p; |+ @
count_copy = buf.packet_cout;
! o4 `3 k$ }$ F }
# D9 G& l$ y9 B4 M else* m5 B& C" ~4 w( g# g0 n
{
# m) u) C$ o7 `0 ^/ u" m8 j printf("No effective message!");
: F6 ]" k9 {6 t- d2 Q4 f( j }9 y% E" Y5 q# J" y3 X
}
) J+ D3 \- W2 t* v* v2 h/ n4 }% C2 L3 y4 ^
6 c# _( D! b! p- e8 l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' i3 z1 j/ \9 L* e( R$ t
使用下面代码,对内存使用了mmap函数后:6 f: I* b2 p3 u0 I3 Y$ |
#include <stdio.h>
( B' C! Y/ b9 N, A7 @/ P#include <unistd.h>9 s2 x6 N5 l2 F [; N
#include <sys/mman.h>, v+ M2 i) [$ t1 ^* U- n: S( J
#include <sys/types.h>
# Y Y' {' j2 H& z- v( B6 B#include <fcntl.h>
# d7 k: h) a. u1 \, s0 a) k/ c% C/ b" t
#define SHAER_RAM_BASE_ADDR (0x80000000)" [- }9 q1 y( ~4 v
#define SHAER_RAM_SIZE (0x20000)
% F- C8 x- v7 O% c0 x9 K2 |& A, T0 V5 e' [) T; X
typedef struct& G) g8 A9 i( g5 ?' ~/ ]$ Q7 J
{
- S4 ~, @" b9 H unsigned int a;! o& Q& w% a* k0 J
unsigned int b;
. d+ l! Y, V) \! ? unsigned int packet_cout; b- F9 p0 G$ a5 q; a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 F4 H; o7 y! a! b* |
, {! X* Y- c4 B) D: s! lvoid read_MSG_buffer(int *baseaddr);/ t) Q. b, l8 f- I/ h
unsigned int count_copy = 0;
; l* z3 H6 S- @* k1 A' ?; g& m, }! J4 t5 a/ Z* R# y
int main()' \9 r c3 l1 H! s7 a, O" ?' f
{
4 h3 V) r) Y6 e8 v5 u4 l int fd;: W' R( R2 I9 q7 }
int *mem = NULL;
. u2 K& y9 K0 T0 h* M! E3 [ e3 d: U1 _
if((fd = open("/dev/mem", O_RDWR)) <0)
' }0 \, \5 y% H! X {
0 c) k' M) R: N$ h, ^5 s perror("open error");3 J% [* o+ K" z1 @3 s4 z; P9 T' E9 K
return -1;
% p, Q! n; V8 o, i& E& c+ u }
6 b) B0 i+ j/ |0 P$ M/ v6 F * ~* u2 O/ I/ Z3 Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 N) |$ u5 k+ j" \3 N8 t! f# R; B3 p9 M( F
while(1)# p- ^7 h' z. ~8 a+ K
{9 j5 l- v: G& [
read_MSG_buffer(mem);
3 O' n9 {1 F' w } 9 j d4 {7 u. G; p, Z+ d% K
}' t' O" p8 q' s) }* W) V3 B
9 Q% J9 N0 P8 I: o: L4 a
void read_MSG_buffer(int *baseaddr)
- ^3 n+ J! w' U8 p- x$ W{3 D6 J' B/ {3 L. k7 K- m
pRX_MSG_PROTOCOL pshreRAM = NULL;
# L! z9 }. L$ ?4 L! ]* c- Q
, ?( f" m+ N0 d7 r pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: W- a1 g+ I1 s' r; X
8 A' \# [) ]7 U+ |' u
if(pshreRAM->packet_cout != count_copy)
$ x8 c- @9 A+ z$ o4 z {
2 a3 J( e) \2 @# f% p printf("a is %d\n", pshreRAM->a);
" a T! Y) Y$ ?0 h/ g5 A! S printf("b is %d\n", pshreRAM->b);
3 r2 _: f4 J% |* H( S; ~ printf("count is %d\n", pshreRAM->packet_cout);# i- F7 ` M' [# [2 Z. L
count_copy = pshreRAM->packet_cout;* r2 [& [3 {7 d' I8 L' \& g% ~
}
/ t6 G" t0 l5 y3 w else" E0 E3 P s4 C! g4 h4 |
{
/ t. D8 N& V- F6 x, P printf("No effective message!\n");
# t* G0 q. `/ z: g/ A1 ?) P }
5 c: m5 e7 {) i7 j' c( z' G) Q8 G" B}
- t* |- N l8 w/ n6 [+ C
% I6 G) o6 @6 _; I4 c: L6 G \+ O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
i- h7 s- {( i! \1 Y4 g! P
- f1 f) F/ I2 h+ p: k1 v& a5 I
1 O4 T7 W2 [$ [0 R$ O+ y8 u& _2 w) p7 c4 Z1 ^* t" X5 ^
5 S+ S, e6 v& I6 H& G |
|