|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 \6 |% X1 r$ ^; z
- A. @$ ^4 n: \& hOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ T7 I9 {4 ?/ U, ^, r: Y8 A#include <unistd.h>' W5 e% d5 z& U* f. ?: w/ N" B8 t
#include <sys/mman.h>
: z. I q( l3 _7 K- v9 E; o#include <sys/types.h>1 M' P: y' g5 n
#include <fcntl.h>3 i5 C" ]: H, M3 t B* f. W
7 u' G, _" ~5 E0 j#define SHAER_RAM_BASE_ADDR (0x80000000) ! o8 P' u% o7 W, ^, j9 B
1 t. v) |% I' Ntypedef struct
. b8 o+ S) M: m4 i" j{
" f& b5 K% G f unsigned int a;, C9 i E% Y' V+ z6 J" Z
unsigned int b;
# X$ @2 z% `: V* {5 P unsigned int packet_cout;1 \- _, J3 B& E' ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- ~: r* \$ o% H! }" [( J8 i# b4 F% @' u! e6 y: j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, \, I) } C" \- i1 ~/ w3 punsigned int count_copy = 0;
& J$ i$ I$ b! n) |8 O
4 L. E6 n7 n& T P1 ^- o: e) q' ^3 ?! `: b# K6 h$ d
int main()
- K. E) i _9 X! C. O8 S{9 I. H6 J& r* ~* Q9 `
pRX_MSG_PROTOCOL pshreRAM = NULL; L0 s+ G2 Q; @: Q: G
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* W# S! i* d% W9 H/ q) S5 e" R' k
6 g$ _# @7 h2 c; _ while(1)1 o9 A$ S% m; E1 b% ]: y8 p
{( V. T# X3 y0 e- e6 {. b
read_MSG_buffer(pshreRAM);' \7 t" G9 V; Y. J# _: W0 w1 C t' J0 C
} 2 U3 |- U$ c4 x: G) @
}
3 Q! W, _ D2 r3 c" X: s# R5 O a* B1 F% \& i3 w$ ^) N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 q3 W$ g- B) C3 g7 k{5 e* d( z: ?+ q; X0 V. L& y7 J
RX_MSG_PROTOCOL buf;
/ R& D+ Z1 h$ ` ) q! _0 }# K/ n# H! @5 W
buf.a = pshreRAM->a;9 o9 I9 p* n8 T; Q! r* O3 D
buf.b = pshreRAM->b;0 S# A1 g4 d0 j
buf.packet_cout = pshreRAM->packet_cout;4 f8 u& S: O$ V, K8 y2 Z3 x0 J
, h, [: `- A; T4 m if(buf.packet_cout != count_copy). p/ ]! ~; L. ]+ b5 i' P- e
{" D' _/ K2 ^0 f3 c3 T
printf("a is %d\n", buf.a);1 U4 O0 e8 H' G* s7 r
printf("b is %d\n", buf.b);! x# J2 F3 P) c$ F4 b/ b
printf("count is %d\n", buf.packet_cout);
* {# ]. G/ z! ~# H: K count_copy = buf.packet_cout;
2 M/ _" g7 ^7 M1 [ }
* W" y( k( R3 c4 h: ]* [) v7 ] else( e5 n$ l- u. S6 @4 Q l
{* l0 W3 L1 r3 V. y N+ Q
printf("No effective message!");: X* y* W' r% X# g% i& s
}5 i" `% M, b1 c4 {( }, x: l4 Q
}/ ]. S/ l9 m! g
$ \) F$ i+ |3 N! V5 ^# |% f
: ?$ e# X' i2 u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 G6 V, ^0 a9 t/ F0 L
使用下面代码,对内存使用了mmap函数后:1 C8 _/ |8 j' j( q4 ?0 i1 X
#include <stdio.h># ^- E% c, @) g% r+ |! Z
#include <unistd.h>. M' {& m0 B! g/ J" G3 ]
#include <sys/mman.h>5 ^2 ~, H0 n) s0 ^: | w! t+ ~
#include <sys/types.h>
$ \, L; a' J+ C( E$ q8 c% b+ n#include <fcntl.h>
3 X2 I/ x6 b, _" m
1 B3 y7 G# B, g7 v) L#define SHAER_RAM_BASE_ADDR (0x80000000) E+ s( W) B7 l
#define SHAER_RAM_SIZE (0x20000) ! |$ t$ _* n8 M- E2 N0 K; r% F
1 [' K8 C/ _6 _; x9 etypedef struct
/ Y0 F4 o1 ?( L% x{, ^ v. s5 Q: }. g' }* @
unsigned int a;
0 e) w% k/ ?0 U. s3 v' ~ unsigned int b;
- V1 ~1 }+ Q2 x4 ^" N- v unsigned int packet_cout;
, U; ]2 |# ^) J* }" h' }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; l3 R& |6 y+ T; ^) V
- z; s6 a5 H! v8 B% ovoid read_MSG_buffer(int *baseaddr);7 n* t! S1 S7 z) } i
unsigned int count_copy = 0;
* p" ] r0 J& q6 X! v+ Q; t1 W! M6 I4 G6 n
int main() d4 h' s7 t7 q {7 G1 t( O
{
# L# M- B% A8 p' Y1 h; r5 N int fd;
% u4 V& @, u& s3 v/ w int *mem = NULL;) I& ~* C2 x& d2 U; b# H
) _9 _0 s& J0 K; ]$ B1 k if((fd = open("/dev/mem", O_RDWR)) <0)
1 F; a* D4 V& I {9 | X8 z/ A( `7 N2 l
perror("open error");
+ F! i) w/ ?0 T return -1;" b9 O9 w* g3 C& y+ P9 S0 X1 O9 V8 L
}
* X& F/ a/ I( V* N3 {4 T, ^ U : m* J6 h; P* G" O' P! ]
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: z6 z8 c9 Y" B+ I
0 Z4 l$ J. ]# ^! k" `
while(1)
8 l X' J* e/ [5 n6 n- T( a {
|( d- F- x' [# f read_MSG_buffer(mem);
% [3 D& M. l2 U, O* |% x }
+ ~( l' J& K+ ^8 M, S}: v# D! x s6 I* D U0 f
# t8 @; m |" L: k, M3 Lvoid read_MSG_buffer(int *baseaddr)$ p( O" f( U4 j4 d, W
{; b" |6 ~3 k0 w* R* R! {( `
pRX_MSG_PROTOCOL pshreRAM = NULL;
. Z U5 Z Y; t& h' Z* I" `; K# e: p; t7 k ?# N5 E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ S5 j) R+ P( r4 H5 G
; H0 ^/ F6 \( T if(pshreRAM->packet_cout != count_copy)
+ T5 h- n: P0 C b j; {: w {1 d- F& n1 a/ A8 Q4 r% V
printf("a is %d\n", pshreRAM->a);
8 S* l1 ~" n2 L) a+ {6 L$ A printf("b is %d\n", pshreRAM->b);5 C, p( H$ k2 |9 E* r; h
printf("count is %d\n", pshreRAM->packet_cout);2 U# H( u0 U, H
count_copy = pshreRAM->packet_cout;; b+ N0 `. ?) P, D
}" C# B8 Q% K; v6 Y1 d! J
else
6 N$ [4 r' S3 x8 l {5 X, ^0 @8 l- b/ _- B$ X
printf("No effective message!\n");* t7 M$ z0 j' k
}6 H% P3 O- p. i$ u4 u. i- @; ?
}
! O. A. J* r1 X9 W# ~/ _
& u# ~9 T4 w g1 y1 W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ W; ^5 H: n1 F* b- U
3 L8 e b# w4 W7 T5 a% f4 C0 |* x2 ^
* b" m; F5 h Y T
9 k: q& _9 f* q6 @$ M3 h
|
|