|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) l. W5 T: q/ w' z0 G' O) i
1 K6 W2 L3 D% I0 uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ w" v) T# Q8 ?) U
#include <unistd.h>0 p- {9 Y& A/ k5 {6 U8 f
#include <sys/mman.h>
# J; W$ {: N4 F, @#include <sys/types.h>
- {( q: p3 }3 S#include <fcntl.h> K4 N0 ~! g, G7 D# D9 @, I' V3 q% m) [
0 a! G9 \) v% {5 T2 v y3 V#define SHAER_RAM_BASE_ADDR (0x80000000) M4 x! \4 G9 h6 g8 C+ k
% p+ P+ M; r2 B( o3 r2 X5 E
typedef struct7 H! P+ J6 A) n- o! t1 w
{
& {1 a- t7 V: G8 B$ r- L, Y( Y! @; R unsigned int a;+ C; c" E u( t" o Y4 J
unsigned int b;- j ^* a2 a4 v& s3 d1 d- ]) z
unsigned int packet_cout;
$ H( g) D6 m: O+ Y* |) w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* Q& M9 Z; H$ B t. D3 A
* W$ b/ Y% X8 a# \1 ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* O6 e# S. _, c' G2 Cunsigned int count_copy = 0;3 _% W. j3 Z. l2 s: P/ m) W6 {
+ D* G* b( ~6 x7 K3 ^ m2 V) x/ U! U" f+ t% `
int main(), {" h% a% f& I7 F: p+ E* T
{) q2 U: t' m2 z0 v% b
pRX_MSG_PROTOCOL pshreRAM = NULL;. f X w* X! r1 c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* J$ E, p* Y/ Z
" d8 S( w7 z* P: E6 d' d+ G
while(1)
0 ]) f$ H- ^0 i2 L. I U {) k/ Z: q9 {& ~8 H7 n2 H7 y
read_MSG_buffer(pshreRAM);
2 z' @2 k) F8 Y6 a9 c# q } + E) A; Y( H9 e; n5 w/ i7 F
}
6 L$ }4 H& a2 I$ A" ^, O- n; n- ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) Y7 Z0 O. T4 U" @$ D( x* Z: h7 k
{; @: _) n' ]& \2 c
RX_MSG_PROTOCOL buf;* f& _1 J9 x& o* ` _
! Y+ ~) k# e9 p5 u* \) I buf.a = pshreRAM->a;
" h* V( M5 R# X' r: U! U! | buf.b = pshreRAM->b;0 _$ Z L! @5 }
buf.packet_cout = pshreRAM->packet_cout;- N, S( q) n1 c9 c$ U
; X! \. @! j! }+ c
if(buf.packet_cout != count_copy)
3 P* i" H* x: } {
& P) l6 x6 q1 y0 E- i4 Z printf("a is %d\n", buf.a);
6 m1 t) R+ d& j+ E% V f printf("b is %d\n", buf.b);% O& M# P! ?7 M0 L
printf("count is %d\n", buf.packet_cout);
. n! [7 M8 l: A- R S count_copy = buf.packet_cout;% F/ w- s6 {+ ~4 _: m
}3 v$ Z6 Q0 s [, Q% ?$ v) R) W
else
" R3 I$ L# v* f: j6 T) A4 @+ l3 C {
1 f6 f2 Z$ H; q3 m( ^" L4 s3 k printf("No effective message!");5 u6 B* I% ?3 E+ E% F3 D% f1 Q" _
}
% w; f' W" z* I! W: n! {: a}
! u1 ~" k% j1 C5 i1 O' y0 e- X- }" y2 ^) h% d
* Z& q1 {. N% A9 h0 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: U0 s& A& D. w4 c2 H! N+ M
使用下面代码,对内存使用了mmap函数后:
4 y4 @3 C6 l9 l#include <stdio.h>+ \- W) S0 \4 e; ?0 n1 K/ F
#include <unistd.h>
/ t0 J6 u" M, F8 D* _$ V#include <sys/mman.h>
+ a' T/ |! y" G' b#include <sys/types.h>
# _: E! j, \! x: f' U#include <fcntl.h>
! Y: m* u. F) b. @. n, h8 O$ N' U2 f2 ~
#define SHAER_RAM_BASE_ADDR (0x80000000): I; W+ A1 o$ I2 Y) s2 \
#define SHAER_RAM_SIZE (0x20000) $ H5 h0 L5 f W. R' n: h; v3 m
0 T/ @9 N. @( @# N( f& K j
typedef struct! B& ~& ?: k" L) H1 w9 L) W
{+ c' P( `$ A1 B$ _2 ?
unsigned int a;
5 k+ d# ?) T3 Y5 D9 a1 z4 R- v0 w unsigned int b;2 P* J; v( _7 _+ e4 e3 u
unsigned int packet_cout;" W* C- p& {; @% [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! y, b* [# X+ l5 {* t8 O/ Z# V% h
void read_MSG_buffer(int *baseaddr);
0 v& v. b# M$ q3 h; e% ^unsigned int count_copy = 0;
, I: [5 g& B* x! ]! e+ W) K
8 W& u6 ^; f S: I+ Lint main()
' P# d$ t; E/ Z" n0 f4 Q{
; G! d+ @, K9 v$ R; X7 d, v: }% z! W int fd;
. e# ^7 h" f3 j, X6 z" X& v9 ?- K int *mem = NULL;% x( U" |8 A3 f4 l, E2 E
1 l2 Q7 v+ d2 F+ Y
if((fd = open("/dev/mem", O_RDWR)) <0)3 G, ` G2 u8 ?3 d9 ?; F
{0 ~) n! d5 @2 k( F& d
perror("open error");( \' i$ [+ N( F- e4 N, D& X+ o0 V
return -1;; I0 v/ e2 V! ^8 @% y' D) T
}
8 X/ B6 n& n& }2 J + d3 B2 R; w1 `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: T$ G# K$ @# o1 d& D
9 @' D; I: J: d: X, Q9 k while(1)
% Q. Y: i4 `, D4 d6 ^' m {3 z. u+ f n5 j) }+ c
read_MSG_buffer(mem);
- W, _2 Q- _+ p0 j3 a- u }
9 t5 S+ O7 w# F0 @- D# b2 i}! m3 F0 `6 _: F
! m0 Y: ~9 @* d. J0 e# h
void read_MSG_buffer(int *baseaddr)- |3 E+ r* |* ~$ H
{5 V5 p+ h: J: K3 c1 U1 h
pRX_MSG_PROTOCOL pshreRAM = NULL;3 P) `/ ?" S& k6 d& p: U' T# ]3 `
& B! j" n! E( N2 W& N9 E pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; D ]5 Q7 z" Z. @. M* }
G4 z1 E9 L% Q. e1 ` if(pshreRAM->packet_cout != count_copy)
5 ?0 [4 _5 A- G8 D {; |0 H0 ~5 o2 i6 ?
printf("a is %d\n", pshreRAM->a);- c8 l3 h% W o: \5 c
printf("b is %d\n", pshreRAM->b);& M8 c4 K; z9 j$ z' n/ J9 x
printf("count is %d\n", pshreRAM->packet_cout);
5 q5 C2 r& i! ~, } count_copy = pshreRAM->packet_cout;
% m$ w) a f& J, J" n; H }) r8 F/ o2 O9 ?3 ~+ I
else
2 Q0 \! H* [. H$ c) f {
, X: m- B6 u+ @1 o7 a) {' K' H- K0 k3 ` printf("No effective message!\n");7 S C/ s5 a! d0 o- U* R; E
}5 i9 w( w9 F1 K8 _1 N, ~
}
- L) I( a0 h- D' t
; y1 R" P( I+ f0 I" \没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 e! b6 _6 T0 {* C) }; _! t B2 s. T# \
' P* [. J4 u( W& g* q6 N; T' J5 w% k; f( q/ {
- {0 [+ F& h* e4 A3 g2 z2 I. Z N |
|