|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% m+ D) P/ P) `8 A. a( }1 i
6 m6 h$ x: c5 l1 W( U4 ~! u+ j3 jOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' l2 V7 c5 p* ~- z7 q#include <unistd.h>5 y. q/ b8 r0 i% Z
#include <sys/mman.h>0 b: m. n1 C5 R& O& p' \% t
#include <sys/types.h>& F9 w+ E* P; Z* c8 B9 a
#include <fcntl.h>
. y/ a! k- J4 U& M$ u* T0 {( o! N
$ w' T* L/ E( }) W#define SHAER_RAM_BASE_ADDR (0x80000000) ; P# \! v: N/ U5 X
4 l+ W0 V# C/ l# {! q5 j' [6 |
typedef struct
: _5 C! @4 \1 I" ]# t8 L{
3 h7 o* j, {/ `. B9 r unsigned int a;
1 B k; ?6 N1 t1 @3 m unsigned int b;6 D% b& O( x! q$ O/ g
unsigned int packet_cout;4 G- P( k4 D l# }. J% [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ M+ y* l. o" g8 T, K% }
+ _/ Z' z" H" G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ ?8 K# J& X ~/ Y4 W; \& h! U
unsigned int count_copy = 0;, s. U# `0 Y8 k; K- j) |. b# w# V
8 e1 m8 |8 {+ \. v
: Z/ q, E* ~& e) T
int main()- Z) U+ t7 M# z8 }
{( ~/ @/ j% n9 A5 @ E
pRX_MSG_PROTOCOL pshreRAM = NULL;
% ?+ L8 l. s, T& ? ]2 Q5 } pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 X/ {; G( _5 i$ B. P% |+ h
$ A8 V5 |$ y) `' I* } while(1), i. {$ u: }6 ]2 n0 Z
{
( Q w. d6 K/ N% x6 m read_MSG_buffer(pshreRAM);
# n. G* L; ~$ t } 1 O( U5 D$ G v
}% h* p* y- j0 \ v: \
, k* ~. Q; y/ A Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 a1 M4 Z: t: i& W" p6 |
{# L* z- c1 c% c' u8 g! \1 A
RX_MSG_PROTOCOL buf;- ]1 i- h( d1 L: R8 k9 w' o @
. W" m' Q' b% A% G0 t buf.a = pshreRAM->a;
* I3 t3 x) r) Z8 |4 S5 ? buf.b = pshreRAM->b;
% \$ ~: ?8 X: C buf.packet_cout = pshreRAM->packet_cout;
" R9 v5 m9 i' k3 h, q
/ }! `# E; d! K6 }# m if(buf.packet_cout != count_copy)* @0 @( j0 [; m+ q, i: |/ |
{
# f* \3 Y- F6 r& C; \# D% B printf("a is %d\n", buf.a);# p' B: P |$ A/ x2 B
printf("b is %d\n", buf.b);6 Q$ i( \4 t p4 [! l
printf("count is %d\n", buf.packet_cout);
% P3 ^6 N2 ^, L! f count_copy = buf.packet_cout;
3 J. Y. a- ?+ m$ q7 C }
& w3 w0 g& \+ {. K+ a( @ else
4 f# i! ? o6 c$ B {
$ x9 {5 G) X' G7 P# ~& t printf("No effective message!");+ `2 L. m- j# E
}
) X% ?0 |4 l0 P( g. g% `% x g0 ^}
3 j. z9 A& ] p6 t5 |- N- S2 q5 U1 d% b4 z
/ K: S+ Z8 r% i+ U3 v* [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: P( U- Q) e' a* M) y; I使用下面代码,对内存使用了mmap函数后:
8 R# l$ ~6 r' C9 }. h) F* ]3 J3 r) n#include <stdio.h>
0 f! _4 e$ R4 {8 u1 P9 F#include <unistd.h>( k8 W; N+ J A+ l# E5 x e. N+ ^
#include <sys/mman.h>& ]. q( Z# J6 X' t+ p/ x/ h; U. p
#include <sys/types.h>. c I; g, p" q1 e# h0 R
#include <fcntl.h>- ~) E( X+ X: r$ P7 U3 T: x% q
" C8 y3 A6 H k5 b) E
#define SHAER_RAM_BASE_ADDR (0x80000000); @8 u9 k# F: d0 Z7 K' [% s$ r
#define SHAER_RAM_SIZE (0x20000) ) y6 R4 D8 b k9 [
! K- ]4 H# d( Ytypedef struct, n2 ~5 F# i8 @) K# X1 E! t
{
, I/ U3 Y7 Q2 G# Q6 p unsigned int a;
1 Q3 r1 _' E+ y) R5 T8 o$ @ unsigned int b;
/ s& Q. J3 I0 t) ` unsigned int packet_cout;+ P" q2 s0 J$ G2 F! Y% t/ ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 J2 U( r& U- q1 w4 Q; {: v# S* u- {* O) T4 [
void read_MSG_buffer(int *baseaddr);8 e! I' `8 f) n' P6 p
unsigned int count_copy = 0;
! p& Z) m& U9 A$ `
. f8 L7 ?) e# xint main()
) I$ W0 K: E. l$ s{
$ V3 o$ j6 p- L int fd;
% Q: o& ^9 }2 v: J8 q$ [ int *mem = NULL; f& ]6 Q; |/ i. y% O8 C
- s& ]+ I: H. X
if((fd = open("/dev/mem", O_RDWR)) <0)
5 }; w5 N0 S$ t! X8 a8 p {0 y" G' B2 l$ O
perror("open error");
+ ^ h6 s/ v, ?4 W return -1;
! H& L4 g; v9 D, S/ _8 l) T) U }3 Q% E% x4 Q. N3 v
* |$ ~$ F5 c/ u" J; n mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; D6 B* P+ \ b8 ~- i) D* B* M
5 n7 T; S* ?1 _) f" |/ \ while(1)9 m0 f H/ Y- |" Z" H, s
{
- V: }$ h) \6 h% c- r9 j+ { read_MSG_buffer(mem);. p0 D: i3 V* f( A4 g1 a5 h7 \) m
}
! e( D3 ~+ T( R" H$ D2 U}( p, K6 }: K9 l% p+ g" h
6 {" t) e" g2 Bvoid read_MSG_buffer(int *baseaddr)" K# z6 P- K* S. u3 D' T
{
" H: d* H! _: R! }; m! Y pRX_MSG_PROTOCOL pshreRAM = NULL;
0 O+ n9 _+ U( J& p. a0 G* `8 V4 G" D3 W/ i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 W* ?3 Y. V# V" _2 c, U; [/ t, ~9 i9 H; a' [7 w8 a0 i
if(pshreRAM->packet_cout != count_copy)
9 n' @! C7 c' d) P( f {
3 i1 O0 w/ Q8 o$ y! i7 t H printf("a is %d\n", pshreRAM->a);$ [5 R* p0 P) \4 ~
printf("b is %d\n", pshreRAM->b);
8 L9 }9 A* ~: ]: i3 U7 E& n; X printf("count is %d\n", pshreRAM->packet_cout);. k& a5 ~% `# K% t
count_copy = pshreRAM->packet_cout;
' l! I8 w6 l$ g5 E+ @ }
6 s/ p( k6 x: r5 k9 Q else
% k i4 {: ^( Y( s0 o+ F {
, b5 ]* S0 I- F% K printf("No effective message!\n");
/ d+ J0 F9 U1 _* `$ T& i }+ V+ X+ Y! n& d: x2 N1 ` d4 z
}
6 h7 G4 j5 |: l4 @. h8 |
& o+ d$ e ]0 S) q* ^没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, x" J: x2 S2 e- ?
. D% b0 a0 u' ^* p7 G) B8 W
/ z% m; D4 ~% b; N9 N) o6 @$ X# N6 L& j' Z# X- r* k
4 Z7 Q5 ]5 l L4 y, G: X ]2 k |
|