|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& n" _# V; R1 \% {) I9 h3 u
. G! |3 ^$ i7 T1 ?: W eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 i, P6 x9 [. g
#include <unistd.h>
8 V1 `5 c9 d1 B4 {# H. e/ ^#include <sys/mman.h>
$ T; b/ j# A1 K0 \& [' T#include <sys/types.h>
9 a% R/ B) F( x2 F#include <fcntl.h>7 b) a! f" H, e& B6 |
! O0 V% n# V, ^- o* l#define SHAER_RAM_BASE_ADDR (0x80000000)
/ L# Z9 o8 w2 Q" p/ y: J+ C4 E! Z5 N: h$ K1 i6 M# @' y
typedef struct8 f8 l& L9 _, Y ]% E: p
{
) Q% C2 F3 p3 P unsigned int a;# Z; R) V2 ~6 E5 N# q
unsigned int b;
; c7 _' L8 z0 c- | unsigned int packet_cout;
! a8 W1 W( D% V* |' @) \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 t& t) K' D" \' Z, H6 c
" c3 ?$ \9 t! a, f' E: Vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 g- p2 F7 I+ Munsigned int count_copy = 0;5 w+ T- f x: J/ p2 x& D
! K# ]# B$ B \0 S: A% A- w9 P
0 X4 A5 ~2 |4 F1 \" rint main()2 U' d0 P! \! o
{
5 V. k5 H2 G E; ?8 o pRX_MSG_PROTOCOL pshreRAM = NULL;! L) R6 w$ b. Y& ^ T0 C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 \ d) {: e) T. q# t& _& N6 a. V
0 g8 D. K3 H4 b" D, ~. C* e while(1)
! X2 x, T0 o- [ {
$ k9 K3 b$ ~. y: h read_MSG_buffer(pshreRAM);- e5 j9 n [( f9 o$ {" M
} , s# ]. l o2 e! }$ Q5 z
}
/ {" M6 u3 n1 [( o" V5 _& d
/ h1 X) q; M! E' P9 C: ^" `$ `" |$ `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 f1 z7 R& p5 @! w; g
{7 O, T5 W! Y$ x+ u0 \, m
RX_MSG_PROTOCOL buf;
1 L; m0 O8 q2 n$ x( t + ^+ E4 [- Q. {. I
buf.a = pshreRAM->a;& ?" x2 g7 `' f
buf.b = pshreRAM->b;/ g& y' y$ R N2 e( c; t6 M. L
buf.packet_cout = pshreRAM->packet_cout;2 v: F* }: _7 r! V+ j6 U$ {! Q
/ r% G8 }3 G ]: N if(buf.packet_cout != count_copy)
! P9 y% M4 K/ r% S4 g1 B2 f {
0 M4 C$ ?1 E# Y( G$ N printf("a is %d\n", buf.a);
& O, J2 X& W; {: g7 A printf("b is %d\n", buf.b);0 p& Y0 m8 [6 w* M- W2 p
printf("count is %d\n", buf.packet_cout);. w" [' e0 |* d( O. U* H! c
count_copy = buf.packet_cout; o3 v6 A0 P4 u- P
}9 s) N) o/ V0 d* \! a% H
else
: Y& {* c _9 I% l/ ?9 p9 d {7 ^7 i! E) s7 H: `! ~2 N
printf("No effective message!");
2 B% Y ^1 V+ E0 x2 h }
" i0 U; m: H% R1 C( Y2 L}# {7 m% v& ]$ n2 B+ p: G
4 a3 L& k- ^$ I6 M7 f
5 B+ n0 u% }) |' M; Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ A; l! V2 Z+ l+ j I; r0 @* |
使用下面代码,对内存使用了mmap函数后:. ]: \6 _" n: O# X
#include <stdio.h>+ B8 X7 r0 E, B$ ~
#include <unistd.h>) B5 L* J* C4 R1 s# P$ A$ l
#include <sys/mman.h>% g L. c$ c2 N$ |, O' h
#include <sys/types.h>
, J. {6 f4 y: b) N; |7 T#include <fcntl.h>* ^: y% Y* I T5 L9 x v
) I" ]' O. W! f, M4 n7 f#define SHAER_RAM_BASE_ADDR (0x80000000)+ J2 S/ j) N/ M5 R" Q' H4 Z/ S% o
#define SHAER_RAM_SIZE (0x20000) 4 R/ I/ a( |8 f- R3 G2 j; f
/ p* y) g$ ^* m. F* X0 O8 ~, i! r
typedef struct
$ c7 b9 ^8 n: ~5 T5 e{. f/ K+ `' J& ^( ?4 l
unsigned int a;2 B6 |9 `& a4 S- {3 G' b9 c
unsigned int b;
8 u2 T6 e9 W: ~* F unsigned int packet_cout;9 j j2 f5 A9 E! y" ]0 E, s( \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: I" o3 f7 M2 u6 J7 m
- m5 }- i+ r+ X! ` Svoid read_MSG_buffer(int *baseaddr);
1 V: v& c+ z" Xunsigned int count_copy = 0;) v7 U* S/ D# x+ K
3 z. c* a5 M9 H' V+ ?9 \5 T0 Vint main()7 n) j8 g! U9 N; l( x) K' z
{
. s: G- i- T! K int fd;
# U% `! E% S5 Z" D$ v0 z4 t int *mem = NULL;
- g' ?! J) Y+ }$ E. N0 b5 s* U5 h
, ]$ U. Z- _8 T/ {- U5 Q! |# l if((fd = open("/dev/mem", O_RDWR)) <0), p P, D) t1 K9 y* L) L
{
c* L6 c" S# \% V- J! J perror("open error");$ q( f" R0 W2 O9 l4 S
return -1;3 f4 s5 a- ]+ q
}8 x6 ?; |6 Y- l p9 v& n8 @
, ^4 C" n* ~5 ^$ z$ E mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" z8 `* X- R; M* @) ^4 g
( s( }! W9 A0 d$ A I1 x while(1)
+ b. i2 A8 }/ C7 V2 j0 ^2 t {
. Z% F' i+ J; k+ W- w2 V read_MSG_buffer(mem);+ s; S1 d6 {- l( d
}
, y& r( ]5 {" {9 f- f+ ]}( R( z8 D/ D7 G3 j2 ?
4 m/ H* l. r7 w9 N8 g) n4 R
void read_MSG_buffer(int *baseaddr)) a7 Y$ M7 C" P! g' _( q ?1 ~
{6 d) ]3 E& H, u4 a2 B+ P8 d
pRX_MSG_PROTOCOL pshreRAM = NULL;, H, x+ [5 o5 I7 \
+ W* i/ ]3 ]4 ]0 e$ l7 N$ ~5 s: p$ E pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 K, m' z8 O# z( j5 T; K" g( N9 @0 A R; l4 T3 Q! v
if(pshreRAM->packet_cout != count_copy)5 {% X& n% L4 K! o" W1 [* Y
{
# a& `6 P$ ?9 t( [/ N( k( V# n* p; } printf("a is %d\n", pshreRAM->a);- ?; x9 q1 c+ L: p5 i# }4 c
printf("b is %d\n", pshreRAM->b);0 }" n3 j9 w M' Z
printf("count is %d\n", pshreRAM->packet_cout);3 T9 W: l) u0 S( [: {2 o
count_copy = pshreRAM->packet_cout;0 V, k; L2 c1 ~" r
}2 n7 c9 f/ x/ @3 E8 A9 u" e9 O3 Y2 S
else- ~5 `0 A J6 R6 w' t% c
{) y; M* t4 t: Z1 e
printf("No effective message!\n");9 }0 T Y8 t' {! e4 L* s. ]" G
}# ~6 y/ }3 ^' u# s
}* k9 T5 k: _. F: c. M7 a
' M+ U0 J' i# J, I- e; d# V6 c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 b r( h$ a6 f( d1 T- @
S3 \8 M$ v/ U0 @, f9 @
2 u U1 x4 X& K& }
% `* J( c5 ]. W o! ]
/ ~" Z, U2 n! [) t9 @ |
|