|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . I1 U2 Y _& k1 n# ]. o
( X) w9 A7 N1 ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 q+ B- g$ W6 L; S- m2 }
#include <unistd.h>
# L( R* h! i% `1 z" {#include <sys/mman.h>
" B5 A. A2 D9 d#include <sys/types.h>2 g2 n3 {6 c1 {& e; g* T- W
#include <fcntl.h>' m8 `; x0 c7 z( |5 I
+ i' L5 ~1 j$ @! q) v#define SHAER_RAM_BASE_ADDR (0x80000000) " G. m$ X; k0 k% a ^" B, D9 P
5 f& r6 z$ k9 v! d, R" ?; l
typedef struct" Z5 {# E/ Y+ |( w
{
* z' T* y- i3 w% |, @ unsigned int a;
; n7 P% K; y9 x1 e: |' s unsigned int b;
& E" Z& g# x% R5 _# G2 Y& ?8 m unsigned int packet_cout;; S7 l& W6 u7 B6 e, U% n/ s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 o5 g3 K0 I/ R1 s0 o3 ?6 i
9 k) W& z/ x7 z9 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 V8 q0 ?" }. ?( y4 V( R7 e4 Vunsigned int count_copy = 0;
- i3 u1 G8 z6 Y4 o9 p: v" M1 s, a+ ]. s4 u+ ~5 w
8 Q) x) B& m6 y) z9 v ]4 }7 Iint main()
+ m0 _* b$ c: ?3 R: o! I{
& w$ f1 h" P" _6 m) k. f- R pRX_MSG_PROTOCOL pshreRAM = NULL;0 ~. a5 P) x2 |0 w0 U! L4 o
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 S7 `" `1 ]; p! j! F
9 w: K) @4 y5 c( N6 X* V while(1)9 h5 {; J/ `1 _) S7 M+ y0 R
{! K# ?3 W5 X1 N7 b. |1 \
read_MSG_buffer(pshreRAM);6 ?. Q' f$ R* V3 j& @/ z3 J
}
' K t/ l- h! ]: l) u" u}. i' q8 |0 n9 T" N9 f7 h
& b6 V2 N" G$ [" A- Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ a ~6 Y0 `3 T7 k
{+ w1 p8 q& G( F% P
RX_MSG_PROTOCOL buf;* K# \0 o! N/ S" l' A' E
/ P" {* J1 i, {
buf.a = pshreRAM->a;9 b$ U# e4 P& \
buf.b = pshreRAM->b;
/ I, i- M% I& ^# J& [: v buf.packet_cout = pshreRAM->packet_cout;% S. y! |% x* }+ j* J+ }& o
* {9 M9 f. ?4 Y9 z% q& n- j4 \' ?
if(buf.packet_cout != count_copy)
1 E, r( R c3 N/ x3 d' V7 } {( }4 ?! N8 T V! M; @
printf("a is %d\n", buf.a);7 l7 z* i/ ?5 f1 `
printf("b is %d\n", buf.b);
0 d1 f- a) O8 p0 {( M! w2 o7 d printf("count is %d\n", buf.packet_cout);) ~, ?5 v1 g8 y2 f4 ?% k2 f
count_copy = buf.packet_cout;
0 \- U) {9 ]& j- K% o# r }
/ }! ?- d8 V: h# d. ^8 o else
* f4 H% e6 v3 j c% U1 y. H+ L {/ x9 J0 B6 T, d6 Q
printf("No effective message!");
9 G( S0 x- g9 u5 t# ?9 F; p }
% J/ _% }% x8 J: b2 j5 x) t1 ?}. r; a0 I/ m- y/ E8 t5 X
% r8 M8 t- b% C/ |, D" ^: E) q. X: k* `! t" i) O( f" c v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- K2 R( R( [! D3 |" S
使用下面代码,对内存使用了mmap函数后:
6 ~# Y+ N! N( }9 o- [#include <stdio.h>
+ z8 \# T [% X& g#include <unistd.h>
v0 k9 |6 X7 i) @0 P#include <sys/mman.h>
6 m( z& Q. X6 y#include <sys/types.h>' m" C8 q" v. |6 X% Q9 [/ d
#include <fcntl.h>" c3 b) R! f. j- N8 n
# U' Y; p+ ]& ^
#define SHAER_RAM_BASE_ADDR (0x80000000)' a5 W3 x& |: j6 K7 v5 _
#define SHAER_RAM_SIZE (0x20000)
" a w w7 u* Z
3 K" F* W' ~, y9 b# c: ]typedef struct
6 y8 k R' M6 y0 x( E# g{
: A! Y, [' Y1 q0 Q8 L: c unsigned int a;$ b( Q1 ? {" x, A9 J
unsigned int b;
9 Z+ N8 n* p E2 Y% i( A unsigned int packet_cout;$ m4 K* {: J; [2 N$ P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 G) |( `8 W! M; @" D
7 [1 k; _2 I# D3 a0 I
void read_MSG_buffer(int *baseaddr);9 q7 ?( x# E3 @# F
unsigned int count_copy = 0;
/ z. n2 \8 ?' W+ r0 a2 a2 _* N6 P4 ^* r2 o" Y5 N
int main()( |- [ R0 O+ Q6 v
{; Q- }. [* [3 X1 \
int fd;
4 B! S4 v/ _7 H f: H+ [( u+ R int *mem = NULL;( u) f9 z# E6 \2 i$ k
# o' x4 K) n( \
if((fd = open("/dev/mem", O_RDWR)) <0)
8 s8 T7 P1 I) X# ~5 T( g {! G9 w& Q e1 v. v% K
perror("open error");5 E) X; h: a' J6 c6 L6 c4 F9 {" T
return -1;( o- u; E, a! B
}: g) h& D- a9 a+ w. h
. `* e" b8 r5 y: J& u" c7 m% s n. V mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 H; a: T v, `+ e7 Q# p& S& V
$ R( p, f Q/ y% \ while(1)
6 J3 c9 [$ H x2 o0 B, t {
7 ^) H1 L1 B# Y4 }! F$ _6 W& i read_MSG_buffer(mem);2 a: N7 J; r1 b) ]. N* b
}
5 D5 ^, y/ s7 {/ a$ R6 ]}: }8 ^% l! w( w$ v. I4 |
9 e* I' R0 O2 V& c" l4 T* d0 Xvoid read_MSG_buffer(int *baseaddr)
% p6 o1 k9 L! e3 X{% g4 c/ f+ p% z
pRX_MSG_PROTOCOL pshreRAM = NULL;( B# F3 ?, w$ j2 h- l
@3 P7 z% w6 p# I0 x/ E4 S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; Y! `8 z5 ?! ~
( O# D1 W2 [: c; F2 r3 z8 X, d+ w
if(pshreRAM->packet_cout != count_copy)
6 F- v S9 r* E- | {
, A# b1 ]4 e) A9 O% Z printf("a is %d\n", pshreRAM->a);
# n# F9 g4 U" @1 @- \$ w+ J) o printf("b is %d\n", pshreRAM->b); V `/ z6 u- V' e
printf("count is %d\n", pshreRAM->packet_cout);5 O4 b0 N x, V y% g+ f
count_copy = pshreRAM->packet_cout;: T3 v- v# r4 ?) C4 x2 n+ b; M
}
- f* T5 L' ?3 w2 ^ else; R: O: t) f" f/ c/ K& ]2 S/ P
{ s2 B; F6 q5 }% w+ \
printf("No effective message!\n");
# r8 d( w/ f2 V }3 X# R# L: t2 ~0 F
}3 t) S1 R* L4 b! M* ^% e9 y j& X8 f1 B
5 d9 `: q; I- x/ P; W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; e0 o9 t) c; G% f$ V
) q4 N/ p1 o, B
4 o6 q- ?0 i" x t) K# Y+ C n d. C; M6 S
3 j' o; [, C0 h9 j t2 K# z: }$ f |
|