|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 E* D1 m8 ` O; c# v/ e" g0 P) x) @/ V5 X" U) [/ K4 X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' n6 G) ~6 y! v" m8 l! Z* ]0 A
#include <unistd.h>: c1 v& ~3 ]# l% D% b" L* C: U
#include <sys/mman.h>
1 k3 ~. M* k% b% ]8 b#include <sys/types.h>: i9 O5 k! K7 c; i+ o* J& w. V$ Z
#include <fcntl.h>" l1 B2 `& C* i
+ \3 V/ d8 x: i* d% T# Z
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 }2 B% q, K" d9 H
8 j* W; \! [* M' c# Btypedef struct& N- P- `7 `) E5 v: M a7 \$ ?* f
{
& M" Z9 R: N/ o1 O$ m4 a+ ] unsigned int a;" e# }* j" y7 r- W
unsigned int b;
I) g: q- b) P/ l unsigned int packet_cout;$ d# [6 W1 _& b% a6 N9 E, i" d& H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 l% ]* K7 q6 _3 x( y- ^% x
4 d0 m- M9 @; _# @. kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 u8 k* g: e: A/ s5 K+ ]2 F' k
unsigned int count_copy = 0;
0 t& S6 K. u1 |2 x2 C" d" q- G4 J3 s- r8 h- \
0 e5 g9 ~* s! fint main()
1 T2 ^' J4 f; t9 o# E/ T{
9 P+ {' q/ e2 ], Q$ B pRX_MSG_PROTOCOL pshreRAM = NULL;
, G8 V% r3 \# @# c pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( g+ N- m4 z; G5 k* g
% p. h0 ~7 Y" `/ y
while(1)! u; y& L# E* a% _
{
0 d/ K6 K8 ~: T7 y Z5 I6 e9 U8 F read_MSG_buffer(pshreRAM);
5 u- _9 c8 W! l' p6 O4 L } " i4 `3 W. L/ Q
}7 O; f* q/ x; S. `
: F( g/ g' f3 P6 u" @& M$ pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% w7 N$ U: D! X" }3 b2 X- |! e% [{7 L' @ Z% h4 Z6 Q' t5 m- B2 r3 d
RX_MSG_PROTOCOL buf;* p, Y8 l" m+ J! I! d, e
, H7 @ n; S+ ~1 {4 f9 A0 |7 ]2 S buf.a = pshreRAM->a;
$ m4 g; f* Q. \- E buf.b = pshreRAM->b;
- w, s0 G. \8 Q# q8 S' I9 ?4 t buf.packet_cout = pshreRAM->packet_cout;
5 n% F3 q1 u3 ^! K
- V) g1 C$ H4 w* X% ~6 p if(buf.packet_cout != count_copy)
0 z; Y5 c v J/ ^: l {9 w: X z! {8 s7 k+ l& T- m
printf("a is %d\n", buf.a);7 t* k F' D, m
printf("b is %d\n", buf.b);3 V8 c- M% B8 Z
printf("count is %d\n", buf.packet_cout);
4 u/ r( x( P: p' V& T* h4 M4 n count_copy = buf.packet_cout;: ]4 o, h/ D& h, O( ?
}' [/ l# X& \( _3 M1 l# W$ }
else
9 b9 r/ W0 T, J+ k; n& w2 X {! E/ B4 N" }6 g: g9 c! b
printf("No effective message!");( b( y7 L9 w5 n$ c6 V
}
& W$ f9 b% U+ b) ]} u6 b0 V* u6 ?* h$ U0 k! w
1 D d5 w4 i( r! J9 D
) i9 `; U3 S7 a& E3 j% q' [2 Y- S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ a; ^7 D/ o! B" G. W+ y# S
使用下面代码,对内存使用了mmap函数后:
' T2 n: L: z7 A" a: v2 d#include <stdio.h>: ] z( Z* `6 U; ^7 F
#include <unistd.h>
. N7 M, N6 Q0 j% Y6 l* E6 `+ ^2 p' \#include <sys/mman.h>
& V+ `- j0 m2 v6 ?#include <sys/types.h>
3 i3 B; z$ Q4 S#include <fcntl.h>8 O3 x2 l$ z0 J6 h/ r# g: E
3 h0 P( P& [& x1 B
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 y: \1 B% y* X" j0 b: m#define SHAER_RAM_SIZE (0x20000) 5 X1 b. G K0 c+ w$ g2 V9 Q% o; @
6 @. P: {$ }# y( E8 h
typedef struct' ^' u4 D U N7 z( p- w R
{$ H$ L# W. u, t5 g
unsigned int a;
+ P+ V$ B; K. u8 z) ] unsigned int b;; p' e7 ^9 d/ C. t( N; _
unsigned int packet_cout;
2 T7 M" s( s+ o% N# \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. m: P: a% j) A `6 t0 d+ ~8 M
3 ?4 ?. D* J% r" d6 c3 c) j$ ?2 Svoid read_MSG_buffer(int *baseaddr);
* I& g. n6 r& i) p0 D% \6 Z+ {unsigned int count_copy = 0;- q- K1 l% T l _
|7 F2 `! l1 [$ C, U, Oint main()1 I. ^% ^+ x# m1 v2 y7 f
{4 b# T" U: ~ L0 O+ E' c5 l
int fd;8 L5 f- P% G0 l ]) \; ^
int *mem = NULL;9 J. R/ m' J3 L; P* {
" \: k3 ^/ @7 ]- r* q9 @& ^ if((fd = open("/dev/mem", O_RDWR)) <0)
3 r; k X" r9 n1 ~8 m T1 o {- y- x/ C4 `1 e
perror("open error");
9 Z: `6 H5 A; ~, v3 e8 J: R return -1;
; [3 F* D1 J! ^ }5 n9 i2 B1 M* j# S2 ~0 u. o$ w
: p$ k5 q6 d- | mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' c/ V% f' O3 P6 T5 F
% O z+ s7 Q E# H* x* ] while(1)
) Y/ Z+ S4 m+ H# V9 e8 [# F {. Y3 i9 J4 N! k0 s
read_MSG_buffer(mem);
* `" U, j# T+ A& P( u# ^ } 3 j0 V* ^& _% F o
}
: j7 b! M' a* \" R' C- D) V
- D/ D8 Z: w! y8 V1 U/ r8 Zvoid read_MSG_buffer(int *baseaddr)
$ X2 j9 j% m+ M0 }9 V{6 e/ {* E7 p6 A
pRX_MSG_PROTOCOL pshreRAM = NULL;8 x% D: k( L5 z" z4 z
& z7 B) Y( e1 a) h
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 v* H" a2 p% f& C3 P- i! S# |
- s; Q& [: D6 B+ i/ \& z: G7 h
if(pshreRAM->packet_cout != count_copy)
- f' y/ L- N) G: G( V {3 r5 \8 {! _/ I; D3 y6 F
printf("a is %d\n", pshreRAM->a);: Q3 E' A9 [$ E. ]
printf("b is %d\n", pshreRAM->b);; k, Q1 b( n. D {6 w1 g K
printf("count is %d\n", pshreRAM->packet_cout);# y% S( k# t, O/ f* R/ N9 p
count_copy = pshreRAM->packet_cout;
# E0 ~2 f O' H) z }& Z7 D$ r; q2 ^* [- L
else
/ V7 Z l3 }) K' M1 p/ `. o3 s {3 |: u* R; e7 g' M
printf("No effective message!\n");/ A7 q; ]/ C2 Q5 e
}
! E& P1 B) x# F4 f- [}
& O( G' W* K8 f. I Y. x2 O4 j% N
* ^" I( l) B; h/ Q7 r6 I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 v3 q3 b6 Q8 p3 W' f: K: Y) ^
6 u1 B- y- z2 l( V, Y
) _! O; Y! R# ^0 \9 K
L+ S) V+ w5 D" ]3 i9 Z
$ O& }/ \/ o% | S% j2 p& [5 a/ l; |$ I |
|