|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - l7 d0 m2 n2 M) v
7 w6 n3 x' }. r- f6 QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% G W5 R" i- `* V7 w#include <unistd.h>
0 }: X. H* F# l V+ ^) s#include <sys/mman.h>
3 \6 ?3 q ?+ Q1 a0 h O#include <sys/types.h>
: ?8 l- t; Z, A6 X \#include <fcntl.h>
7 v* i. M$ Q, @/ |2 o/ U' S$ {# w: v
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 `# ~" H" Z1 d" O4 @6 \ J/ p0 M D: X' w7 U
typedef struct
9 Y* O- z2 H8 k6 {2 J5 |2 B8 T: e{% M: \# A$ c3 i, X
unsigned int a;
* U, E2 [8 Y# p B1 ^: j unsigned int b;
$ m0 z1 N4 s1 ] S" m unsigned int packet_cout;0 Y8 ~7 m" q, q6 e4 ~0 H# w3 P' I- w5 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& b9 K- @- J9 W; i% e o
: V3 Z/ L4 r5 u8 G; Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ J. h7 c4 Q3 ~% z0 @+ d8 a N
unsigned int count_copy = 0;& M8 x3 C' O3 O& a# C: @# j
0 D. N8 {: G3 x# k7 P1 D7 n
( Q3 @! I$ B. L$ m& n! i- ?
int main()
F$ k6 r* u, c1 O{
7 R, W0 {, d2 m8 d pRX_MSG_PROTOCOL pshreRAM = NULL;+ w% W# \! N( M1 R* H& ?( }/ U4 F
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 i' e( E0 h. E! c7 N, R( d+ Z; n" J
while(1)
+ P5 y* \# U6 D" L- o {3 H9 Z# Y0 B, T/ n" ?
read_MSG_buffer(pshreRAM);% w0 Y6 I6 Z5 d1 F, H! [
} ! ^7 ~7 _0 }3 t/ d( P
}
" k: M5 ?, b0 o/ w6 R# b3 h8 N, q5 F2 s7 @9 X! h0 V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ W0 H3 P: S4 M3 @# @0 f{
7 V2 v& g* s% H RX_MSG_PROTOCOL buf;! w9 q% ]( b( X. \5 e
: Z9 Q5 g8 J* ?0 ]' H buf.a = pshreRAM->a;# n# W$ U3 S. \7 w
buf.b = pshreRAM->b;
/ B' |5 j2 X2 B" c, s: ~& Q* U X buf.packet_cout = pshreRAM->packet_cout;+ a/ R4 D t9 U+ T
2 J" }# S& U9 f% h5 a if(buf.packet_cout != count_copy), W$ n; I7 k* J* Y4 f
{& j- l1 O( Z" S3 f: O7 g7 m* o. o7 m
printf("a is %d\n", buf.a);# b( L) P% w. i4 h! ^
printf("b is %d\n", buf.b);) `6 b, ]1 k. X
printf("count is %d\n", buf.packet_cout);
* y$ C) A* R1 m7 n count_copy = buf.packet_cout;
0 j7 W7 P; w' A# p5 L5 `, Y$ E }# q' R" T" Q9 x, \3 K
else
8 O- b5 {5 ~0 s v. S$ q Q {
9 g! [- E+ a# O$ V printf("No effective message!");
% D0 L" t8 p2 O3 S, T$ K; R" O5 } }, s9 z2 J( E* j s% u
}
# D, }0 r3 Z/ C( p q; S) Y( K/ Z1 j$ X
, n' |" o1 ~0 Y3 j: h& W1 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! c$ v0 ]# B) b0 y, e使用下面代码,对内存使用了mmap函数后:
# V+ n% w8 D, Y7 K5 c#include <stdio.h>
6 ~4 d4 g' F. B8 G#include <unistd.h>$ X0 d$ N( e0 w: N: E
#include <sys/mman.h>
; Z: I4 k: ~! o& N#include <sys/types.h>* |$ `- L6 E0 ~3 j
#include <fcntl.h>! _( J, u9 {, x1 F/ C2 s
$ C+ d9 P# C8 O8 j
#define SHAER_RAM_BASE_ADDR (0x80000000)
H2 U1 T+ a$ a) l" {; K#define SHAER_RAM_SIZE (0x20000)
/ X E# W2 J/ w' J0 }5 K
" ]* T! f# b/ b9 }; utypedef struct+ U7 _4 D; {7 g, h
{+ |9 G- q+ K- G i4 {
unsigned int a;
5 L$ ?& }; P) s3 p" X2 D' x' ] unsigned int b;
1 g6 K: W2 G, A* D* m% R7 R" f unsigned int packet_cout;
- U! Z5 d- M, l) y, Y: ?. [# g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% h& I k- [7 w2 c1 H
5 y& J6 I9 {3 {* \- hvoid read_MSG_buffer(int *baseaddr);" S6 f/ b- j( R5 y* R" o$ G
unsigned int count_copy = 0;# v2 A- T8 C; x$ ~/ a/ `/ B
% W) q. I# m1 H: h
int main()
$ D' Y: ]* c( R+ z5 F5 D! c- |" O{& u# }* ?1 m. y
int fd;! M6 [6 o# v. N
int *mem = NULL;7 C$ }( o3 w0 ` z
% b0 H& n8 j' P; e1 k; _ if((fd = open("/dev/mem", O_RDWR)) <0)9 E7 r! T! J: E1 k4 Z) y
{; n7 `' y+ Q8 r4 x8 E, O3 a
perror("open error");
1 Z6 {4 r% J0 [" Q. P1 Y: q return -1; C7 A' q3 p% \! P$ f3 R
}$ G& l3 @' _8 y3 G
( e# k* `) p7 J. ` mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& J( V) L$ p. L
' V$ P0 \( C* Z) @; Z( R1 n; g while(1)
* m& T$ X2 N6 S! v4 z8 n {
5 N9 t# X, @9 v F read_MSG_buffer(mem); X4 H; {: m3 [4 ] g1 F3 @7 V
}
& T9 }, W$ N1 w}; e% A, k) e/ V- o
0 D/ V, a& z/ b8 _& Z8 y" k! d9 r8 G
void read_MSG_buffer(int *baseaddr)' v* B" z2 M' L/ R1 f
{" L P! ?" o' a3 Q& l( J) n0 |$ E
pRX_MSG_PROTOCOL pshreRAM = NULL;
' y" ~4 p* V) H/ I b3 h) B! }4 o3 ^7 \7 s/ h: ] a" r& c9 ?% ~
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* E6 y$ D- @3 A& ^
7 w0 \) O" z2 b' v* N
if(pshreRAM->packet_cout != count_copy)+ f+ Z9 ]5 V( e. ^& g
{
, B. @% V: t# A2 A( Q- E& j printf("a is %d\n", pshreRAM->a);' ?- t" B, Q+ j& G0 d c. I
printf("b is %d\n", pshreRAM->b);. V8 Y3 A: n! Y4 [+ P2 C
printf("count is %d\n", pshreRAM->packet_cout);
. r1 n. U# G1 N9 M count_copy = pshreRAM->packet_cout;
# U/ E! v, Y0 ~& M; E5 O% z8 n5 q }% v! b5 v# k4 z, Y; M7 B
else
) W0 u9 _& p2 _ {
* }1 `: {3 E4 _4 c printf("No effective message!\n");
/ H+ e/ u7 o* V |( T }/ \: [2 x# F( s4 X8 Q7 M ?
}
* a4 r/ t# \2 P& d. i/ Y
1 x# a! _& l, j b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ E9 {: m9 E# x, p( F& J, c4 ~0 ~ e8 F+ f# V `
6 R* o! d1 z: K1 e, g' o+ G8 e+ t% w
, D5 q( ~7 _! R, J- q9 S# ~4 D8 u
: l, A" r% ?4 {% D$ }# K) T3 q* V# B% ~ |
|