|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 E- p. N+ m* e+ [1 u
1 e# d) A* J& b/ ~OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' P* g$ A/ j& ]' \#include <unistd.h>
# F6 M' @/ x9 I3 Q8 M+ u* r# b#include <sys/mman.h>
: c, v) h g2 Y) q' d, x: C5 b#include <sys/types.h>
w4 G! V7 @2 a [' x- F#include <fcntl.h>& k' a/ @- Z+ l# _1 G2 B! M; y
; c1 }3 n+ Z3 W' p2 w2 V/ t5 _#define SHAER_RAM_BASE_ADDR (0x80000000) / J5 X( y3 m* ^- u
: a0 k% P8 T( W9 Qtypedef struct F0 m( K5 G: K( b5 x
{4 ]; D& n$ @( O
unsigned int a;* ]! D/ g3 ^3 l# R3 Q9 |
unsigned int b;5 X+ Z) i# Q* m) Q$ @. V; h
unsigned int packet_cout;
& ^. w3 }6 S% ?7 k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 k+ j# ?$ d' Z* c# C4 F* a
6 p/ F& F) U+ hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 W i( ^1 H( s4 o' vunsigned int count_copy = 0;& g; Z n5 q9 F3 r8 h* b* ~
% Y% b6 w. R' l6 W4 X
9 v. D7 p7 I8 j# Y1 Y( mint main()
" }6 \* P! O$ |* D8 J( } f& e3 h% Q{; P6 z# i9 u( d+ n1 n
pRX_MSG_PROTOCOL pshreRAM = NULL;' ]' u4 C& A" x4 o% a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 E8 ^ }: t+ z
/ [8 L" v/ N; X7 E" c( p& U& t while(1)
3 A) N, d" F5 k$ F7 v% u {: N; n2 b2 {; M/ t! X/ r2 N2 O
read_MSG_buffer(pshreRAM);6 t: C8 e3 G0 t* U7 C2 t$ y" m1 S# g# X
} 1 q& ]& x- O4 P' \# w9 m
}: E4 ^- O$ K' ^/ l, x( G9 |
+ j; E) S: f; v& z$ O( ]! Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 k e8 K% Z+ p. v
{
8 n& J4 n: _. o, X& _2 t RX_MSG_PROTOCOL buf;6 s* W! x* ]0 T) C) S
! m! [! j/ i' f8 j( Q. H buf.a = pshreRAM->a;0 e2 s$ \3 B7 }# q% J2 L
buf.b = pshreRAM->b;
! [0 m7 r! m, z buf.packet_cout = pshreRAM->packet_cout;
: Z& G# j2 Z) c4 i, f. b1 G/ V
* i( Z% ~. [6 o1 r* B if(buf.packet_cout != count_copy)2 F& U7 m/ y- n6 ~5 y
{
7 o @3 ]! e1 \ printf("a is %d\n", buf.a);) S4 G- {. O# b8 Y5 @
printf("b is %d\n", buf.b);9 t% i7 F7 r5 [% i6 J
printf("count is %d\n", buf.packet_cout);5 ^; N2 U4 h' K) r7 \, {+ y
count_copy = buf.packet_cout;7 r, n8 E, z* F! ?8 b, N
}5 S" j. D# \0 Z* K r
else0 S8 U- [4 a8 l+ ^. j+ x
{
' j8 p6 ~/ ^( q- e0 L, o printf("No effective message!");, ^$ R/ s8 Y9 ]& E
}. B, T+ f5 ]% I7 g' a
}/ U4 B; |7 _$ r7 }, [
' o$ f4 A @8 u. e4 V+ c
# E: c! z4 e2 K2 j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 ~8 w7 V' L8 {* N3 w: F5 u
使用下面代码,对内存使用了mmap函数后:. F, s" X2 M5 N8 r6 \ W
#include <stdio.h>; A/ F9 h% \ o) l: b m
#include <unistd.h>8 j2 _$ X' R) W, S& [3 o0 C1 u, I5 Y
#include <sys/mman.h>3 P( @$ ?$ R: c/ D! \
#include <sys/types.h>2 V) m1 u7 f% X( K, r* Y
#include <fcntl.h>
! J2 C/ A6 T0 Q( V# e# R4 N
9 C9 {& C* D' S#define SHAER_RAM_BASE_ADDR (0x80000000)% _8 E, }0 o- u" s5 o9 R2 l
#define SHAER_RAM_SIZE (0x20000)
* v7 ?& z8 N) T! L" a9 X( U7 o" W0 @& Z- S( n @. e
typedef struct
+ B% C% T6 X+ m2 I7 b. w, M{) `" ~% H- O H
unsigned int a;
% s" P" C5 |8 f* i unsigned int b;
: A X- H! d3 B6 ]4 Y unsigned int packet_cout;2 V3 W2 ^6 I4 i& J4 v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ E' U2 ^, Q4 _, \7 s2 j2 Y
# o8 e) R) V/ x5 V$ l
void read_MSG_buffer(int *baseaddr);+ x$ u+ F& N/ {+ |! O
unsigned int count_copy = 0;9 B" ^! J( s7 R0 i% F& j6 m
8 f3 V; Q6 b! b% q6 m8 C. S
int main()
0 Z2 B+ m9 v: p2 I1 Y{* | K* o9 g, G0 p% c G
int fd;
! ?2 f9 g0 F0 M! ]4 @2 S' L int *mem = NULL;
" ]8 }- M$ D( ]8 N2 ~; m" v) y8 n
. X; E$ L; [( e! q if((fd = open("/dev/mem", O_RDWR)) <0)
' |5 S4 D. k& e7 \ {& B' V# V/ d. v% [1 ] ]% k
perror("open error");, K, y% X) _) i% _
return -1;
( h- J2 }8 X9 k* m1 w }
( a+ {* U, D$ ?6 V
, q# `2 S( L0 D mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ r7 e ~; I( u) V- r
2 H* ^& M& w6 ^' A0 I+ \
while(1)
. T G O0 o4 O* f {; W: W; ~. p% w O
read_MSG_buffer(mem);: ^) w) _! u; V
}
% F3 G- i* k' m7 N. x% y}
+ g0 Y6 ~' |- w0 ?; U. s$ ^4 U1 \# Z j
void read_MSG_buffer(int *baseaddr)
# w$ F, I `* I* H& j3 r; h{) n6 ?, `( v: U( L& b L' h
pRX_MSG_PROTOCOL pshreRAM = NULL;
- g1 O. I! t& x% A! l
T* A: m5 `8 G) ` z- q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 w+ i) k0 p: r% |" _4 q
* _% c# I; X! l. ~ if(pshreRAM->packet_cout != count_copy)
4 p, R+ I- p) Q. \# n {
# n" u5 F7 F$ Z9 x6 T. p, ~ printf("a is %d\n", pshreRAM->a);
" W& h( b/ d! x, O' m3 Z# @ printf("b is %d\n", pshreRAM->b);4 X, t+ f7 {! r7 D
printf("count is %d\n", pshreRAM->packet_cout);
7 w0 i3 N+ C } count_copy = pshreRAM->packet_cout;
+ k: `" B" K+ N9 I }
1 ^9 t9 l7 C; h Y else
, f" B+ f* ~! J8 R% D {4 }1 c3 d; u- d7 E
printf("No effective message!\n");
6 E, ?9 E: v0 }" y! N }
8 P5 @6 j% e: e* a) j5 {}3 g5 F0 ^6 Z7 V8 N& o
7 t! f# j) {$ @4 @ |4 [" D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 D' |) q0 S2 U
+ S$ K3 ?8 {# A" m; s- M2 c# D9 T9 C
0 J$ m5 R1 ^7 y! a
! ~/ Y5 m. q) e* V! H! ~3 }. |) o! E" |5 z) M6 t( O
|
|