|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 w9 d* N) V- A# c
: P' C* q, ^' [& _$ j% YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ ]& }6 h9 Q" b8 M& y#include <unistd.h>! @ L- s4 g/ h
#include <sys/mman.h>
( m6 c% M, a1 ?$ R! \5 R#include <sys/types.h>
7 B# l( @/ R$ D& k9 t6 | ?#include <fcntl.h>
( R; l$ l; d+ }$ o6 p, I9 c9 h9 k: Q4 s3 M% R5 R9 @: X5 f, G
#define SHAER_RAM_BASE_ADDR (0x80000000) ; [* z2 i+ D* S% S3 E: Z
/ Y3 j& l" `4 j l, Ftypedef struct2 _ i" r+ ]( q5 G$ x% L( }
{
$ @( M" B, h1 t6 h7 t unsigned int a;6 V5 Z) {6 v" [, Q+ a3 U* u" Z
unsigned int b;
' B6 ^4 C; E& ]$ ~ unsigned int packet_cout;
Y0 Q* Z" T- {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
H& l9 B! ]6 V- `/ _4 G
5 u- f# B7 i5 [# _/ K" K5 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, H$ n9 L+ S" f2 S) a$ R! gunsigned int count_copy = 0;
/ y1 E- W. D$ S) \4 [9 g/ ?) \/ D* P
5 L% ^3 c2 n4 _" H* D4 Oint main()9 f$ ]0 O6 W: `( Y7 c
{5 ?6 e2 y8 Y; d
pRX_MSG_PROTOCOL pshreRAM = NULL;
( S! E" N) k) w( t' e) Y9 e pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 C! |' q) W$ ]5 U) O$ j# Y
Q- t. ~, t; n, }& i% I while(1): s" P. R1 C, r# n- w0 H: d
{
( g+ x; E) e" o* g read_MSG_buffer(pshreRAM);
! ?( I7 g4 Z( e: p! r7 A- R } i$ U7 r3 W" p% ?. ^
}+ W+ s5 k+ G- M* Y% [
+ Y4 u1 x0 c, ]' \/ g5 W, b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- C8 k: H& d' `& h* L8 J
{
/ \+ R6 b* ~4 _* N RX_MSG_PROTOCOL buf;
4 b) L8 g- }8 H
, |, }( E6 b$ J5 M/ m# F buf.a = pshreRAM->a;& i, C2 e$ d+ F6 \ k1 d( w& A
buf.b = pshreRAM->b;' T1 F/ z: A. B
buf.packet_cout = pshreRAM->packet_cout;& e- f: Z. f9 e6 n5 W: {
3 G0 @6 j$ V/ z* ~% [0 l if(buf.packet_cout != count_copy)9 S* M- @/ q2 W5 B( z
{
' ]9 ~6 ?" K% v; b1 G% ~ printf("a is %d\n", buf.a); j" ]7 Y% y7 m. h8 C
printf("b is %d\n", buf.b);8 x0 ?' T* Y/ S( n% x d2 _
printf("count is %d\n", buf.packet_cout);( D3 Y0 k$ \2 ^
count_copy = buf.packet_cout;% j; v" K1 w2 l/ k) \0 S; i L
}6 ~/ P6 h! l$ u4 b) H* B5 B9 Q
else
- R8 q& l, @; n: u4 [' ]$ a {, |) k7 W, k- [! i
printf("No effective message!");
4 ~' h8 i1 I8 h. S# R" c }& s d7 }! u5 X T& m
}
% ], |7 k3 X( `; s1 E" l7 U4 C0 i3 x& U& h. q
1 j8 V6 q+ k3 D! \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& I r2 q, |4 A* z& f使用下面代码,对内存使用了mmap函数后:6 P0 \7 @- M5 g4 n ^/ J
#include <stdio.h>& H5 e* M# e4 \! X
#include <unistd.h>+ D- {, D0 a9 c6 e5 i/ @
#include <sys/mman.h>8 c* V4 R$ x b3 D. c P- n# y
#include <sys/types.h>
! d0 m6 j" H& X8 ^& Y7 m+ P#include <fcntl.h>
4 ]6 W _* o- c9 R& c7 C, z
. {7 \! f- W u#define SHAER_RAM_BASE_ADDR (0x80000000); ~5 y" @7 ]' q ~6 i! w3 S) L
#define SHAER_RAM_SIZE (0x20000)
i$ q6 F6 ~3 x, [1 @) E
9 o% K7 ]0 B, \# Atypedef struct
- O$ i9 X3 m. ?# `! p6 }# h{
3 l" P$ c2 A$ E$ v1 \: R unsigned int a;; g' T9 X$ N4 j5 m
unsigned int b;5 ]% q2 g% E+ R" k- J7 {4 g
unsigned int packet_cout;+ n7 Y, Y7 S/ p6 Z4 h; V7 M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. @) s: \ e( f; I6 @5 z; l1 @! W
, z! F* H) X/ C5 G
void read_MSG_buffer(int *baseaddr);; i6 }* l4 B( z# M% g$ Z
unsigned int count_copy = 0;
; g( X2 d6 R1 \& K/ T# m! N) E) R# }4 f% i$ n) k" @
int main()4 c1 s7 D+ h( j H0 ~1 v0 U
{
& r9 q, q) [: h1 ^& m( r) I int fd;
1 l# o* p8 e4 p; G: @* @* O2 J% {9 i int *mem = NULL;' c; `) u9 m" t9 Y& k
) Y6 Y/ P) r& G5 p3 G
if((fd = open("/dev/mem", O_RDWR)) <0)6 [5 c& T, Q; G$ O
{
$ u t$ h6 u3 I3 _! n! ] perror("open error");
( U3 `4 [9 y! l# c- Q7 q0 S" |' N& ~ return -1;
: q/ r" k+ W' A2 J6 P }7 Y/ ~' x6 e, X, g
' t# g6 Q2 F1 V' _ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 `2 V; j5 t. n/ I% v% X, X
" o$ K8 X1 l$ s+ r; Z* g; j( R while(1)5 P, j& _( d: v' s
{8 Z! F# C6 N" |; l. i8 L
read_MSG_buffer(mem);/ n5 Z, M2 F+ l8 H
} * b6 I+ W9 m8 n4 [; R
}
5 \6 e" X" E8 P# F
) v4 p* b) F- F* R: c! {void read_MSG_buffer(int *baseaddr)
3 p/ P3 ]( Q/ T& Y' u* H' W{7 P' H0 Z, p" Q. t6 J
pRX_MSG_PROTOCOL pshreRAM = NULL;
' O8 F' j! L( ?7 F" _& w: ~4 a- n+ g5 q$ W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 B) K/ ~' r# G ]; J+ F8 w6 h# n) s: N& ~, q5 m0 G
if(pshreRAM->packet_cout != count_copy)# R7 V; _3 d/ e1 m- f- M
{
: ~9 z' t8 k: K1 p4 ~$ _3 K printf("a is %d\n", pshreRAM->a);/ ?# j6 }5 g( Y. N
printf("b is %d\n", pshreRAM->b);4 n$ m. o, Q! @2 W+ C
printf("count is %d\n", pshreRAM->packet_cout);9 B# m1 S5 k$ T& |: b9 E
count_copy = pshreRAM->packet_cout;
: \+ A" c( U) y: x" \ }: O% \. _0 V4 l; r. P$ Z7 T
else
. w6 n4 @, b! w3 i {
4 r8 p3 m1 ^9 W# _ `( |% b1 t/ F printf("No effective message!\n");, a% ^% S- B; H$ e. _( K
}
8 `2 N# H) w! M c0 f}
8 R$ X) l9 J# B0 f7 ~7 K) ]. \, ~. s4 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) q$ j2 j! X2 P$ a2 P+ }9 {0 T. N5 W7 g& W
. \" Y8 l# n8 G) S
* b5 o! o, ?' V' d2 d0 W8 ~
2 A) M( s6 {- w5 e |
|