|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. }% Q* {3 F" m0 U! Z$ S# A# @
, r& G2 i; j* n- POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; T7 m/ B7 \" `& f
#include <unistd.h> H g3 H/ B7 D: O4 j
#include <sys/mman.h>! u d; d' s3 d' @3 M1 b7 `
#include <sys/types.h>
: i, r z& }( w0 E, F9 |#include <fcntl.h>, [& C9 B; W1 H( t) U T# a
? O/ m. C5 b* d2 r. L# w+ O; i/ G6 f
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 ?6 k, l/ n6 _9 ?. _3 |
9 M8 v$ `! S' m& ^' u6 v Y1 i$ { Btypedef struct/ N7 W9 J/ O O2 @' z
{
) L# s( \6 g3 @- [1 n: f+ x. u: R unsigned int a;
% `7 V3 J- N2 ^1 f3 {; R p unsigned int b;# A. t; ^7 G r! D; R6 |9 {
unsigned int packet_cout;6 ^% M) i; _/ V' m* V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 v4 ]( G8 L5 z ?9 m' F
% _0 ^9 B1 G5 h2 F+ y5 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 v7 Y6 \& g N
unsigned int count_copy = 0;' Z2 o, R9 n% n6 U% W
1 D7 [% }2 q4 [: c( A8 {, O
3 {2 U/ S" a8 N; z$ o4 A/ i# L
int main()8 i% z: x: U! C- Q
{4 x m0 [ _' [& ?1 A
pRX_MSG_PROTOCOL pshreRAM = NULL;$ V6 L' Z9 y5 i2 z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 E3 w! v; J" F3 H" b( g+ Q
* Z* c& b& B ]( O. q" S while(1) a: z! f/ J: H- p2 A; R
{% w" X6 N, l" M. V' U) b
read_MSG_buffer(pshreRAM);* d, P P% t* c4 X
}
[8 B# Y, m0 }- R4 M}( d4 k& q! A* O$ D6 [3 k
' \2 D% a |* lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' W: p# w+ v t4 U/ P* j
{; n5 \4 u6 }/ S! |6 L) U
RX_MSG_PROTOCOL buf;6 U R2 H% y9 Y7 j, c
/ q8 ]3 c% _8 ^8 w$ i/ q+ X buf.a = pshreRAM->a;( k2 m+ }9 v% X1 L$ i c* p
buf.b = pshreRAM->b; j- H. A8 C2 V& t
buf.packet_cout = pshreRAM->packet_cout;
1 s2 b: w, w0 o; _
+ D( a6 h5 S+ N/ _. j+ {. ^) D if(buf.packet_cout != count_copy)3 n2 N0 [8 K5 g
{7 t4 T5 m7 Y' Y& E
printf("a is %d\n", buf.a);
+ C( B. }8 g% U8 M4 z printf("b is %d\n", buf.b);
" S4 P g8 o5 E printf("count is %d\n", buf.packet_cout);% n. O3 _+ i# M) [
count_copy = buf.packet_cout;/ T7 X* I% \6 r# O- S' h
}6 t# x. X( W3 Y! k/ e
else
0 v3 d) ^3 D* [: L6 T. G {
4 q/ c0 L) D Y6 Q7 o! K% Y0 x printf("No effective message!");
) G; ]5 B. P: x6 m( } } t% e$ ^ g" u. P, w
}
+ V7 y1 _3 |) y' `6 v3 M7 N) q0 m6 |! `, s* y! \% Y% }8 O
3 X) ~0 P+ T; S' b+ B- g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- I$ ^% o7 X, |- S1 W使用下面代码,对内存使用了mmap函数后:
8 I& D2 B2 h) S#include <stdio.h>
; w- G& o2 N7 ?1 p% c#include <unistd.h>0 A2 d9 Q+ U4 O! G2 E8 b
#include <sys/mman.h>
" N3 u A* [" T2 \#include <sys/types.h>% J3 j. \( e; }8 ^: i% S
#include <fcntl.h>& _/ _) f% E* y" l$ Y+ l
0 y5 ]* a' N) |7 n" h
#define SHAER_RAM_BASE_ADDR (0x80000000)4 b- a) ]& ] d9 }7 a
#define SHAER_RAM_SIZE (0x20000)
1 P# a% d- h. I9 q4 S% C: ?0 b8 I. e: Q2 b& ~2 v& D
typedef struct
$ t* u. t4 v' ]2 g' ` E2 v{
- O$ T; b5 ]* e& Y8 D+ _ unsigned int a;
8 T/ \5 s5 Z$ i* N' t unsigned int b;
" N1 ^4 M1 x8 e u' I( t6 {+ [% l unsigned int packet_cout;
- V k: c8 @& f& |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" o: P- n' f/ g% n2 n! Y& ~: ~$ j' l( A
0 J9 x* L) K) F+ @
void read_MSG_buffer(int *baseaddr);1 E) o, k3 X7 a5 q8 S$ Q
unsigned int count_copy = 0;
* V! _, X7 T3 e' B; |% H6 c% Y
7 Z$ ^6 }. I2 R9 T/ W! _int main()! s, i9 b& t l7 o$ Y& }
{5 d* m$ i6 v! a$ y8 F
int fd;6 ~! h. V6 p0 Y2 t' [. X. R
int *mem = NULL;
# S& u ^0 O& V4 ~# m
* k. j) V$ b) J0 s: L if((fd = open("/dev/mem", O_RDWR)) <0)
* N) `3 d+ H E3 j! h {
. i: F& ?- z' s+ |! e perror("open error");% u. @* U1 P1 Z1 e
return -1;7 }" t$ O, v" `7 ]: K8 a$ M
}
; h4 d0 u0 N; x& n2 J ' m3 G/ I, q1 {: e) ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ k& H; A8 h$ j/ f1 h
. E8 ]. e9 `8 s5 G" x5 I/ |' R while(1)
+ ^7 R1 Q4 X2 _3 P. W" Z3 ] {
2 a- S$ }/ ]# v$ z: g+ Y+ H+ ` read_MSG_buffer(mem);
2 _, t; ~+ P* ? }
1 l+ I! F1 e6 `& I}
! @0 G$ }6 O; ~, W$ K, [+ \) O% g$ E
void read_MSG_buffer(int *baseaddr)3 R' ? [. r5 d$ Q/ l
{9 I& l, i* ?* @( P
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 L. l7 Z+ M& r$ B N* t! f. B* v9 Z, g) p& ? @+ r
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 F- M/ w& ]8 \. B# v7 z0 M$ |: l3 c& x: b" P [
if(pshreRAM->packet_cout != count_copy)5 V" M; k/ y, `8 x8 F
{
3 P$ v. A' t7 B* w0 y printf("a is %d\n", pshreRAM->a);
, U* W+ Z) W/ m5 ^) e printf("b is %d\n", pshreRAM->b);* _+ V' o2 q$ u k9 X
printf("count is %d\n", pshreRAM->packet_cout);8 m, J1 f$ [9 K( l( ], l4 H( {
count_copy = pshreRAM->packet_cout;
* r5 F; _7 o9 _# u2 j }, l) p& j: k& s8 P$ V
else
5 c) v: x/ J- s {
2 V( W; C8 p, q3 ? printf("No effective message!\n");0 L2 \0 L3 z- C; X9 \# O
}5 H, D- v: y/ p* [5 {
}7 m# O$ K" d! a
' F% \0 @, i6 I5 }没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" Y- E& X6 a- s, z# n) Y+ l
& U9 w, F, p+ R; @0 [2 z% s* K; ~
* I' i9 c* L/ d2 p6 x
- V! d! v4 Y6 I _# a! Y3 y& c3 N. y0 m$ [9 h
|
|