|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / A5 H2 O+ d* d1 b I
# w* B% i4 |6 n; o4 p# aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ c- A3 d, A: _4 s( r; Q
#include <unistd.h>
& B0 }% H1 H6 C, v. n4 _#include <sys/mman.h>
U$ b' G" b$ o/ U#include <sys/types.h>
% a5 A) a! p0 i) U/ c3 z9 m#include <fcntl.h>7 J/ N+ |2 W2 Q8 ]$ S5 P
5 J; i$ S4 u, D9 h( y3 u#define SHAER_RAM_BASE_ADDR (0x80000000)
9 p3 a8 x* p1 i. T+ D
, h5 ]8 e- d; e/ Btypedef struct
3 n* W* m; B. X9 b2 Y4 {& F, V3 K! P{. B2 n0 R5 P9 K) v8 M
unsigned int a;0 Y+ x0 G$ w1 x, L W! ?
unsigned int b;. m' s# J3 d/ o( o
unsigned int packet_cout;- [6 E. b& C8 h! O$ P8 q4 u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 R; C. k5 V: C- Y8 z+ p
8 b2 d$ C6 v1 Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( W) b( C) k/ a, F
unsigned int count_copy = 0;
$ e' ^$ w+ _6 o) T$ |5 I5 m2 l6 v, m8 O2 n) w- C
3 ?; i+ {0 C0 y$ Yint main()5 U$ Q' k+ b9 Y6 R9 O! V
{
1 t0 D# M# y& d7 c4 S8 y pRX_MSG_PROTOCOL pshreRAM = NULL;
: V( [ {% N! i; e( X. C! E ] pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) R1 N' p: l2 p c* w1 r7 \5 Y( _- f7 s3 D& u
while(1)7 p- s7 ?/ d. Z. z3 Z" }
{ u3 s* @# E- {2 h: |$ |
read_MSG_buffer(pshreRAM);
8 o0 R6 M9 e9 c6 \5 d X } 8 G6 |( {9 K, s' A7 E F! y9 R
}
9 t* N& a) b$ h" k/ s
2 A R3 X/ b; y; \/ q) O. y8 U. m* E mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). ]# K" _3 H: M) `
{
& x/ E2 [ h3 b8 M1 _+ l3 L( z/ K0 L0 V RX_MSG_PROTOCOL buf;
! ^& S7 t" }% J) j2 s* ?* M
1 M' k% l7 o- R1 _ buf.a = pshreRAM->a;
1 p- {" d2 ]& n buf.b = pshreRAM->b;
# k$ ]; C. u" k5 S% P buf.packet_cout = pshreRAM->packet_cout;2 F8 j2 N' C) F, m) q. x( I
; a6 `# h1 j- Q5 b8 [
if(buf.packet_cout != count_copy)+ ^$ D- [, K& u
{
; b% ~" k2 S- A: z printf("a is %d\n", buf.a);
; y7 \ z- G/ ^, T4 _ printf("b is %d\n", buf.b);% p3 `. s" N$ a2 J; G, w
printf("count is %d\n", buf.packet_cout);
1 F7 M! v- a* S3 ?* B, o count_copy = buf.packet_cout;
# j, J; |( a% `' X' e9 J }' [4 V1 K5 z3 U( w
else9 z5 {7 P" m/ d# @
{. w0 M; S* l* n2 B9 W
printf("No effective message!");8 k1 c l5 b; _7 [5 ?" l
}( M1 [. }4 h# n b1 p% [
}4 Y; z2 w+ ~- d6 ~! ^% S( U
0 R7 L0 t/ ~; A1 \
: D9 G" |0 ^/ O2 S: U. T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
Y5 t8 O3 R4 T8 i+ e使用下面代码,对内存使用了mmap函数后:
3 F" P l; ?, U: {7 n1 ]! m* T7 s#include <stdio.h>0 q2 H: |) _1 O3 L& C
#include <unistd.h>
6 h& B1 I5 x7 q; @" a0 i# [. V. D#include <sys/mman.h>
, Z. @/ U1 f7 f" d#include <sys/types.h> `1 g- ]6 H! s# B% X2 |9 |
#include <fcntl.h>
' u( c' X* s9 c. Q( Q( J$ [; L* u1 [6 O' w. y1 r) h
#define SHAER_RAM_BASE_ADDR (0x80000000)1 p! H* ^7 a# G$ l9 G4 ]. m+ }
#define SHAER_RAM_SIZE (0x20000) 1 R8 @$ L$ n% T. _* [- t' c" r- W
; U& V8 I* \+ b( w
typedef struct1 ]6 z; _/ ] U g9 L2 A; M
{& D2 H4 V6 [6 p! j V Q
unsigned int a;. f5 [' o& g% E3 \, Z
unsigned int b;3 Q; B9 j- _6 K
unsigned int packet_cout;
, k% t) n3 R0 m( Z6 O& H5 x+ h+ K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 `: e+ j% b Q0 ~ ]1 w- W; \
4 o: q. T V2 X$ |: f5 A
void read_MSG_buffer(int *baseaddr);! C1 P& ^2 A2 e; ], J x5 V
unsigned int count_copy = 0;
- p. F# a/ g. ], T: q G2 y
: j5 L% x* d2 B* i3 L5 Nint main()
# A" G- F9 V2 e. {{1 z9 a- D5 T F5 }) R8 S
int fd; ?6 s, x2 f9 B5 ~% k1 n( D
int *mem = NULL;2 ~ x0 F+ P5 _5 X5 e
- t2 Q& h3 s. C if((fd = open("/dev/mem", O_RDWR)) <0)
, r3 Y7 z. q$ q {+ M4 M3 Y U6 M) @6 p
perror("open error");
% q7 k' ]( T B return -1;
, M# Z: P: w+ X* V; G9 U }
9 L! S3 g# }/ t
4 g; A# B8 T# e( y8 Y mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 g& A( R: |4 m; e
. l1 O2 X, K6 L2 C% w while(1)
% O+ U U* R3 E- Y8 D7 G m {# g0 z: u' Y! K& h6 j" @
read_MSG_buffer(mem);6 f8 d# t( D: S/ N* T3 ]
}
+ i% O( G' Z" G& D0 P) R}" c ?- ?* a8 D* T& @: @& C
# D9 K6 e5 v0 ^( q' C
void read_MSG_buffer(int *baseaddr)$ ^& z2 Q- w }4 m7 F
{! R- A& ~7 r' i! R c: ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
' H$ [% X0 b- _. r f ~! u7 L3 t! V
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) ?5 `7 @- C1 g3 s
1 X' b* R2 k0 \" S. K if(pshreRAM->packet_cout != count_copy)$ m8 H1 @# @3 }
{
$ o$ `: G: }1 O printf("a is %d\n", pshreRAM->a);
$ c. `. n7 W, i5 x- ^2 t printf("b is %d\n", pshreRAM->b);+ J' ~7 g6 G5 K
printf("count is %d\n", pshreRAM->packet_cout);
w$ o) S9 a6 x count_copy = pshreRAM->packet_cout;
5 e9 W* C d! @4 W& c' G }
% x1 p, K4 W+ q4 G5 e0 |5 y1 m else( q# c1 o6 D- l/ f' @! L
{# }& v7 K i5 G( @' i% A
printf("No effective message!\n");7 J8 s7 y S, M+ q8 j+ j/ q) H
}
* j5 c) t9 ^6 s) v+ o& y2 { } f0 `}) W! [9 f1 H/ {6 ?7 _+ x( Z
; j7 c8 W6 j9 c2 h) Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 L" x( p |( O8 u# n/ J! J8 Z r0 b3 p
/ u ~; Y. n% H
4 [/ S& X+ Y' F$ M) T
6 A* E3 U4 N( m& ?. o |
|