|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 H0 C9 d6 W% k& @: I6 k
) B& M: q; F: z7 t, U+ ?. X6 c+ IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 A. i- a8 \+ ]& A( D0 o#include <unistd.h>
+ p0 Q2 }/ C. [/ B) q+ z#include <sys/mman.h>' L. H" l3 E; E
#include <sys/types.h>: l& t7 u. e' |
#include <fcntl.h>$ ^3 S i2 d( a. b) A4 z$ G. F
q$ v4 x, P( E2 y& h% s#define SHAER_RAM_BASE_ADDR (0x80000000) 2 _+ Z6 `) d. O/ g3 q
+ {" G$ p- M( q( t( j; Mtypedef struct
2 H+ _, Z8 x" C: i& u{4 A& b5 r0 `4 k
unsigned int a;) E% X0 M4 m' x) r6 a9 L
unsigned int b;" d. E3 I8 {( q' O
unsigned int packet_cout;8 K7 ^4 S9 S9 S# H/ R' ^( m1 a3 g7 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& ?8 B: U# t) C8 e8 ^% a
0 G; z& [3 l/ A7 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ e" ?3 G) o6 X3 p( l3 T: y( ]" b" ?
unsigned int count_copy = 0;& x6 @' b0 m/ d/ j. o
' H4 V, c: l' y7 L4 M9 z3 {3 j$ B& O5 W# v. L
int main()! F1 L' C' x) c/ Q8 J3 T1 G6 l
{
" |! P. j# w) n! x- h; a8 `" s pRX_MSG_PROTOCOL pshreRAM = NULL;9 P2 H9 w2 q; N x7 A
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ y: @9 q0 ~+ c4 e9 F, ?% P
2 o% e6 \1 s0 T9 r4 S6 @
while(1)
( e6 A* z% K0 r# T: ] { W6 \7 h+ l$ Q
read_MSG_buffer(pshreRAM);
( L+ Q6 a- d1 r$ R: \ } * P7 v' [9 z& s& m
}6 A" ?* m# V; W
: g* w& F- J* D& avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* L& T$ J- z2 R6 k1 T1 h$ G9 Z; l8 A, j( e{
4 W. F% x7 J1 }& r RX_MSG_PROTOCOL buf;' Y- q1 t5 T% m1 Y
g1 T$ p: h; I7 `* Z! G buf.a = pshreRAM->a;% m" d% Q' [! {; T, W
buf.b = pshreRAM->b;4 B: D6 S7 h1 r3 j& F9 W: d
buf.packet_cout = pshreRAM->packet_cout;+ i2 O* c- m G- P2 E+ p. d# \
$ G) ]' j3 _/ V" O, ~
if(buf.packet_cout != count_copy)
* m8 G) M' E$ w, Z {6 ^8 g4 o' G/ d W
printf("a is %d\n", buf.a);# Y& O' U* Y3 Z" r( v. d
printf("b is %d\n", buf.b);
& s% P+ S* O5 s# G printf("count is %d\n", buf.packet_cout);
, P* C+ L) |" L( a3 c. m/ H count_copy = buf.packet_cout;* S+ ]8 f! x3 v7 |5 q
}' z, N0 w' a# K2 G7 v* A& p
else
- R3 S1 L! {8 |- u) M& p {2 n% X0 G0 A) X. {/ s& n: g! L
printf("No effective message!");% C1 E: B$ U# _( v/ t0 N: O1 m: ?
}# N* d' d S& p4 h; W
}
/ m' p. l" A7 Y1 |" o6 y$ E
6 ] C4 S% F. E) ?+ n3 |' `+ ~ G' S4 m3 D% ~, O) S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 Z$ W6 Q8 e. D0 ]1 e- q& _1 U
使用下面代码,对内存使用了mmap函数后:
; A/ R, E% C* L6 o( \! i8 N#include <stdio.h>
) Q" [% |( ~' O#include <unistd.h>
5 j+ ?! M7 l9 o% k4 k#include <sys/mman.h>3 I- k: t3 }' t) T0 F
#include <sys/types.h>- @0 M ~ P2 E
#include <fcntl.h>3 V0 S, F$ {* b! Y5 t; [
- r, M0 L( i3 G- d2 D
#define SHAER_RAM_BASE_ADDR (0x80000000)4 P' N$ ~( J" G. e* R! m
#define SHAER_RAM_SIZE (0x20000)
5 r& Z& s6 E& p) E8 g
! m* I+ p# C3 u- a: otypedef struct: X5 \( w/ v) i; p* P1 _
{
6 f+ e6 h* R; I% g% T$ q: m0 x unsigned int a;
* w7 h; \/ h% a2 K, _3 e& x unsigned int b;
2 y2 y0 `) C& D* W7 P) z: f unsigned int packet_cout;* D1 Z% M! e! V# e6 `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ s6 R1 N w$ K5 c+ D3 `% g
8 b4 |( B" ], jvoid read_MSG_buffer(int *baseaddr);9 F8 i4 s* j+ [- Q
unsigned int count_copy = 0;9 ]+ |; ], p6 A5 d) s: r# ^: q3 y
* R9 r8 F7 w# p) e2 D- ]: ~int main()
* I7 @/ A) ?5 q, G; y/ }{7 V: X" D0 `' t$ b5 P M
int fd;7 v- L, ~2 [! z7 B
int *mem = NULL; W7 B/ y4 y$ r; ?) S5 I' e
& L1 h2 N9 L/ ]: C" M5 g+ e2 d
if((fd = open("/dev/mem", O_RDWR)) <0)
! Y& ^& ]& G0 N; r" U& ? {
, q: U0 Z% I3 ~4 ? U3 s5 U4 t" i perror("open error");# o6 M$ z2 e; z4 v( F6 `
return -1;- f0 A/ y9 u6 G0 n# d
}
7 F; z: X; k6 Y
7 o4 e1 K; G. d+ c, j3 `* k mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( `* p, n2 ?! Z; G2 A$ ^: _0 p" T
while(1)
3 g3 T' g- |1 H2 g8 B {
% D0 u3 q' a9 U read_MSG_buffer(mem);) D' V& o, k4 t, r( y: G9 P
}
! z" O/ Z9 ^2 G' D}
! {2 g' F; N* b: B
1 I% F( e) } fvoid read_MSG_buffer(int *baseaddr) p. g: i/ V: q$ k
{, \4 B3 V% A! S% b9 c& d
pRX_MSG_PROTOCOL pshreRAM = NULL;
; S- ]! | {: S$ i1 a0 n5 B3 `
- h1 l+ O6 F: f7 |9 Y. ^5 Q0 G pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 T/ H& H5 t5 W$ I, M
+ ?: Z- k& d$ V; \ if(pshreRAM->packet_cout != count_copy)) r( {0 e8 h# m) {: i
{: i, f2 R4 h1 W9 E8 [
printf("a is %d\n", pshreRAM->a);& F% v: h k4 D6 Y7 K6 Q
printf("b is %d\n", pshreRAM->b);
: Q) E9 m; c" F" I/ `1 r printf("count is %d\n", pshreRAM->packet_cout);: d; i: X" _: w
count_copy = pshreRAM->packet_cout;- _# N4 d: N: U$ I
}
, a2 o3 B9 ~8 X' y7 r6 l/ K# z else
9 i5 {* Y" w" C {
0 Y, ?* {/ }' K" |) A printf("No effective message!\n"); E0 S6 t! _( a) G
}
; P( g% m" |0 H}+ J8 e3 ~! B6 Q; f
1 {4 w% Z% h- A8 e1 G: R6 d9 Q1 g5 b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; f7 _2 k( q" @& ]! \4 y! d
; \4 V$ }% I! E: V4 O7 }+ r
8 Q4 E" \" b; L& w7 ]: _
3 ^5 _; ] ]1 G9 _- z, ^
/ ~( n& }. \+ U2 e& j8 ` |
|