|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: ^& g y) z+ L2 E7 c( @4 r/ O2 n3 Q+ I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 @; M3 t& k! d#include <unistd.h>
# ^* j" d9 ?! z, j* g0 b% j#include <sys/mman.h>1 R; l" I; [( @) p+ j
#include <sys/types.h>' y# D5 r% C5 t/ g( h. F, M
#include <fcntl.h>
5 l2 `+ ?+ E. B! ?1 j( g: t2 E; [8 }' k
#define SHAER_RAM_BASE_ADDR (0x80000000) 9 y) t6 w2 d3 e, Y
+ J2 ^( u2 o! `: ^+ m' C! [& xtypedef struct; ]5 @8 L- |$ }( l
{
i1 v' ]& R7 h6 u F2 }& u R unsigned int a;- o5 R" ^8 \/ B' m3 I* J1 ?
unsigned int b;. p) O) D# w9 K3 u2 `) Q2 H
unsigned int packet_cout;
. a' i2 ?. S/ S. q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. n% Y9 H- S$ s4 x' ]% J4 w
$ f* p4 Y" m; ]8 u; m4 s4 b# yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- i5 l# Y+ K5 P/ [: y, E
unsigned int count_copy = 0;( y: x2 ]: B, Y- T6 R
! ~6 m. ]: x' W: F) T/ V/ B: W: i* o @6 m. b4 E
int main()
" C' _" f9 T9 O0 I( p* i) |3 v: ~{9 z" [9 f/ B2 a! {
pRX_MSG_PROTOCOL pshreRAM = NULL;- w+ I( ~) s; W' k, ^
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: W* |( {% s7 b% P( k5 W
& s1 [- k4 p1 M% M1 z while(1)9 N0 P! k; f: x2 _
{' d7 l% g P" A- n' \
read_MSG_buffer(pshreRAM);
. @- Y3 l/ m" E1 l } ' d9 x) V5 M3 x- `, w2 R* J
}
8 a! \; }: `- c; {3 J7 I
0 [0 ]- l) n1 g7 ]5 X% b' Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# H8 f' B Z5 s5 J5 U1 \$ ^' g
{4 e' d+ `0 V' K$ l4 L8 U' b
RX_MSG_PROTOCOL buf;
& ~+ V% ^- E+ @& r: V) x7 ]
: ?3 g1 P: n0 k buf.a = pshreRAM->a;
6 s9 q8 U% f- C: o' e buf.b = pshreRAM->b;
$ C3 n" [. ?3 V5 y' J( D buf.packet_cout = pshreRAM->packet_cout;8 b: {* ~3 P' C0 {9 P7 ^! T
- Y$ J2 t! Q5 d" t/ } if(buf.packet_cout != count_copy)1 m0 t- y. M4 A1 |
{
7 G% p2 l c, U' M printf("a is %d\n", buf.a);4 y$ y7 o) K+ D3 a( i$ R1 ]! _
printf("b is %d\n", buf.b);7 S: m' X( C( Y9 R
printf("count is %d\n", buf.packet_cout);+ p4 R) ] |8 {; J0 `; L$ G
count_copy = buf.packet_cout;8 L: c) l* W6 W' \
}
! @* a y6 @6 D else
3 T/ F# f# p2 g( W' }; a$ ` {: m! L6 }0 [5 Y% |* I2 I, O
printf("No effective message!");
3 y" t" X! ~" g( U& M" k. }5 Z! Q% v }
. D" p9 d8 |& Z! r7 o0 K+ @* X}
) F( D U( E5 s4 A' n! q
" U/ R- Y, b' G, W( P! ?) m" u3 H- U- M9 i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# }/ v$ X0 N) h7 n" E0 t使用下面代码,对内存使用了mmap函数后:, n: x& y1 q/ o4 C1 l
#include <stdio.h>) `- d$ E; D8 t& I) c
#include <unistd.h>3 L4 N: U1 N# v
#include <sys/mman.h>1 L( s( [7 X- W
#include <sys/types.h>. u& Z5 W9 p! x0 j
#include <fcntl.h>
' g8 X8 B1 D% _, A& E( t
" {% t a" g; ]. c+ y9 K#define SHAER_RAM_BASE_ADDR (0x80000000)
7 s! j5 v: D! E3 o6 L4 o#define SHAER_RAM_SIZE (0x20000)
( l; X1 {! B+ ]4 D! G* l; O
$ c% N W) d: P8 `# x) utypedef struct) M2 `$ _, w$ U7 _4 A- Q0 Q6 a
{
) t& k8 r3 r9 H6 @2 X- Q% j unsigned int a;
% d7 P" \" `) [4 d! h5 f* k7 l unsigned int b;7 u3 P$ Q0 [6 u+ p1 q& b- u
unsigned int packet_cout;
' E" x. O A o7 C7 r M& g0 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 ?5 J6 [, P2 l/ v# A0 K( W
# Z ?$ W/ ^4 uvoid read_MSG_buffer(int *baseaddr);" w+ O3 T" w$ h( K6 _5 |6 K
unsigned int count_copy = 0;
+ I0 l c5 _% A7 \$ H$ T( y$ B6 K/ ?9 H
int main()
- ~3 g! }5 r* o5 @3 L- w1 \{9 d! s8 p$ M, Y$ L/ X" l
int fd;' [9 {' f! v$ h
int *mem = NULL;
4 r9 k0 l$ O2 J: u6 W$ d" y3 k6 v+ z
if((fd = open("/dev/mem", O_RDWR)) <0)1 e) I E0 F# I: _' w
{$ v+ Q) m/ ~2 p8 c- O- \
perror("open error");# M" _$ l# M/ b. S3 z
return -1;9 \$ J5 x6 j7 s2 F# d% q4 c$ b
}/ Q, t' P( o) J2 Z* f
# z& }9 ]$ S0 U' Z mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: X1 j; V5 S9 k# ^9 C, ]5 m' _$ P, T; u4 M. ?
while(1)
; F! I* E! [1 ^) [ L- r# v {
" I: m t+ x k1 x+ [' n* n. l read_MSG_buffer(mem);
, u% G1 h3 ~# c; i: W }
: C X, |9 ~$ v}) b( q7 f+ ]7 J/ y% T4 _2 U
1 S" l& S" e* P! v, _8 Avoid read_MSG_buffer(int *baseaddr)! l" W0 l2 s2 |# p$ `' W
{
3 ~3 S2 f' v5 B3 t6 d- _ pRX_MSG_PROTOCOL pshreRAM = NULL;
# B7 E4 E$ f8 H4 p+ h+ t
* R, g' Q" y* m: S5 T: S; S2 Z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 u* u/ K8 T& K
# Z0 J6 l- }6 _
if(pshreRAM->packet_cout != count_copy)
, O# `) B! @3 ~" R {4 K6 l" a* N$ o# C) K& p
printf("a is %d\n", pshreRAM->a);, Z- _2 S2 S4 i( r. j
printf("b is %d\n", pshreRAM->b);
. Z$ H+ u& V& v* h' i# B; V printf("count is %d\n", pshreRAM->packet_cout);
\% {3 ]+ l" Q$ g count_copy = pshreRAM->packet_cout;
: ~# |7 h* R2 {0 \ }4 H8 O; a; e, C$ A8 X3 R
else; ]2 K6 G( L! }8 d- e: ~
{
+ x. c: ?$ D6 Q9 H/ U printf("No effective message!\n");
% S @2 @/ t$ i0 w3 Q" L }
" b: s. b7 c$ g/ o& \}5 {* V( Q, [) g- q2 o
: G( u$ b- d$ u3 f8 N) v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% D3 m4 t$ a/ \
' G, }: \2 o# U4 ]& B/ j5 j: Q* `- `% L# B% [4 F
( H+ u" l& w( J7 y/ M' Y. k( G
8 [# ?& r8 t8 k1 d4 _4 Y
|
|