|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ K$ }- d: }. C' f0 q9 k, z& r3 _$ Y7 l% M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* S# [: K! o3 W! v' ~
#include <unistd.h>
0 `" I; t B# F#include <sys/mman.h>$ D$ @% u) d; t+ ?; R: U
#include <sys/types.h>6 A" P$ [4 i/ i1 Z" G% T; c
#include <fcntl.h>
: W! h" ?/ f' M
" \0 S# x5 F$ b2 D#define SHAER_RAM_BASE_ADDR (0x80000000) " E7 p" w3 g' e. V/ l. b
! k6 D) E/ G5 K b6 O5 ?typedef struct5 {: N' F* x; s8 X/ f; ^
{
6 D* W1 X( T A# v& u) i unsigned int a;& |2 S2 t4 W! L K; G- X
unsigned int b;
; f% R! b# O2 u. X& N3 F+ n( R$ N/ e unsigned int packet_cout;& L9 j9 O( n0 W4 x" |6 I! H9 b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ {: |* E& K+ N. K
1 X; G, u9 y7 p* C. q. Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' ~& {. d# u1 X3 w! r/ ^/ e
unsigned int count_copy = 0;$ q/ [8 p) O$ Z) c1 C% U* H
! Y' J* y( Q: r+ e2 _7 K- m U3 {' n
9 u8 j4 g0 T$ [3 m; q. f: p' `int main()$ d) p/ D O9 m4 @0 U6 p, N, S
{4 x3 \ @6 |- G8 Q" r& S' Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 D9 g8 ~+ B/ J0 t; l pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 m2 P6 v8 p9 O3 X9 U" `9 E' k6 z( R* R( H
while(1)
. p4 w3 \5 b; `0 T+ G) t( O! X2 _ {0 j; _6 [$ ?6 ~5 h' Y; M
read_MSG_buffer(pshreRAM);
; a9 }2 X9 v8 N' y6 y2 E& { }
" o7 L3 \$ Y3 p$ [" i}# a- w& `6 C8 }8 \
' ]/ O: K4 ~$ v4 U- B# I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! c6 `: r. f. t6 Q+ u( @; i{# N/ q3 F/ K0 i4 T( F" j
RX_MSG_PROTOCOL buf;
3 l( D, B+ l/ [/ n# U
, `( |- P/ ?1 M( v buf.a = pshreRAM->a;8 R' W- C$ V; W/ c& n5 b1 ~
buf.b = pshreRAM->b;/ n8 l0 |- D2 G6 F" m& n
buf.packet_cout = pshreRAM->packet_cout;
# j/ K" ~8 Q3 U
C' A, E) Z$ T: j. \6 p if(buf.packet_cout != count_copy)
c3 Z- c7 x) \: U' b: P {! o0 f* o5 i) z5 b5 S& f
printf("a is %d\n", buf.a);
( z$ `! O! f; R8 s# V9 B printf("b is %d\n", buf.b);
: o" r, X5 g2 L* ]4 J/ ^; T printf("count is %d\n", buf.packet_cout);. K' B y. O3 t/ ?; N4 ]
count_copy = buf.packet_cout;5 m/ b1 y+ I1 w( A' i5 Z
}
f$ v. I: H, h else( Y) H+ p G6 A- o0 U; F6 w) `& Z
{
% I% }7 E* c( Z) |; Y printf("No effective message!");' q0 X4 i& C5 f. Y
}
' d% Q1 Q, {4 |, w}1 |) v/ Y, V. N3 f
; y" W' w% r2 ]4 C
' F" ?# }. r `8 S+ z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 H& I* ]- g0 H1 k' z3 ^7 H使用下面代码,对内存使用了mmap函数后:* C/ U6 F* L7 c8 ^( v7 z! \- \
#include <stdio.h>
" D$ L" ~" S0 [- W) w1 M/ k8 o( `#include <unistd.h>
# L1 j4 B% C2 ^* |* M; w) s+ @$ F! Z#include <sys/mman.h>3 }9 L: T) R% {! b! W2 j# p- s
#include <sys/types.h>
0 z) u0 J L6 r#include <fcntl.h>
/ y# M. E3 f3 \3 w( y+ ^4 ]* [' O9 h& w( t1 P
#define SHAER_RAM_BASE_ADDR (0x80000000)7 c1 J+ y( P* J2 g% d
#define SHAER_RAM_SIZE (0x20000) ( F8 z) ~/ g- l# ]: B$ Q
# e6 f5 ~; `. X3 i* D- t5 mtypedef struct
" h/ s" ?: n8 M$ H! Z{
% N0 M3 C& r* A( z5 { unsigned int a;! J2 W2 j. }% V. h0 A- k
unsigned int b;
k& D: W0 S) u. s5 s/ Y# u unsigned int packet_cout;) ^8 n0 \ p7 l( D4 C* a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 n! l# w3 o% ?. E
7 ^2 a6 j6 m V, l8 \$ Yvoid read_MSG_buffer(int *baseaddr);( s: N; D, L+ k7 h0 M+ ?$ n
unsigned int count_copy = 0;# N7 j/ @8 Q7 L7 y( n# P
1 [3 N5 f& X" j. ^+ tint main()3 |& P6 w/ \7 Y! a6 z/ i
{& @/ o; ~9 W) C) ~- I5 q5 ~
int fd;( S( Q, z2 P |; K! R
int *mem = NULL;9 f$ e, g' o- \$ Q1 D( j5 q
& |% v* M1 g; U. z) k+ {7 D3 M5 W if((fd = open("/dev/mem", O_RDWR)) <0). v Q/ b Y5 o. z
{ ~0 `% o4 {& p( g
perror("open error");
4 v" W: E. s9 L2 m# W/ P) \- z return -1;8 b) M; S& ]& {0 w6 B
}; ~) v5 f5 S Y1 i: |
3 ?: d# ~1 J" s; a- b mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 W6 ^4 D" ?- M, F2 Y' I
: f- m5 i. ^6 F- V' @" ^ while(1)
7 Y) |% D" S9 U7 H. d {
/ q0 u: A. u& J7 s read_MSG_buffer(mem);
% [$ m1 b9 x! m3 i }
) Z: b9 X# i5 V2 r}+ |4 i1 ?# W" n+ O6 U
$ D% f+ b+ J% U' b6 M3 q
void read_MSG_buffer(int *baseaddr), H* i# z! j. ~. Z& \* e3 ^
{
0 F% n9 F s& b( M pRX_MSG_PROTOCOL pshreRAM = NULL;
; g; ~/ _) R( C! ]; J+ j; t( Q6 q6 {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 T6 H$ Z/ U2 F" x
5 V! A4 C! o. J: o3 A- C
if(pshreRAM->packet_cout != count_copy)7 a& Q, a2 H# k: ]" V- F9 Q* v
{
' j* |$ S5 x1 S* B$ R printf("a is %d\n", pshreRAM->a);# e4 n! P' A" H" Z
printf("b is %d\n", pshreRAM->b);
5 l/ M& z) Y& s, Y printf("count is %d\n", pshreRAM->packet_cout);
" g& F9 M% K5 P! h9 h count_copy = pshreRAM->packet_cout;
1 [+ q! ^0 B8 V" m* c0 n/ ~ }
$ k* o# Z8 W( {, e! o7 `! Q& [ else* U$ V! G5 A/ r
{& w' T5 [4 f9 ~; k! r
printf("No effective message!\n");
; T7 {$ E* w1 d7 x# X }
5 j8 Y2 a9 T8 I Z! }8 I% @}
6 a0 S" a0 M0 q% I# l1 t% z5 R( S" W' B$ w" B& I6 R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? w P( n- A4 f- t5 `: t
7 L0 O5 K1 d) V
7 T- C2 q! ~2 ^" s: S
5 m+ T9 o) A$ S8 P$ u. R
# E$ H4 p4 \: s5 y6 z V |
|