|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 L' g6 R. L0 n9 z' u- K
: O9 f( a; r* i) JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ o8 R" T( P0 P
#include <unistd.h>/ y0 Z, S! [6 R1 Z- ~5 Z* f
#include <sys/mman.h>
* S% ~3 I' X% Z4 r9 [$ V9 g( B+ X& f#include <sys/types.h>
/ f$ h6 u( v' `8 O( t1 C$ L#include <fcntl.h>0 t. i( G* Q8 j9 K
2 }" m- _ C I. Q2 `* b#define SHAER_RAM_BASE_ADDR (0x80000000) ( I; t4 Y1 X! n7 v6 s/ \7 |9 K4 {
6 l' N( Y. \) @3 utypedef struct
9 N& v+ ~1 `* F3 m5 ^{
' g: {/ n& o" a6 X unsigned int a;* {$ D2 o7 [" F+ k! ^. b. k* l
unsigned int b;' b% B3 G5 D: {1 e& p) Y4 t ~
unsigned int packet_cout;
. {* s* s7 n* X, P; F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 H* v/ F I6 J+ Q5 i Y$ C4 s
0 X- U7 r/ S( N8 N8 ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 U4 |& Z2 D3 U/ c; U$ d$ { U: I
unsigned int count_copy = 0;* M7 j# p. H2 m7 S' G6 t
/ n. p3 r. h7 P1 q/ A8 n
5 p' z) b7 o" s9 D5 ^9 k3 Yint main()- o: {' I3 `7 P" z( x4 D1 E+ q7 x
{
1 K: F C- m/ D- l pRX_MSG_PROTOCOL pshreRAM = NULL;/ h: Y5 r+ ^! m9 G g" _7 ~* \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 ~+ N; q9 k. u7 I* |! A* i
C0 K. t& m, S3 ] while(1)
0 n4 d* E+ K5 {# p) O2 X {
/ Q* b; F+ V% S8 P# c: F# y6 _ read_MSG_buffer(pshreRAM);
0 e% k) J' v9 E+ _ } # a6 t# v9 l- M: J! s; M; K/ n
}( Y5 R% T9 s1 |1 O( E
8 q: K1 a! y& n# z/ N0 ]) v6 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- G) `0 f& ?6 x5 g# `0 g{) G1 z/ I- D. }' O U; d
RX_MSG_PROTOCOL buf;
3 m+ q% h; Z4 J* \: Z
2 t0 Q! Y, p ~5 I0 _ buf.a = pshreRAM->a;0 S3 T4 ?+ j, M
buf.b = pshreRAM->b;
8 z, K' L4 q5 K: t' }5 |7 C: w6 w buf.packet_cout = pshreRAM->packet_cout;3 Q3 ~4 {8 v# y8 i! Y2 v) R
+ Z% g$ j% ?( c% }+ C if(buf.packet_cout != count_copy)
: V$ I6 ]1 Q! I' m {
* r2 R; X4 q9 k printf("a is %d\n", buf.a);
Y% }5 t- Q' h* O4 p, y7 N printf("b is %d\n", buf.b);/ |* S1 ]$ G- L/ g) S4 P
printf("count is %d\n", buf.packet_cout);( s* S3 R3 j6 Y, t [1 E1 T- ]
count_copy = buf.packet_cout;
& K5 i i; p3 l( E }0 A' j7 E" j- H
else$ W% U, o' ?+ t6 D! i% j$ p/ A5 M1 P- N' Y
{, s6 }- i/ ~% x9 K3 l
printf("No effective message!");
3 W' l8 A" a i1 w' g- L2 Q }2 {8 D4 M$ X7 ^
}9 X- Z5 p/ ?6 N$ Q. E B
0 N0 o! J# w& d7 t. k9 A
9 Q) ]; t. Q( m. W1 i D' m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 }, o; r1 G* N; j; H+ c- {2 n
使用下面代码,对内存使用了mmap函数后:5 _& S0 \/ E6 T7 Y. {
#include <stdio.h>
6 m6 b( ~* M0 N- a#include <unistd.h>
$ Y$ {' c. ]; F1 F9 j#include <sys/mman.h>
0 Y+ [; N( r8 b#include <sys/types.h>; Q9 W% B8 \4 [
#include <fcntl.h>8 D/ J$ }6 D1 p
, i: }* [5 d6 W6 h! @# h/ N) u#define SHAER_RAM_BASE_ADDR (0x80000000)# m- O( C' T2 S$ z
#define SHAER_RAM_SIZE (0x20000) ! R4 O$ ]8 o; `0 l0 ~0 S5 c0 s0 X
6 Q W; }( a1 x7 T. J5 M! t7 wtypedef struct
" g- D& B( |# v4 p{
- j8 B& |) P, h9 o unsigned int a;
+ p/ v. V9 O& c5 R, T; b unsigned int b;
y. h: g; B. C7 _; { unsigned int packet_cout;
2 O7 F0 ^7 F2 _" W7 Z( f( p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# f( ]0 Y6 B. a$ V) O- C
( z$ Q. o) Z- `, f; k+ nvoid read_MSG_buffer(int *baseaddr);; ~2 f, e: o* p
unsigned int count_copy = 0;
: L+ Z4 M; z* r$ _: k
3 \# |5 ?# J. d7 L0 Gint main()
* Y2 L9 s8 {! r- N( r \{
' {8 s3 o1 Y( x' ^. _8 u+ l& b+ A" T int fd;
" o! q& V6 x4 s% Z int *mem = NULL;+ K+ p0 @) ^+ Z0 h6 U
1 C- e3 n8 H' V! s7 k if((fd = open("/dev/mem", O_RDWR)) <0)& K& D! `/ w) @: `2 h4 w; u0 ]
{
" Y( b% e: W, i/ O! H9 x( H u perror("open error");
/ p# ^" _/ i' G' c return -1;
8 X) C ?/ [6 M }6 p5 V' V' r: r# ]7 q" V9 _
, E( r \2 S2 J" X7 e+ |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 [* y: Z& W6 z+ y: ^3 M4 Z
1 c7 z( I: Z D' l while(1)/ b3 y3 }7 d; d
{
- f0 ?: ]# x0 a8 i read_MSG_buffer(mem);* |; {: P1 ?- z) v W6 A
}
$ Y. {1 S+ c. h! i. E}
+ Z. r% u w, p: j
8 N1 J; y7 _6 B3 Hvoid read_MSG_buffer(int *baseaddr)
; g/ t# C7 n3 Q! D( d{
# G# b! K$ B( A/ @ pRX_MSG_PROTOCOL pshreRAM = NULL;( F D; N) n0 _& a- ]2 ~# C
- E5 f' m& t- a' F# o$ w5 y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 G8 t M2 E3 [1 _! v q
0 @2 }& k0 y3 w7 `1 b- ? if(pshreRAM->packet_cout != count_copy)
7 X c5 `8 C/ e5 Q2 b {
! E# `% X p I4 F" Q! M printf("a is %d\n", pshreRAM->a);
$ z- D/ e5 C4 J& n printf("b is %d\n", pshreRAM->b);
$ R" f8 v( K3 \& N. c3 x0 y printf("count is %d\n", pshreRAM->packet_cout);
+ C |, `- b. k count_copy = pshreRAM->packet_cout;
B* p$ v0 ^; \8 @: U! _/ @ }1 X3 w" f. W4 q
else
" }6 t4 W; A" f+ x0 T" }3 Y; b% x0 G- V {
1 @+ ^5 r& T$ O' | printf("No effective message!\n");7 M# \& |* Z: G; ]
}. N" B5 G' O' c+ M1 ?: d% K
}
6 W7 X" f* W, I5 j+ B% p) H+ l y7 ^
: `6 |% Y3 y6 Z( W9 D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ u; y4 z0 N3 ~; ^7 U! U% d- L4 L. Y2 u* g% J6 H0 R
2 K0 F/ s6 V& {9 {3 A5 h5 K$ X9 }7 d; t+ H
4 c: d2 k6 M/ T5 y- W. q: E; ~
|
|