|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( ]. T k3 S9 L, b4 X9 f
! x6 F& W: r8 lOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) V0 j) {: C" f( o, \#include <unistd.h>
2 ?. J4 P& g7 E: w" P' W#include <sys/mman.h>2 r2 N/ L3 I6 x# ^: n
#include <sys/types.h>
5 j* {2 }" |! K#include <fcntl.h>* J2 F- W6 I$ G9 g' h2 l
2 W4 o0 O& ?8 r" k
#define SHAER_RAM_BASE_ADDR (0x80000000) 4 l }6 C+ s, _: ]: G
" Y% m) ~! w2 L/ M
typedef struct2 a: h3 N. B# l# M: A8 c
{
$ y' z1 d9 n% \; T2 d unsigned int a;- U; @0 O4 b# W0 A1 I) J
unsigned int b;
$ r6 X+ ~: B" I# c$ H' V unsigned int packet_cout;! P, M3 U& i0 ]7 F. ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 \9 a) m% Z2 `1 N+ h( M1 P% X. p: f3 _: H" Q. D6 ?2 I V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& c( o7 y4 k* z6 {0 X' N
unsigned int count_copy = 0;4 Q' m$ q9 @' U' V# _3 D
# L+ w/ T5 [8 g# O6 z
1 u. P5 a# Y- r- {int main()& |7 d* ~6 I* P. i# k0 Q' X5 R
{3 m' M+ s z* D% T9 h
pRX_MSG_PROTOCOL pshreRAM = NULL;
. j+ l& z% i: Q% w! ?4 z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 K5 n1 X8 X& B& }
! V, x; q7 L, m0 D while(1)
; k+ S/ }7 \& P: o2 O {/ \2 W: u4 w8 L# Q1 z) z* H
read_MSG_buffer(pshreRAM);
' Z( X4 e0 u. X9 u3 ^ } i; t8 B3 R R# i. {- g
}
1 R, v; [ D# ~: q( M& v( f9 d* R, l: ^/ B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 V; Q H! w9 R6 R2 G{
* M; C; D' m8 c j( i RX_MSG_PROTOCOL buf;2 v& o `6 J( E
# L: H* M' X# `+ ] ~ buf.a = pshreRAM->a;
; ]6 }- C9 Q: r0 l: R! Y buf.b = pshreRAM->b;
7 {3 J+ C5 o8 W5 w1 M) E$ T7 K( c+ | buf.packet_cout = pshreRAM->packet_cout;- W+ g2 l: u$ z& k( O$ f
. b8 t' ^2 n; @8 J- g( @ if(buf.packet_cout != count_copy)) s* S( v0 ?# u% Q
{7 b6 ]! G% ]/ l+ ^" i
printf("a is %d\n", buf.a);2 s) _5 z7 I: Y g
printf("b is %d\n", buf.b);
9 F' P* `. o) ?8 n( z. b printf("count is %d\n", buf.packet_cout);( w: \$ h" V# a9 |, Y
count_copy = buf.packet_cout;
$ H: P4 P Q0 p4 y, v% k3 S; _ }
) h: P( r7 P/ Y5 \: H4 V; ^" {7 L else3 |" ^: _# n# ~$ Z
{; H# H( [" N$ \1 G
printf("No effective message!");
. `4 l4 h0 D& w% G+ Q" } }5 J- p1 }$ y: C' ?. S c
}
7 b! h5 s' C; ]* H
! Z' _0 H0 @" ?4 x" F4 A7 Q3 ~. @: P$ ~/ P: A: }4 V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" O: G C2 L* I0 R9 A; i. I' E
使用下面代码,对内存使用了mmap函数后:
; h1 C1 s! h3 n3 m+ [" a4 h: h#include <stdio.h>
; y0 |( F9 Q( {2 I#include <unistd.h>
) ?) [6 S& b8 `3 ?8 g9 T, n#include <sys/mman.h>. @5 j& \1 [% V; L
#include <sys/types.h> W1 l" ^2 i% f t5 h
#include <fcntl.h>
+ I$ p- X& y; y5 z4 f* Q9 r4 R3 N
1 G' y$ u7 m: ~5 P9 c4 f0 a#define SHAER_RAM_BASE_ADDR (0x80000000) V3 q0 d ?5 ]. ?7 S: f/ T5 `9 S5 R
#define SHAER_RAM_SIZE (0x20000) . n I1 m4 E# m8 y% I0 Z) `. e# O
; C* }$ T: b2 M/ S! ^, ]4 s% G) U# U
typedef struct: j9 H0 h9 F4 Q; u1 o) X
{
2 c4 B: P* v6 R) \$ R unsigned int a;
' H/ X& e# ]: X2 c. x& f unsigned int b;- p$ t% {, \' M" n z
unsigned int packet_cout;$ u' c+ J3 ?' T1 B" w6 u/ ]( ~) [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# w: r, _5 U; s( s! u% I
/ X0 B- h7 G ~! K7 y8 |' A$ I& Jvoid read_MSG_buffer(int *baseaddr);* g" y) {) H8 @; q H" M
unsigned int count_copy = 0;
$ y: b9 X0 [1 l7 V# z9 p1 |# s9 L2 R' Q( ` ^( [
int main()7 T& e% N9 Q9 [' g G& |7 F" u* Y
{- M6 c( \8 x9 h( ]
int fd;' A# M8 w7 B7 `! w. c L
int *mem = NULL;
4 |% u: b( G# {% k E# Y
# o0 p |% q; \( _) V2 z8 @ if((fd = open("/dev/mem", O_RDWR)) <0)5 k# u5 v7 _# V( `- p
{( s$ C/ f7 V% j0 H$ l: q; N. Q. b
perror("open error");( ]1 b6 e. q% j$ k
return -1;
0 N4 h; a, J s: w. y2 U }
. s( |) B" d9 }, g m3 c
4 ~* B; }) G+ L4 h: L. P mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ S1 k- }8 d: d! m$ s. _
* D/ b4 g( l& w% i/ W
while(1)
% k# w7 t1 M9 O! `7 O {6 B `4 F/ @) v! ]8 s& Y/ F
read_MSG_buffer(mem);
6 z$ K$ p7 U5 L2 J$ E# U( T } ! ~, ? n( }- E) [8 p
}
2 V1 }) w. ?2 ~( R
7 {. v7 e9 T! o. p) rvoid read_MSG_buffer(int *baseaddr)) ?9 u' h6 H* q+ a% S9 V8 j9 m8 u
{1 c! C6 e$ t9 ]% m
pRX_MSG_PROTOCOL pshreRAM = NULL;5 k4 t x; D3 ^9 Q6 t+ p: T& q( m
5 p0 a4 u# ], C% E( T) W pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( ?; D3 B) C+ h* [( w; D7 K5 S
; s! G- I# ^0 }1 l, i0 E if(pshreRAM->packet_cout != count_copy)7 _/ ^6 \/ E# p
{6 E7 c* I+ P: Z1 H9 U
printf("a is %d\n", pshreRAM->a);* v! K. v* T# y2 b3 p
printf("b is %d\n", pshreRAM->b);( h, n& Z4 w9 E* ?+ {; B( e" Z' u
printf("count is %d\n", pshreRAM->packet_cout);
- w7 F& ?5 W9 w9 F. z; n, @* \ count_copy = pshreRAM->packet_cout;; q8 b0 o, R w$ A5 L& V
}, S+ K4 \, P% R6 Y: w
else
* e6 W; @2 K* L+ c% P4 b {
/ x4 ^$ {" a/ s. d- ?7 C$ F5 p! \ printf("No effective message!\n");
" x' e, E" q7 ?; j3 T2 S }( p) f( P+ o; e/ _
}
o2 ?7 w \) u2 K7 l6 R6 l4 s7 j% S' T; _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 t' Y: h' K/ D
. u1 K i2 f2 Q" O& e! y. a% b r% K/ P3 m$ T+ ?5 S
0 K6 }- {- V) X: v: g8 m4 t% C; X6 M3 R( J5 v, b
|
|