|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : d, l, }4 k2 r3 _" P3 ]( r0 d
7 B& o4 D0 ]* M8 b8 |8 AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* b- Y" t8 O/ f7 p7 X) T#include <unistd.h>8 v7 _5 [- N( a+ n
#include <sys/mman.h>
+ f0 H2 l, ]& J3 [; a* V7 m% s1 ~#include <sys/types.h>4 u$ V' ^% L! p; L% ~9 b- ^
#include <fcntl.h>. t- V6 e% ]2 M f! H8 b
- n2 N/ O) D& W' O% K#define SHAER_RAM_BASE_ADDR (0x80000000) 5 r) N! n2 k& u8 U0 r n3 R
+ e8 m" ~7 W& F1 S& g7 |2 utypedef struct5 \2 |( m7 f. v' _; b
{
( H. N. b" f a1 N unsigned int a;' O0 V( s1 z3 N1 x
unsigned int b;# g! }; J! q3 K+ ]$ r5 u
unsigned int packet_cout;" E5 i- u; S+ z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- c- m! z$ e' D9 C/ \; R! A5 c; G' F1 j: x; L+ E A8 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 A# @5 ?* W+ K; z
unsigned int count_copy = 0;1 V9 t1 A0 V3 l3 K9 G6 L% u1 _
0 z3 C* J/ c) o1 v& A
, K4 \ ~" k, B% u
int main()7 {# D8 H. c) E- z K1 N- t
{
# a' b8 Q: h; Q# V% m pRX_MSG_PROTOCOL pshreRAM = NULL;# {6 [1 w, O% N/ f3 W! e# ]
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ I2 P' Z3 V& o( a8 Z9 R
, k _, P$ @) h ]) k while(1)- T" L, A1 S( q! t$ n. C
{$ J/ O- }5 v b; y% o
read_MSG_buffer(pshreRAM);
- m" x: x/ |+ L+ t: K, u }
# w L- D2 N2 n$ }& |( N}
* B& {, S* Q6 r* V
' U( m' f. f0 K& ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% ^2 T p9 X: u' d
{
8 r0 _) w, @$ H. D RX_MSG_PROTOCOL buf;
2 }+ h' J% m* E/ _" d8 m* S / e/ R! W, p/ g3 d
buf.a = pshreRAM->a;
- e4 s' F3 f0 W) H" O0 b8 \ buf.b = pshreRAM->b;0 i* n C- t8 v9 S! _
buf.packet_cout = pshreRAM->packet_cout;
7 A! p& @0 t, ?7 Q- C
4 c# C$ R; l1 M+ P$ a if(buf.packet_cout != count_copy)
. ?! R" v) T% V+ {: x2 E {/ M z7 [1 n- X5 S4 {1 ]
printf("a is %d\n", buf.a);
( C. D4 Y" C9 M printf("b is %d\n", buf.b);. z# ^4 \0 }5 O5 p& L- b) ]5 {
printf("count is %d\n", buf.packet_cout);1 R, k$ p$ I3 d1 Z2 l& m
count_copy = buf.packet_cout;
9 @1 G" |( u- `$ N' I9 B }
$ R' D/ D+ J# r# Y else
# F$ b6 V6 s% i0 N7 E {
- m, ~2 g# }$ x" S0 t$ {# ^! J printf("No effective message!");8 ~" K- E0 Y( R, b3 ?0 T( B
}: z8 ]9 g5 V, G( M/ z5 G6 M1 S. L
}
0 _8 F8 g9 T3 s; P* u4 F4 E) _ b+ Q3 \* i3 U& C
) f x% P/ p0 `5 ~2 y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
o% ?3 ~8 N! K' _使用下面代码,对内存使用了mmap函数后:2 V. p6 g+ I: a, y8 r) a) M# Y
#include <stdio.h>! h V6 R. K9 k- a; D e: j
#include <unistd.h>
9 y- x1 v, ?/ F#include <sys/mman.h>
+ ]# A! L* {) J' @#include <sys/types.h> l2 S! v% v1 b7 U, N
#include <fcntl.h>
/ @' H7 \6 L q( O/ |+ J" s0 X! J/ a$ p8 S& ?$ }: O) _ l* {
#define SHAER_RAM_BASE_ADDR (0x80000000)% e" @# u6 U1 r% O
#define SHAER_RAM_SIZE (0x20000) % H+ g7 k6 w/ O7 P2 E
: G: U6 t5 D* P# X2 c" x/ ~typedef struct
/ ]2 J9 c$ b9 J2 d% ?# I! ~{% }! i0 y( i1 A8 F2 ^1 g- a
unsigned int a;8 S) j {+ o* [3 {) `
unsigned int b;
7 n, s: p9 [$ J2 Y unsigned int packet_cout;% m- A- B, E7 g* R- }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; ~$ u$ `+ {0 f; M; ?
! e+ s% R2 O( h+ Q# Tvoid read_MSG_buffer(int *baseaddr);( z' ^- w% Y; E+ q5 ^8 D( ~
unsigned int count_copy = 0;
+ M# {! v: x a! A; r$ i P) c i. B( z, @
int main()
. ^3 q2 ]) v7 i& _: A3 M4 L{
" h" S! y: A- q. u* s3 k int fd;
. X: o# b6 r0 T5 E int *mem = NULL;
$ n& w# l& @# c/ o
5 K, P% w( C) @1 ]! e" i8 }: @7 ^ if((fd = open("/dev/mem", O_RDWR)) <0)
8 d- a Y. T7 S- H+ h- m {
- \1 g% l2 G5 c; I perror("open error");
% \6 V" O/ t% H return -1;" U+ y5 ]$ e) l8 w1 }1 k! t; _
}
1 [& v) `, E7 ^" Z
, R7 ~9 |& l. o0 l: e& K7 L mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, w4 W3 }) i5 `4 X3 W
+ i- y: T1 e5 A while(1)4 L; \- l) t: {: q
{
: L9 F5 L# i& ]* j# {* y read_MSG_buffer(mem); W% U$ `- V( ]' C" Y
} 8 E' r5 T/ ? }! H. i, v
}1 ?8 e* B& N2 q: c1 I2 {8 T L* f9 i2 o
& \ s6 C) z2 l# N6 D
void read_MSG_buffer(int *baseaddr). K2 Y" Z: ]% a$ z1 b
{" f+ W5 G4 }1 N3 W: A0 K
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 E' X0 s2 a2 n6 q* W! m% U
% C- U( {& c8 i8 n0 c3 r0 ^" U- C pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, @7 _) P$ H$ T
. b# a6 E" u' A if(pshreRAM->packet_cout != count_copy)3 |9 z+ j. @5 t/ m! O
{
# g6 @/ T* {! d% S# \) z0 {8 S printf("a is %d\n", pshreRAM->a);( g {3 z! I( v6 T3 q
printf("b is %d\n", pshreRAM->b);
% a8 }; o. w/ N9 O7 R* A! k0 j printf("count is %d\n", pshreRAM->packet_cout);
& u1 f2 q9 b2 T1 Z7 z2 O% z count_copy = pshreRAM->packet_cout;
4 d( N( G* L' m, q$ i }
/ a+ e- P' b! x else9 z+ ~7 z' ~$ l' ^4 R
{& \6 e3 D" N6 E6 N) I
printf("No effective message!\n");
4 n* |% K* f0 P }5 o6 e" c k& P( r% \ K, o9 {2 F
}
. ~& S0 M/ z2 {9 M2 K% O( K2 \1 C- d/ f" h1 H/ A: @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& d; _' H) U' h6 z
! B9 F( ?+ H" n& \. U
. v4 s3 @& K, r2 S
! x7 t- p# t |0 h7 `- r0 z! e7 y1 m: g% t+ k
|
|