|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 j4 O7 l2 @* e
1 z" l. f' u! F5 `8 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' I' M, l. f: e% Z7 R
#include <unistd.h>
% q( E% C0 y& H- [. U* i#include <sys/mman.h>
! ~- p8 v5 Q. k6 |( m1 z3 Q/ N- r#include <sys/types.h>/ }) [- ?! `3 ^9 y9 @8 d3 l
#include <fcntl.h>
* ?5 C& i2 P2 v+ p- i6 x. B! @ d+ ]1 J7 i, P1 P) l
#define SHAER_RAM_BASE_ADDR (0x80000000) M, u0 R8 D, n! |
& l+ [, V2 T4 i! U* A$ d9 ltypedef struct$ H6 L: x- G/ x; q" X0 \
{
, [3 n, P# Z) U1 x# s' h unsigned int a;
3 w: ^4 s: F, j4 D9 k6 Q0 h unsigned int b;; e) ^+ b8 V# X& V% I+ t" f7 I/ b
unsigned int packet_cout;
# H1 O9 G1 ~ }6 Z1 ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& A9 |7 r% Q( k+ u4 H( D1 V# j
5 M ]6 v: m) ]( K- h8 t Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! D2 c' O) h/ z+ h: c6 tunsigned int count_copy = 0;
* t2 w* I' W. ]* f4 @4 |+ |! t7 f4 ?% ^
" u: C5 _' i- f& P$ @9 Fint main(): A# v; F2 r: h; k8 a8 q
{
9 ]4 z$ _! r2 e4 Y$ l& Q" p pRX_MSG_PROTOCOL pshreRAM = NULL;
2 B3 C9 h6 x0 i# y pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; d1 v' Z" r, A
5 r9 t: U$ d u
while(1)
& E, r/ V' s; M: I1 F Q4 s {
4 o: U6 ~. {6 c read_MSG_buffer(pshreRAM);
* v$ S8 C6 q6 _; O8 Q( ^ } - P* l4 X, \' y6 o5 m( u
}
- v3 [+ |9 y; M F8 d
9 [3 t' Q! n# pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
F+ g0 X7 e7 f1 n{, Y2 U6 E- z+ d6 r
RX_MSG_PROTOCOL buf;
/ ~5 B; m% O9 U8 v3 h 9 g8 ~0 b: J* w# G
buf.a = pshreRAM->a;" x, V' Z1 E y- j+ v! Y } g& c& W
buf.b = pshreRAM->b;
. ~" u* t8 } x1 S! F. a/ ~0 ~ buf.packet_cout = pshreRAM->packet_cout;! g5 T j) {5 V( F: @9 ~
8 v6 v( |2 w1 R' d8 f" v% T
if(buf.packet_cout != count_copy)! ?; ~. u& b8 c
{
6 T- C; O* A2 j/ k" o7 q0 G printf("a is %d\n", buf.a);% X2 R3 a1 C( ]0 r
printf("b is %d\n", buf.b);; ~6 e2 i3 T% p9 x
printf("count is %d\n", buf.packet_cout);
3 m% g( B: h! T! b% a count_copy = buf.packet_cout;
; G! |& l; W* t7 x% I* b3 @; n }6 _& ^ T3 e& h0 E
else! j, g! p; Q' f& Q; Q
{
; ]: q* M- ~) k) Z Y& ?! v printf("No effective message!");' K+ j3 e5 `' t0 I' z8 w% s0 Z3 u
}
1 r1 s5 f9 P7 F0 _5 i8 T}
. L/ b4 @ {% v- j4 {3 n: W b8 F1 r' A6 K. _& `
" k0 v- Y8 ]7 K; [6 d. T& E1 X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 o$ ?$ G- |* |1 X. P- r使用下面代码,对内存使用了mmap函数后:
; X r8 P/ _: ?) O$ C1 F6 c6 b#include <stdio.h>
7 @. a+ x3 e+ R1 x- Q. M. g; m3 p#include <unistd.h>; p7 h4 r( X1 K- q# o$ M' i
#include <sys/mman.h>+ i0 X3 F; K! w4 [ i# \
#include <sys/types.h>. a, A* Z" y/ w
#include <fcntl.h># ~ s3 Y o$ \1 m6 b. v
9 y8 n5 T6 ?6 ~& R6 r, j% }; a
#define SHAER_RAM_BASE_ADDR (0x80000000)) [+ p" \& n' R8 l$ c o
#define SHAER_RAM_SIZE (0x20000) 3 S; w: g" l: {4 P7 K z
# u; Q1 l y* M1 v4 H6 }typedef struct
8 ]2 d5 E2 `( c/ N. W2 M7 D1 r{2 K4 g N- Y4 w; l
unsigned int a;
w% T9 j. [; z/ _8 M7 u unsigned int b;
2 K& | T3 ^/ P2 O: H unsigned int packet_cout;, Y& ^- W/ p7 y4 \1 ?0 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 ]" G3 l$ O, l6 B& z2 S, a( u; p, I6 c2 ]9 G& X2 E
void read_MSG_buffer(int *baseaddr);
`1 Z9 r& ~6 k4 o* _* Zunsigned int count_copy = 0;3 ?; k" B% E* m% b7 @; I
- `& u0 }3 `1 U- l" }& e
int main()
5 X! J3 M, O: Q, O+ |' ~3 q{' m7 l- n) g& c5 T6 s5 r! Y6 d
int fd;
' P6 \ ~- @! f5 y int *mem = NULL;
" o; h3 f6 c U& H, z. O( O9 y% W4 k, `2 j
if((fd = open("/dev/mem", O_RDWR)) <0)
: O& a' S) \% k8 z {4 _( [- G. @4 N/ A4 B3 E; Y
perror("open error");7 |6 G8 A M0 e
return -1;. l( \) B. `/ N7 Y# Z$ d+ @
}
: V% W, A. K# y- |9 ` , r4 ]/ p9 H6 P4 g# O
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; I4 | A. \1 M* o( U' y1 @6 i
9 V8 j6 _4 q# I/ p while(1)
% x4 `7 G! `: Z0 H" a- Z {
1 U* e+ J) N6 t1 F" { read_MSG_buffer(mem);' q: h/ J" V) N7 e6 O
}
8 S" S5 r* I) ~6 P}
2 j p2 m- ?) e3 ?- N5 H3 F4 ^7 o0 }
void read_MSG_buffer(int *baseaddr)
9 V; k5 v/ v T s: E H{
6 S& |% r! c4 ~+ J6 }2 g* B! ` pRX_MSG_PROTOCOL pshreRAM = NULL;
, G+ b% G0 p- E6 H$ \/ F/ U9 l P+ O7 N0 d" o, v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% B8 Q/ `# g" q7 r( [% ?
: o/ W" ^0 U5 ]/ b5 y9 a, q if(pshreRAM->packet_cout != count_copy)
! ^+ x; S; W: D {
1 f' H0 m! S, p6 X( J; q6 u" v% _ printf("a is %d\n", pshreRAM->a);
D0 B$ F4 l- `/ x5 ^3 f printf("b is %d\n", pshreRAM->b);
! }- ~, j6 ]! s, X! S: l printf("count is %d\n", pshreRAM->packet_cout);
Y; ]: C# U( H4 {+ W" `9 P6 p6 `7 g count_copy = pshreRAM->packet_cout;( G% z, l4 e! G6 k$ r+ ~# c b2 A
}
4 f+ @% Z8 y; t' l9 g, g( L else% n9 Y+ F0 X( d( I$ ?0 @
{
5 q& l0 X% N* U printf("No effective message!\n");
- E7 f( N& u9 F* R8 X$ l6 b/ l7 @ }
5 |/ k. \4 S) u5 S. O5 Y}
7 d' o7 H$ X8 |2 i' U' w1 V0 c
* d7 q; o; y/ y1 i- A4 V1 v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% O" R L% Y6 g# g. B3 j2 d3 l' M; m5 T6 N8 q2 n: r; K
% s: h4 }2 L' [5 m) L6 b" {
' A" X) {+ W' A9 X, e3 e: h4 a, s0 J9 E4 A9 U; x+ q) a: d
|
|