|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 o) J8 S0 E; x+ F6 j$ T1 P6 y9 \# g5 W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 i) |9 o# [) F3 g0 G#include <unistd.h>3 e6 E" J5 {6 o' G% O
#include <sys/mman.h>
. U8 A4 d4 E: O5 P i- c% a#include <sys/types.h>! W- y8 y7 _6 C, c$ u3 }# P
#include <fcntl.h>& P2 T+ Z. O* ~/ I. o
) j( f, l" g! M5 k' ]#define SHAER_RAM_BASE_ADDR (0x80000000) , H/ Y/ H! |4 G& g' p
8 @. H. n8 V5 x- @5 ?7 v) K: [
typedef struct
* E- A6 A$ q6 b9 v+ C8 V5 i+ O{: Z. g9 B0 f3 ~
unsigned int a;
^; \6 y* K8 \, h3 U* a unsigned int b;) o8 @* y4 S1 ?: L/ ~1 o
unsigned int packet_cout;; r" y, N6 |' T& l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! x/ c$ m8 s3 F7 y* N6 s& k
3 _# [2 V; C" P4 D9 L! U; ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 `! y+ n3 S! T; C! O( K- punsigned int count_copy = 0;
# D2 s/ ?4 |5 X* e* V# o1 ?2 ]& r. w" V
- t3 J) m# x. R2 ?0 H+ Mint main()/ r* E8 W9 W% v
{
5 z- D* ]- k9 w2 L& W pRX_MSG_PROTOCOL pshreRAM = NULL;
f% P) O& {" j2 s pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% ^7 l2 f" Q. v, [- U, N
' J- |1 D; Q4 w4 Z. S while(1) ]' o/ S/ i6 q9 c [* m0 S
{6 c3 M j; n- |5 _' y4 t4 M
read_MSG_buffer(pshreRAM);- f. {1 v: K# q3 U: b7 W: K
}
% {# `& [% u5 U" p3 C( _}
' L1 I& [& }! J7 m1 Q* E. s5 g9 w, S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 @+ \/ ~8 o2 ~
{8 g+ u* N6 W$ X6 g1 L
RX_MSG_PROTOCOL buf;
7 l+ ?6 W, ~ g. W7 l* P, a: R
+ J- E1 a- d6 k$ q. f4 _- t1 { buf.a = pshreRAM->a;/ N. F2 N+ T' k l/ |
buf.b = pshreRAM->b;
0 h. B) w; N. L' d2 t4 X buf.packet_cout = pshreRAM->packet_cout;
8 j2 J% l7 r* F1 D) n: k
: m4 k3 m$ ~( L2 S, E if(buf.packet_cout != count_copy): x! N( K. \8 J( f, Q* e
{ f0 z, | `: r% |- X6 {
printf("a is %d\n", buf.a);; _% G3 z m# [' }6 B
printf("b is %d\n", buf.b);$ a3 f0 M9 L/ c! E
printf("count is %d\n", buf.packet_cout);; Y+ \" @. I% G; H1 `. }
count_copy = buf.packet_cout;2 u+ a, m/ o) |: ^. J1 `
}# @! R% C3 B) _0 f3 N- P
else
! Q1 j; a- t" }; R& [0 e, C {5 c; T" h. h' D4 f, o
printf("No effective message!");9 C8 i4 I: x# v/ b+ @7 J
}
" _* Z( [/ q [% u( Q$ }( @}
5 y+ o. k) U2 t4 ]# e% U9 }8 Q% y$ S3 c: @* G
1 q6 l% F4 l9 y* h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* C% W0 v& v4 w y& b& w使用下面代码,对内存使用了mmap函数后:
& x( c$ v2 G5 @/ Y! w, x#include <stdio.h>- c1 C1 B: a0 Y# u |
#include <unistd.h>8 x: o7 P) ?4 r R0 h9 L4 N! r
#include <sys/mman.h>8 E8 [* I4 d0 H8 v
#include <sys/types.h># L! [, A @3 F4 }( [
#include <fcntl.h>
/ ^) ^' z) P9 j% @& ]' H, e4 d4 e, j& C: H
#define SHAER_RAM_BASE_ADDR (0x80000000)
) `! i8 O- L+ v5 c, x* v#define SHAER_RAM_SIZE (0x20000) * i" E4 @7 ^/ X" d/ z
, `1 Y1 }. A; j& N- e! W4 S
typedef struct
; h4 q7 W. S5 h( j) z" y, S7 t$ t( u{& K; P8 r. t V, ]# N3 {
unsigned int a;
$ w/ o* o9 G' K% @, [* C& i$ I. H unsigned int b;# J, ?7 n: R( W' c2 M
unsigned int packet_cout;
5 B* C) E8 I, _: C; o& _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% k8 X' ]% H; S6 [3 N! S
; b0 d3 Q( u: H7 |0 G2 }) h
void read_MSG_buffer(int *baseaddr);' G4 U0 _' k' f6 y
unsigned int count_copy = 0;* O0 o9 x$ P: `; V1 A( B1 \
3 h" y1 h# c/ x. P6 \; m7 k6 Wint main()
+ I2 a" ]3 [5 H) `% C$ G. M0 l{
7 w4 N j, p; B' U int fd;
+ O% o$ a/ T' O$ l int *mem = NULL;
3 V7 L7 Y7 T" U) t: l+ R, r G
/ F1 d$ }( y* G! f1 I if((fd = open("/dev/mem", O_RDWR)) <0)
; P& \$ b8 \: y+ ?: U! j {
! Y& c9 h$ _! z- \, j; G perror("open error");
0 M2 g' G! X0 C9 _: @ return -1;
. }' b. r4 ?8 {' L4 ` }; X$ f _' {; X' }' t, j/ c' `
% e. z7 d" [& c8 E+ m
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 o5 N$ q* M# S( k" V( J% X
# a; D6 S5 y% y8 `
while(1)
- b# J- e& Q& b) k; c1 f {! U7 l/ ]* w) U. l5 H, {
read_MSG_buffer(mem);
. R# V' \8 `: G: S }
& i8 D$ f7 q" ]}
( i- N' [ N3 E, p9 o2 {* i6 U9 }
void read_MSG_buffer(int *baseaddr)# c% L7 _$ C1 _! y7 c9 e
{! M8 e7 G" v1 O% K6 M4 C' h
pRX_MSG_PROTOCOL pshreRAM = NULL;2 J# a- S& `4 V4 L: q- b% U
* ~" B- H/ L2 K pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" k0 h( x+ {% F1 D4 G1 D& Y& [' a% F) V& x0 B6 O1 Q7 w
if(pshreRAM->packet_cout != count_copy)
8 c1 U; d/ z; a i! I. Q {
6 S0 _# I1 P9 p. O printf("a is %d\n", pshreRAM->a);! W% \5 ?( |/ b5 h G/ M
printf("b is %d\n", pshreRAM->b);7 [/ v3 o+ c4 ?# [; v( i
printf("count is %d\n", pshreRAM->packet_cout);7 r( C! V3 O- v
count_copy = pshreRAM->packet_cout; Q+ h, z0 ^8 O9 l; X6 E
}
& X" T; ^8 N, a! Y9 }/ l else1 {* u! ^% X7 a: T. l+ B- ^$ K( b
{
2 W! y6 P7 r0 \6 y/ e printf("No effective message!\n");
3 _" @ S- B* U/ m7 E( C }: _) ~- g, w/ [2 n
}
: D4 N( g3 O/ M3 x! ^+ m0 b2 Q; f
/ l, a; M: b; ~* s* n8 l+ N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% a2 t0 t& \$ j) N2 j6 f
. o4 j. E5 b! m+ ]% n, Y+ x% Z( b. Y* n6 \
! G8 K; w5 M+ P7 A- `
% N: {. @8 l; t3 J, @
|
|