|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# m$ s: D8 i2 k8 S; B0 C* h. D: m
4 E0 Z7 f# W& u- h# D0 E# kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& u5 u8 r& G% u0 [
#include <unistd.h>5 Q0 c: d* x" i3 [: t7 r+ e* u( l7 I
#include <sys/mman.h>
1 ?7 M5 y$ I+ U; {0 V0 M: c#include <sys/types.h>
1 h$ e6 @' G( |3 C' y) }#include <fcntl.h>
, w% m9 U) p! ~: h" X6 w7 A
' ?4 S7 O a6 D#define SHAER_RAM_BASE_ADDR (0x80000000)
/ l9 o$ S& a5 d$ A A
5 ^* W. a/ }5 Dtypedef struct
! w# v" T; G5 r+ R" I Y; a9 @{
! w9 ^5 L. _1 Z8 w unsigned int a;
" x9 M& E4 C& ~2 P, U: Z" a8 j unsigned int b;
6 C* n8 z' e8 n/ B1 M7 ` unsigned int packet_cout;/ ]9 H/ C9 r d: ^( G; m+ { b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ j+ f7 a0 }5 t* {, @ t# M6 F; ?8 e+ y$ G6 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 @- ^- l/ j M1 B# P4 Dunsigned int count_copy = 0;
" \# [7 F3 {* a* t5 \# d5 V9 h$ l+ |- t6 }2 O3 f
: D3 n+ `- s; Q+ z9 l3 Wint main()+ r1 m- \& {8 M4 o/ z
{' S% p1 f- K% g2 F
pRX_MSG_PROTOCOL pshreRAM = NULL;
' X% K" {4 A# D pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 n& n: s' N1 C5 W! q
6 p* N' \' o7 g: Z4 y/ H while(1)' E: t" X. V! u* \/ e7 }
{8 Y% J5 @8 X! m3 I
read_MSG_buffer(pshreRAM);% }4 u4 M" n, \. e2 d; p3 G+ _
}
5 l' u! ~. L9 f- @4 N4 L}
; |2 [! W$ j* }8 S/ u# f% ] x& k @% p& v* o4 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* K! n4 u" z, d& ?{
; N9 [+ p+ C& C9 g RX_MSG_PROTOCOL buf;8 A% b d& _( Q7 u) F
* {" Y9 p" O5 a5 c- b2 T( H4 ~ buf.a = pshreRAM->a;
% W/ @" ~* X$ A$ p/ A buf.b = pshreRAM->b;
7 I) A J' L$ m) }- @8 J$ [( Q buf.packet_cout = pshreRAM->packet_cout;
. y; N3 t- s& Z# Z7 {; ^, s& U9 m7 B ) D3 \ }6 ?6 q/ ], w
if(buf.packet_cout != count_copy)# J7 O: ~8 g3 d) X- _0 a* M. F/ k- b
{
- l7 s" e' o! A printf("a is %d\n", buf.a);8 m" H# P4 r; k1 A& I: G' _% b
printf("b is %d\n", buf.b);
1 @% j2 |2 n4 A6 c printf("count is %d\n", buf.packet_cout);
4 i, X7 _1 e Z count_copy = buf.packet_cout;' i5 S5 l1 B9 E5 P2 J0 y
}% h" `. \' C# _1 o. s
else1 {, [& c+ {9 M6 @
{ G7 ?' s' Q* e8 W% o
printf("No effective message!");
+ u4 d' v Z* N; L) o }
4 Z1 a- q" N' J4 ?- [! ?7 k* d- K}! h; K! l1 Q: n8 Y7 @; W
: d, L% U2 A4 y7 P! C& V8 l* c# F& X* a7 T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 U+ D/ m) `; U, z
使用下面代码,对内存使用了mmap函数后:$ ~+ a; ~2 \* O# {
#include <stdio.h>$ i- p& e5 N3 M5 W$ s. m! t
#include <unistd.h>
. f F( Z- U4 x! T8 {9 |#include <sys/mman.h>
! @' O* a( ?# |#include <sys/types.h>% o1 M# K' M9 O& F+ L
#include <fcntl.h>' T" k% T' U% i9 o0 x d* T. x$ _1 X
4 l6 J5 c# E/ Q$ C#define SHAER_RAM_BASE_ADDR (0x80000000)& e6 s C2 g( r7 O0 C) ?0 j* @
#define SHAER_RAM_SIZE (0x20000)
* P0 |+ I+ T- j1 e6 D4 @! ?
" K6 r) ?: S( K( xtypedef struct
9 \! X1 z- `, s{; k5 W# a: \+ {5 w
unsigned int a;2 \8 L3 S) S7 N7 k
unsigned int b;
- O9 }* q x7 a" G unsigned int packet_cout;
7 [# O) R$ c( ]' K- h+ k4 A2 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ @. l4 F# F+ D7 d+ ^: |0 w2 O
1 D, s: r6 O9 P' {" D' v; D
void read_MSG_buffer(int *baseaddr);+ q0 e/ {% w7 f3 ?( f" t; `; M3 f
unsigned int count_copy = 0;) N/ J* V% {" z& l$ p' L m8 e
, a+ j; e; `( {( Zint main()3 n, u& w7 t+ j: `8 q& i4 P
{ e; h5 }: l( n; o( e+ T3 d `
int fd;
. l/ p* i a9 ?9 s int *mem = NULL;' x% U5 G/ b1 T. o8 N) b% I5 n1 j
% d+ i: N5 C4 r8 A8 h4 f, }3 _
if((fd = open("/dev/mem", O_RDWR)) <0)* W" x* Q* S# f) o, P8 @+ v0 a
{
' T, y' y0 r% m- _$ ^0 i+ J perror("open error");" x9 {5 s2 f. O8 b
return -1;8 T$ m2 ~& i1 i6 O7 k: O/ O; [( i
}
1 T& o. R0 g4 T$ I
- g) B5 O8 x% e mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' K5 H5 a! H& U- y
W/ ^1 p5 k4 P8 }* q while(1)
- t) ^; f; [+ @7 v7 Q0 j {3 e- @4 |* I6 e& P
read_MSG_buffer(mem);, |+ A1 q. N, m7 M7 W6 q
}
; g, B/ N! r" A; u3 y" K( Q}
5 t- |4 ?0 a7 t$ W8 N4 B9 E8 m' }- \5 C
void read_MSG_buffer(int *baseaddr)
) U( Q# O* }! K) j/ j{
! R5 ]% t0 b9 |& `8 b pRX_MSG_PROTOCOL pshreRAM = NULL;+ X! [/ i# R6 V. D; W
9 C) v% _: \' _' Q, h+ a" ^ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: m/ M L) }4 ~3 N. K, K8 t& q$ l& x1 u# ?8 F- g1 X1 a
if(pshreRAM->packet_cout != count_copy) h) \) |) V1 f: r6 L
{) h: Z' m- ^8 a% C8 R# E
printf("a is %d\n", pshreRAM->a);
@9 \; J# Z& N" }( n* y printf("b is %d\n", pshreRAM->b);
, `# D" n4 O, s$ T% w* C* _ printf("count is %d\n", pshreRAM->packet_cout);/ n. _; V: v; U1 a
count_copy = pshreRAM->packet_cout;0 V/ {6 A4 y" b- z* r: q
}0 A* A* L( [8 q! Q/ u) U) a' u
else
5 \) s( W! G5 h6 c2 N4 T {
& D' j, P: \3 | | printf("No effective message!\n");7 @1 J) G. @# Q& O5 k$ n: ]
}# m4 H3 `+ E) E4 g
}% d( `3 K0 J+ |: v" t# Q1 @/ s
% ~- g. K/ j- J9 j k' e6 H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- x$ c* v b6 j& Q& A5 R
* L: t. _3 i& G& h; y7 C
! C1 h, c2 U1 b
7 ^1 e# S2 Z) U( U) {+ W0 G! M$ h) M% [8 W5 N& W9 g) P/ o; a
|
|