|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 c4 ~4 t" @# W
( K/ I. C- E1 ~3 [9 T( `9 WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) }( }2 S2 Y6 _* g5 R& S( J
#include <unistd.h>/ O: h6 |3 U: b/ v" D
#include <sys/mman.h>" i3 w% g/ j V. L0 L5 F
#include <sys/types.h>' w0 J8 H0 X) A) c7 h2 a
#include <fcntl.h>
+ C+ L' w2 |/ a* R* }9 o4 t' _) L8 m2 C; h5 l" V- P$ t1 Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ J0 {4 {* i( v- Z9 U2 U( Z# o$ ]' s2 f" D+ O8 ^: S6 d' u
typedef struct. A9 o7 L& G, O. \& x
{
/ H, P0 |; y- ^7 \- H( J( o7 L unsigned int a;3 U- q; r! [5 A& s0 x5 |8 c$ I1 W8 b
unsigned int b;
5 {8 A3 Q- b* N( s unsigned int packet_cout;
- N. W. d' }1 c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) T4 |+ X% m$ d* z6 j1 I
7 I0 @& R. d9 }* z: j0 ^- I+ k, N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 k- S3 D, S# E. runsigned int count_copy = 0;
- O- M0 ]3 |% `( ^/ I9 A. w) `. ?6 _ D# t0 n; ~5 r
3 G/ @* U8 ]: ]+ ?/ Bint main()4 |! P+ M; f- A/ ?
{
! ~# m5 o/ H& C- G8 t0 D7 C% v W/ F pRX_MSG_PROTOCOL pshreRAM = NULL;
' \2 i6 h9 F/ K6 c4 K pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 Z9 [. G9 b: K9 q% A5 a9 ?( M' A3 ^$ u
while(1)% |4 ? ~6 I* } ^; W
{
" A& S, k) h. Y: w$ H, K& t" i read_MSG_buffer(pshreRAM);
( W. A Z% {# s; n7 s3 O } 7 g) s T+ h/ _
} m# K3 i& ? t! {. H
; v$ C0 H+ r3 r& t0 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ Q+ J% p* Z2 p( Y* u. c" M
{" l" ?# t l* ? s
RX_MSG_PROTOCOL buf;
6 q- ~8 {- A6 S- u" h! w0 a / A- U# C1 x* H; e, X" q) g
buf.a = pshreRAM->a;
4 D" G$ l3 E+ l8 I6 D6 I- x/ l) C buf.b = pshreRAM->b;
# l. D/ v q. \% n" x buf.packet_cout = pshreRAM->packet_cout;+ Z: F1 r. n/ C: @5 V) X: `: O
8 X4 U$ u4 g. R. |" L if(buf.packet_cout != count_copy)
" T) d. {% b: n' a$ M+ |' R {7 ^/ e! d& Z9 u+ h9 _& H
printf("a is %d\n", buf.a);6 i6 n1 j5 I1 j$ R& I
printf("b is %d\n", buf.b);
l0 M3 A2 M+ K( G0 [ printf("count is %d\n", buf.packet_cout);) d0 j8 B5 z% A% R9 H$ s# F1 U
count_copy = buf.packet_cout;
4 ^7 q. p1 Q2 F; G7 o' ~ }+ n$ Q! U3 ]0 X( ~6 y+ V4 V
else l& T* a7 R- S) E8 ~! @
{% m I" J0 q5 {; o, q
printf("No effective message!");
) @- }4 V" b3 _ [ }% d ^+ m0 n% N
}' j1 D6 s8 J% j& X" }- U$ c
# o& C4 D8 `/ q$ [1 o% E8 [# y1 h+ Q1 |8 [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" C7 b3 K. ^2 E% ]) `* w# W
使用下面代码,对内存使用了mmap函数后:
" K" y1 w/ Y3 [' ~( o% e/ R#include <stdio.h>8 e$ K! P+ `8 t6 h
#include <unistd.h>
) T5 f5 j( B: b: o( W% f6 S#include <sys/mman.h>/ |% X$ h6 j% G
#include <sys/types.h>
& K3 m" }. R0 E3 o#include <fcntl.h>* F! B- L2 U4 I* L( O ~: r
" D0 }% l! @* W9 B( A# G. l#define SHAER_RAM_BASE_ADDR (0x80000000)# L6 p( R( G9 |' l4 n1 K! \
#define SHAER_RAM_SIZE (0x20000) 5 S! s3 m) a8 ?: x2 \6 }) `
9 [- l" S* b& m f/ }typedef struct
) ?& {4 P, z3 |1 Y8 i{; v k. N1 Z3 t" Y
unsigned int a;
8 X2 y- u( E" A6 e unsigned int b;
+ R& j- q7 z( n8 J! y3 v unsigned int packet_cout;
2 `) F! S( T& T- t+ Y/ ^. q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 M% y2 J @4 }; ^2 M+ A% v. M
* C$ X* }. r1 D8 O/ F& C U- _void read_MSG_buffer(int *baseaddr);
$ ~: I8 ~& Q$ E6 E: ^+ cunsigned int count_copy = 0;' J1 g' E7 r' V
0 ?: F1 W, j$ n, K, U, Y! P4 Lint main()7 J' [% g; a: n% c" ?: R5 T5 U) Z* _2 \
{# ^0 j0 ^2 G) q2 ^4 @. s
int fd;( J. t; u+ M; _8 F( ]
int *mem = NULL;% t2 Z( w/ c7 R! q$ [) }! K( B
: Y5 W1 J0 p' p, V if((fd = open("/dev/mem", O_RDWR)) <0)
1 P0 G t4 o5 ~" \ {" I. _. @' b) E
perror("open error");
; _( h/ S0 y! G" H$ [' t4 b return -1;" t P2 f' D$ P: C' K% p; O
}
; C6 G* R* \8 _' m
4 B1 ^6 M/ w. d' d9 I: g. w mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 ~. M. ^) m6 \3 Q4 r- q
) C9 }) Y$ C+ H4 p
while(1)) E- E6 a- ~* S0 V% @: [
{
' O2 }! L- {7 [5 L" r1 `9 L& J& B read_MSG_buffer(mem);
& S% ^- ?- ?4 j! ?! q7 D9 _ } " c; q) ` p+ q5 T; W+ U% j, d% l8 Q
}
: J0 a* T" w5 I4 N1 H, N. ]# b+ X) z" J9 m; k' Q
void read_MSG_buffer(int *baseaddr)3 X j' e7 i, e8 m# W
{
4 b6 p" F) j& `7 v) J8 ? pRX_MSG_PROTOCOL pshreRAM = NULL;
) b: x6 ?5 n/ M: L) a+ E5 `" {+ ]4 e: h
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 @) w" S& s# D- E* A
4 e! q) [: n$ [3 `, E% X if(pshreRAM->packet_cout != count_copy)3 H8 ^ ]: K/ m( Z& Q7 H7 K6 Q
{
1 w7 Y% A& k; I$ @" M' f printf("a is %d\n", pshreRAM->a);
' x0 q- y, p# X2 c printf("b is %d\n", pshreRAM->b);" X1 ?5 H( F5 R8 K Y/ J- p
printf("count is %d\n", pshreRAM->packet_cout);7 g' a- ?- h3 t8 G
count_copy = pshreRAM->packet_cout;1 n O" w6 w$ ]% @
}7 h) P9 u: X5 [ a0 @; C
else
# U, v! n2 r @$ R2 H {
- s: r; i+ W9 Q' ^ printf("No effective message!\n");
0 v, y- z2 x5 i+ r' o c8 U }
* @& c/ C) X5 Y$ m}, ]1 ~8 b- I$ `3 u+ F Q% G
1 Y0 l( X% G% K; r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 G6 g# @, ~4 O/ [7 R$ _3 m: L* v
* n1 e% g: o) x
' ^* c4 m. E* G+ K* S% `2 ?' Y
+ P. e$ Q( V" n* J( D% R! [' f6 b2 l# G- O
|
|