|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) D, J+ v4 y* j* L/ P' o) D. o% k7 c$ p0 o: L0 [6 {" ^5 U* p/ D3 X5 ^( u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* Z' H. B: h. @6 a
#include <unistd.h>4 u7 E8 n) C. o- O4 I# z
#include <sys/mman.h>3 ~2 W n. w+ q# W5 [" N
#include <sys/types.h>, r- T& T8 j, c, O& h
#include <fcntl.h>: }* B I; ^. I- Z6 I
' z' p# b% H4 a+ s#define SHAER_RAM_BASE_ADDR (0x80000000) 6 e2 W4 R1 D4 f* G' y
/ N8 D# b- D/ O6 P; F! ~$ ^+ }typedef struct
/ ?6 ^/ i1 H+ h& X Z0 |{+ ^, R u p( z* J0 t( I
unsigned int a;
3 Z, e8 q3 Z B unsigned int b;6 y/ H4 i5 o0 P
unsigned int packet_cout;
* p# C2 r: b8 ^; R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" c' B1 d1 |8 t! M; a* ~
2 Q2 s% S P0 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& N W2 y5 e$ X8 z$ k; ` t
unsigned int count_copy = 0;
" S6 D% \. S. O
7 Y6 V( F: O' P
4 E4 \; d9 r z$ |1 @int main()0 H. b* R( p" n# H h% n
{) I9 e4 J0 M2 u& n9 \0 [; `0 M4 D
pRX_MSG_PROTOCOL pshreRAM = NULL;8 j+ G" K; Q; z8 W5 }( |( W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 Y% A" @. A7 J6 a2 K( L
3 G, [' v5 }7 z# Q while(1)
1 X: K1 l* [" r' G( G! r {
$ |2 E6 R8 S" `2 D4 A read_MSG_buffer(pshreRAM);
! F; c- e; x1 g2 r! j# Q4 G } ! Q8 d) H2 Z9 o& I% \
}0 q I0 f5 k6 X4 O+ C1 M
5 I, k' c# c- Y' u& q) p8 kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ d5 Z1 I+ i9 [8 F1 S" B {+ E
{7 c8 x" j2 c9 r* f( }
RX_MSG_PROTOCOL buf;( ^" |0 s# _/ x5 h: E1 l* {$ c
* a& x7 |' W G* s" ~2 t8 s" x6 {, Z, K
buf.a = pshreRAM->a;9 q6 E! O8 e7 A9 _, P
buf.b = pshreRAM->b;4 [+ s; d) B9 S* ?& J
buf.packet_cout = pshreRAM->packet_cout;/ R; J- o# K# Z/ Z& l9 b8 G
2 ` H6 W4 r; W9 C$ { if(buf.packet_cout != count_copy)
8 e' f, T4 b! {: R {, R" `9 b7 T, L6 M& p8 z3 x% S
printf("a is %d\n", buf.a);& Z3 u, t# A( e0 e8 T+ a
printf("b is %d\n", buf.b);
4 Z6 }, {0 ^+ i( _ printf("count is %d\n", buf.packet_cout);
+ H" H) W# ?7 } H9 C K count_copy = buf.packet_cout;" F# ] ]6 `; d) J [$ u
}
4 O" n4 F( L7 Y else
6 n/ M9 G8 R5 @0 F; @9 w {
+ m7 X, o% @7 P! N! d printf("No effective message!");
- A( o- K7 Z% y! k+ o7 ~& k+ \# D }8 T9 \* S. ]' P5 d1 E
}
. ]+ ]0 B0 m8 ^/ w/ h6 d
?& |2 b& A z: c( l# f! n% t
4 b0 J6 e; n1 k5 m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ z x, |* m; ^4 N* C) u
使用下面代码,对内存使用了mmap函数后:. t' x" {/ c' s' B% E$ M0 m
#include <stdio.h>
) a L# n4 c8 N6 t5 p! J# f#include <unistd.h>
* L k4 e9 q' H$ M# W#include <sys/mman.h> s3 K$ U% _( m2 d' Z8 v
#include <sys/types.h>
, l ~2 C2 j$ ?; V% V2 x. Y#include <fcntl.h>7 n+ s2 f/ Q! T9 U4 y
! i9 M2 D, O0 i( @
#define SHAER_RAM_BASE_ADDR (0x80000000)1 A( V4 M; \5 X! y" _% z/ Y( [5 V
#define SHAER_RAM_SIZE (0x20000) * Y7 m$ n& @% g0 @
2 x! F0 I' R5 }( M# Utypedef struct# t- b2 ]" H0 {# e! O
{
# \# F6 F' q$ n# P2 T$ B/ ? unsigned int a;' K+ j3 t8 g1 C( p1 E: ~9 S7 O
unsigned int b; [2 ~/ A$ f- o+ ?; B* i# y$ N. Z
unsigned int packet_cout;
7 E4 k; L5 [+ D7 o3 ]( L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! ^+ H( d9 r/ f9 n" g# V9 m7 }7 t, o7 e0 T- {8 |1 Z
void read_MSG_buffer(int *baseaddr);
! d3 L& {8 S/ ^unsigned int count_copy = 0;. g x! c% n0 O- s0 y
9 h, R+ @! r* D' qint main()
l! j% W" o. {{3 w( Z1 h4 E0 Y, a9 Z4 x. \
int fd;
1 I3 Y* ?" T' K+ ~ int *mem = NULL;, Y) ^5 w& k1 {9 x( U9 a. F
3 b2 d- {$ a& h8 q1 _ if((fd = open("/dev/mem", O_RDWR)) <0)
) S! h) @/ |/ u! ^% | {1 n, P$ v L7 V
perror("open error");0 Y) X1 D) |0 e
return -1;
% n# u) o F# `" b+ o. W8 R8 w }8 u6 x' y/ q+ L' O
, Y1 t9 {6 k( w+ B# I
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 V: k6 o" K% z3 z. g- u
# k" R+ Q, n+ f
while(1)) z. V- b( @0 V; k, J* ?. Q6 m8 N
{+ O' s( x3 g+ u. Z% F! r
read_MSG_buffer(mem);: j% w+ t" I; S# b$ T/ x
}
8 u- P. T5 B: f' Y! v) ~, i. d3 [}
% C1 _% Y3 Z& c" [0 ]) q2 @# f5 F4 T8 W
void read_MSG_buffer(int *baseaddr)
/ [4 J3 s r: T& l{
$ A: `& B) j( u pRX_MSG_PROTOCOL pshreRAM = NULL;1 V" ?$ ]6 I2 n4 B# {, `8 t' ^
6 n- G! n8 c2 J5 R) f
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
w% f6 x+ i% _2 Z3 i( d8 Q' ]$ c' M" }1 R' w- L
if(pshreRAM->packet_cout != count_copy)! L3 \ M. O+ ?; m
{
; m$ z A6 ~% h printf("a is %d\n", pshreRAM->a);
' {+ |/ Q5 X Z; e5 H) j' v! c5 | printf("b is %d\n", pshreRAM->b);
+ I8 g: J( r% T8 V) R) D printf("count is %d\n", pshreRAM->packet_cout);
: x4 N) B8 L/ N" `% j9 }8 V' h count_copy = pshreRAM->packet_cout;
* Z6 P- c) ~1 u2 N6 @% k6 A }
H8 `; R1 C1 p, z% N1 \ else% F8 a* O; Q# w
{
; X8 P, \0 K! h$ z: m2 y2 C printf("No effective message!\n");
- r, A8 r9 A2 \9 V5 Q }; X; T: p- U) g- @: f' c
}
( |; [$ q/ t- T1 w; N' {0 R
" a% k, G+ d& w+ j* |2 b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& V% P2 n4 b# `9 k$ ^& l' R* D2 d# W* V' p4 h6 S) V+ k
4 b1 j8 E! {6 _/ g% T& R' g3 D
6 l& a1 P4 Q& s
1 o1 d! L$ S$ B+ J
|
|