|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( V% Z0 S Q; }$ C, ?% j4 p: h3 U+ `4 u) |' {4 ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># ]9 B/ G* @0 ~" \1 r1 l4 z
#include <unistd.h> J5 Y1 J( R9 Q( k2 z
#include <sys/mman.h>( R: Z0 @# o( B+ c
#include <sys/types.h>
+ A2 N# {1 \1 U7 U, A" B#include <fcntl.h>' N0 M9 h7 x! B% Q7 S
9 f( x; I4 l+ [8 L9 L" A( |! _
#define SHAER_RAM_BASE_ADDR (0x80000000) ' P. [: y. }* O3 }; A. O
/ F: m% u& t! {& q7 x
typedef struct
" y- M, `0 j: g( f% e{9 ?2 Y( x3 T3 Q$ P4 y
unsigned int a;1 K# f/ T9 _0 r% I" V) c4 N
unsigned int b;
# A( `& A% O3 j6 H; o5 D5 B unsigned int packet_cout;
1 i. c+ Y( ~8 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; Q: @% J( V s1 ^( b5 L
1 }. R) \& ]) a/ c H5 F5 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
m* \$ r3 @8 k7 C xunsigned int count_copy = 0;7 }5 a6 {+ q/ x( ~9 ~7 n% a
- \% A/ S4 k: Y6 J2 Y; m( T
! s3 T. g' Q1 `2 O6 K
int main()7 D1 h1 z$ ~( L' H" D. s
{$ ^$ t8 x2 I. e! h; o" j" p* r: o
pRX_MSG_PROTOCOL pshreRAM = NULL;) C: a- _' Q. [) W! [
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# l8 U: x- S5 J
0 d$ Q6 }$ E1 p( Y) D- E0 @ while(1)
- t6 V5 g, I5 o3 n$ ^& u {
9 G+ `7 I* [, D% o8 I read_MSG_buffer(pshreRAM);% b( B( C8 J( H- ~, P% \8 i' M5 {! }
}
; A u/ G* {; r5 S* n( P1 Y}, r7 O; l) f ^7 v8 y; q; v
. h0 r, r7 A( H9 a' avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ m3 m$ A& c3 }/ m2 T- W7 B- v
{
# u. n0 R, M) a RX_MSG_PROTOCOL buf;
3 S- R* p6 w+ Q. n( Z! a: P8 I
h+ T4 z2 g# ~3 L y buf.a = pshreRAM->a;) e$ W6 l$ X! V0 k
buf.b = pshreRAM->b;
1 f; n( [- I3 U. U- L. \3 b8 z' J- Q buf.packet_cout = pshreRAM->packet_cout;
5 P; _' A X1 P* x3 O/ m, [ 3 N1 P. J6 M- V- y& p; v; i
if(buf.packet_cout != count_copy)
4 W4 N3 H; _4 t9 D. W7 N9 m' U$ P {
1 e1 \: \+ F8 k: }3 b printf("a is %d\n", buf.a);$ g+ }( G9 w( U7 ]% }
printf("b is %d\n", buf.b);
* F$ k- V9 k( D4 Q- v printf("count is %d\n", buf.packet_cout);8 M! L, _3 c0 m+ k
count_copy = buf.packet_cout;& ~* f# Z; j6 \5 p$ O; g# `
}
) P0 l+ X; d0 U+ F2 n3 i else% e8 J$ ^3 g: C7 d. Q2 v! w3 b) W/ c0 j
{1 x% P4 r! D. y
printf("No effective message!");
1 V) m& G) C6 i% \) H* {& E }% X% S3 V, S! i. g* \& k
}+ o& _3 N% T+ _1 N
2 q9 }: f; A | E2 q% m1 p$ ?
6 ^' S" q$ T, p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 S- C6 q s' l7 [& V, N' O. V使用下面代码,对内存使用了mmap函数后:/ H" |7 o. C+ {: w$ f
#include <stdio.h>7 n+ j$ v& A; Q' `# E7 b5 l' [- w% e
#include <unistd.h>. z) ^8 G9 `* W& w3 X. r
#include <sys/mman.h>
/ u2 h ^5 d7 x& l1 \' m+ Q#include <sys/types.h>$ ^1 P; u! b0 H) V0 v0 g2 K
#include <fcntl.h>( L+ n2 m# y* w
( B3 p! r, X! C& L& X; F* @#define SHAER_RAM_BASE_ADDR (0x80000000)
% ^4 v3 T5 ? v: ^7 I" G& i#define SHAER_RAM_SIZE (0x20000)
8 k" S3 l: s+ K9 b8 A! ^# [: ]" h0 u# W! H4 W: \; K
typedef struct
0 e. m6 M3 f+ S" ]{6 ?4 {8 W4 ]6 Y' p4 @, s9 r( w5 I
unsigned int a;
0 P9 K3 J6 K% [5 Z& m unsigned int b;5 @6 K4 p( L- Z* C
unsigned int packet_cout;
5 t1 w; a3 V( I% K/ R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 @ T4 w7 {8 I& ]0 {
# @) K3 I. f8 a+ z7 l2 y) z# c$ Qvoid read_MSG_buffer(int *baseaddr);
2 J3 J. D" L) C% k( f$ eunsigned int count_copy = 0;
; n z# r K/ K( |# J# i
" H3 S6 g, t" S8 @1 |. g$ Z6 h/ X1 Zint main()5 E7 {; n# ?$ t8 }! L0 k( t; s
{: N: V* v. M. A8 g, h5 f
int fd;
* s8 |) r6 F1 q6 y int *mem = NULL;
# |9 W# c: @ r1 i6 `, T8 H
3 Q, ^9 _7 J5 R& X if((fd = open("/dev/mem", O_RDWR)) <0) `, A: W% A5 l7 u% |
{
+ ~1 z; l$ Q6 ^. J# i' e! O4 f1 s# ~ perror("open error");
3 C8 a! M" v# W1 f7 n6 z return -1;9 L) ]! n9 F* o8 a, f
}! N7 g5 {6 \. t' I
$ z1 r7 T g, J
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: F% e& M0 c6 X, f3 h' h7 Y$ D! @3 D5 s+ `4 s
while(1)
2 \3 B! ~ {. z5 t4 D' d' [8 j {
# |; ~/ q. [* v read_MSG_buffer(mem);" y+ h! f5 m8 N- Z# k: S! d4 c3 G
}
0 l$ ~( j D& a! c}$ z- A6 Z" t8 `
0 l0 B& ~5 W7 i; G( _5 `# @
void read_MSG_buffer(int *baseaddr)
2 P3 X9 ] A/ z4 c* |{
& a3 ]0 P% X9 M pRX_MSG_PROTOCOL pshreRAM = NULL;7 V9 G* z; U& l# o
# n& w. P" S' \7 y7 ^5 O& f pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 W9 h: B) E2 U0 M/ V! K
/ m$ ^2 q& _( Q; P if(pshreRAM->packet_cout != count_copy)
9 O& [- z4 a! Q {
6 e' L: a2 R; {, t8 |1 {' r3 Y% {/ K printf("a is %d\n", pshreRAM->a);
5 Y/ a4 {. I9 V* r7 `) J printf("b is %d\n", pshreRAM->b);# D& l# D! a, N9 k: \& w
printf("count is %d\n", pshreRAM->packet_cout);0 n# G- a9 T7 c- T
count_copy = pshreRAM->packet_cout;# }4 ~% ]6 S9 u: x
}. T2 q) [- U5 c+ p
else
* D+ P2 W) ]6 E: k$ a1 i1 t {
! s# c8 w! k8 F1 |9 t printf("No effective message!\n");9 g V* C3 S! Z2 O9 S
}/ E4 T* b; r: v# O( p
}
- \7 ]1 N/ U1 i ^" Q8 A' n2 _: r; R# Z B* O7 \
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! l3 ]) Z0 k8 A
5 H9 G* {# U! d0 A4 Z
/ J2 r2 n/ x, [6 d) }2 X
: K/ A0 s: e0 a( d4 s
# x; T9 I O3 a5 U% O
|
|