|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 G( y# \6 x8 @5 s! ]; N
1 s/ u2 {' F( A4 hOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( h' ~4 Q. L" ^4 F' Q( k W, q
#include <unistd.h>. F! Z- h2 ^1 e) l
#include <sys/mman.h>( @2 p4 j* `: c0 E( L0 ]+ ?+ S+ b, J
#include <sys/types.h>
: w+ r3 ~& S" g: z5 N8 T#include <fcntl.h>' I1 ?- K! o3 J2 T) Z+ s
# D4 ?/ Y" Q5 C( _# u' Z& _
#define SHAER_RAM_BASE_ADDR (0x80000000) 0 d. n1 Z& `1 `1 J4 N
. D- m+ `9 P. g2 v& h; x
typedef struct
9 J1 Z3 ~* j# X$ B* l{
( Q! R2 V2 R/ E% {5 Q. `0 r1 e( Z unsigned int a;( D8 [' E6 ^ n
unsigned int b;( A" ]5 \9 G8 B: f( s% H$ P5 g
unsigned int packet_cout;
5 y7 K+ ~1 j2 l, c; n4 W+ E' f' M, f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 y L8 M. d5 F5 l9 V( H6 W( n' f R5 b2 f; u$ A. A" ]* [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 ]5 n$ j Z& x. s
unsigned int count_copy = 0;7 }1 r+ d+ @( ^7 ]$ z
- E' C( r0 {! C4 G3 t& @! q; U ?& E! R
int main()
; _( C# |/ k5 u4 d" V{& b+ U0 b! M2 s D
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ C, z* ]% M l1 Q6 s pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 m; O0 I0 P6 L# k; N
. x& [/ D- }! m6 _ while(1)
5 Z: Z ]) @1 q# F+ U {- o$ w( y. }$ n- N: b# }! G1 ~1 _
read_MSG_buffer(pshreRAM);
1 f& p. m& z2 L# I: U3 d; O7 o# Q }
% }9 d- ], x2 y5 ?}* o) t/ |# @0 U3 [- ?3 V. a
0 f# y" S; j* p! [- b4 f% Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 a# @0 Z& O9 D3 X X
{
% ]5 c+ @7 R. \* Q) o, n, A& l RX_MSG_PROTOCOL buf;
2 D, B- U' g5 P, w
2 s4 P3 ]9 u8 b/ V3 q buf.a = pshreRAM->a;. V4 P2 t# Y1 o- V! X# Y
buf.b = pshreRAM->b;
( A0 |( G& c ? buf.packet_cout = pshreRAM->packet_cout;1 j) \/ }* m5 D( ^2 e x
0 |: S2 b' n7 `# y1 u
if(buf.packet_cout != count_copy)
Z- x Q/ ^# E {
: Y5 r3 Q8 g1 c9 i+ z. \ printf("a is %d\n", buf.a);' H4 ?4 h( R; d" R2 }
printf("b is %d\n", buf.b);
. g6 n! v6 o. `1 q printf("count is %d\n", buf.packet_cout);
" @! O b) V! I7 i count_copy = buf.packet_cout;0 H3 [* A% I1 _& V+ X. K' y- a* Y
}* f0 g3 @( Z/ V' o. o2 h9 v
else2 M' x3 t7 J' {
{
7 @8 V" c0 K7 g1 n1 m/ l printf("No effective message!");
P; ]1 x" {& A4 i- U6 C! a2 J }
5 L- D6 a# {2 X" l X}
. w, ~% ? ]. M- i* Z2 w
; H; E# ~- Y9 S N; x/ w& i9 w
: u+ E& m$ p! X* k$ _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, j. ]9 |. Z1 A! J7 i
使用下面代码,对内存使用了mmap函数后: u. U$ f6 @) h6 L" Z" B
#include <stdio.h>: I$ \+ J' o' N+ w9 T
#include <unistd.h>
0 F q$ n' Y4 m7 F! s' Z$ }& E) x#include <sys/mman.h>
/ K9 T+ l1 x2 y8 v1 ^$ ~% a1 @) J#include <sys/types.h>
4 c k! J! G6 u$ ~& O#include <fcntl.h>
; f4 S; N' n+ h9 k
( a8 r* \5 t. p v0 |8 O9 ~#define SHAER_RAM_BASE_ADDR (0x80000000)
2 q: p+ [* Z9 ~# C#define SHAER_RAM_SIZE (0x20000) 5 S% C* q0 w3 w8 h9 t+ E
* p- c, s3 F& O4 c
typedef struct1 m) r) Q8 M' N
{
3 w9 }! G3 U+ J unsigned int a;- g+ F' i2 @) G& j' F( u0 k
unsigned int b;3 N' t/ k" E( _( e1 I! k, l4 w
unsigned int packet_cout;
5 b; Y+ I* C9 c6 z3 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 d+ D- j* ~" q, E, b U
0 p1 Q5 R: G0 f
void read_MSG_buffer(int *baseaddr);" m" I! `3 `7 m c6 q \: K3 Q
unsigned int count_copy = 0;- ]2 [9 {( n; i0 c
$ q' x+ k' }& @. |% L
int main()
/ l% N4 r- @& S' ~: S( X, S! ~$ ^4 i" _{: h& s1 x! _3 G5 D
int fd;$ W% I$ E7 }+ N2 E0 c3 ?9 ~& F
int *mem = NULL;. E2 D3 h, P8 A6 }) v
# l" e8 K6 l( k! f
if((fd = open("/dev/mem", O_RDWR)) <0)
2 s/ @% m6 L2 E# f/ N9 [ {1 v+ s9 b6 i0 \2 N/ |+ F
perror("open error");
6 N6 O. M) \& y4 n- a+ n+ t return -1;
2 K6 n5 D: Y8 y9 w8 T a0 F% p: | }' S: J* |" w! ?+ ^; Z4 x2 ~1 c; l
& k$ }! N: z: ` mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ d! [: b5 N0 K1 Q: j$ y% }2 i* j
- ?5 Y& D& g% j X% @' B4 W7 F
while(1), E7 l& T9 e7 P0 h M
{# W7 q2 ]9 Z! M. v! q j& v
read_MSG_buffer(mem);* M# F/ b3 |; c0 ^
} - T9 y6 M3 O" M+ v( ?- A
}
8 T+ T [( a j ]) z! S9 S0 C# ^, [ \" h; o$ m2 Z4 U ^# B5 \% ]1 H
void read_MSG_buffer(int *baseaddr)
: m ~' ^* q/ m: v9 j- u{& x) P4 p1 S9 d: x; T
pRX_MSG_PROTOCOL pshreRAM = NULL;# b' L1 a0 K I$ j2 Y) l o5 w$ Y3 h8 Z
8 ^; _' H3 g, u, o4 v( h( O) ] pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 O8 G# Z8 i* [$ t4 k, e
0 W( g9 n# e1 `: [3 J: }2 t if(pshreRAM->packet_cout != count_copy)
+ j; a O6 |: `" j {
. K! `7 E( ?# v4 A printf("a is %d\n", pshreRAM->a);& G h: ~* ?) a; ~* A' F
printf("b is %d\n", pshreRAM->b);
0 p) D% w5 z5 T4 L7 K# ^ printf("count is %d\n", pshreRAM->packet_cout);& Z- L/ t# o& j1 j" n, Y' d" B! N# P( M
count_copy = pshreRAM->packet_cout;
* c$ D0 Z4 z3 Y8 e( z9 L9 N }+ c1 r: ^' s/ V+ M1 c* f9 z$ |; O
else
; x4 P. H* N8 p5 s# i+ y {
. I' d' w! X, J$ d printf("No effective message!\n");
: S6 I2 F( i: v( m, r+ P+ h6 ?$ N+ t( ~. } }
3 ]3 U* k7 Z! a0 _) t}
+ M- w8 m, a8 ]) p3 H2 J: k- [: i; @
# C+ M1 F3 I0 `没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" g2 c; w* Q f% ?2 ]8 V* x: C. Q3 E- U2 d8 A
% ^5 R; Y8 c: Z. b2 s$ ?( |! d
' k4 G( b9 S3 G' X; w8 `# C9 E3 i2 j' _$ M- y
|
|