|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! O) ]0 M2 x q# t+ Z
% d3 h& Q; U7 _+ x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( E9 Z5 v8 V- z. f1 E
#include <unistd.h>- W- e$ u( Y" [3 L; M. [' d
#include <sys/mman.h>
/ x. j& i/ D/ W# i( e#include <sys/types.h>2 x; e! C9 E5 Z; D3 \4 J2 P3 w
#include <fcntl.h>5 S- x5 j) @! y' |" A3 g, O
^9 Y: t ]/ @0 x
#define SHAER_RAM_BASE_ADDR (0x80000000)
* a& |7 J' M# e: q5 H' }1 H/ P8 P4 E5 \; h) L
typedef struct
2 N1 s. w1 v1 r{+ M! [) D) M+ }7 Z* y, W6 b
unsigned int a;* D: t5 d$ b. a# `! @: t' a: r+ ]
unsigned int b;9 w4 W9 x$ }) R9 J2 J
unsigned int packet_cout;
1 U. y9 S6 ?8 ^5 ^9 i" b( _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) }8 i: a' T* m
0 D3 t7 y$ Y7 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 y) s* c J# [0 O
unsigned int count_copy = 0;+ P# A* [$ i2 A( S* f ?
' C3 n8 x/ ?) w
( o7 Y4 y( D6 L; Z9 ?
int main()% o) t: q, d- ?* [4 i& K
{
3 p- Z& t& H1 s pRX_MSG_PROTOCOL pshreRAM = NULL;7 U( s! q/ h4 q$ Y* E: E+ x
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 u% H; q2 {; v
' t0 L4 m8 }) E- U while(1)
C. o6 @# w! N {1 b0 _* \6 y% l! T1 Y
read_MSG_buffer(pshreRAM);: k7 e+ c: v) K/ K3 k: B4 O
}
& l% v$ h ^9 e2 u) Q# r}% s0 z* S5 W5 _+ y
; @/ R6 e4 @5 kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 i" K# `" r3 A- v
{
; P1 P; x8 R% j; T Y RX_MSG_PROTOCOL buf;
! K# L" ]8 V7 W% z# n 7 X) a( P0 K0 u9 }! S
buf.a = pshreRAM->a;, [: n: f; X2 u0 |8 q
buf.b = pshreRAM->b;
0 {" p# \ L* u4 b buf.packet_cout = pshreRAM->packet_cout;& n2 s$ G4 v' |8 q( n
r& G+ ^! a) v$ f8 F$ y7 }
if(buf.packet_cout != count_copy)2 D' W+ T+ F* p$ R' a
{
5 ~1 b! I! K$ V2 ^# ^; M printf("a is %d\n", buf.a);. v x& ^/ v1 O. t. r9 r; W- m
printf("b is %d\n", buf.b);5 V4 Z: f4 z3 F6 Q& r
printf("count is %d\n", buf.packet_cout);
5 _+ V v2 J7 P count_copy = buf.packet_cout;* u$ r$ |6 ?; n0 D! a
} f+ s6 B( H! D* F( x6 W
else
# B2 U; y) }9 v. Y: O {
! B" H( G: Y- N! P printf("No effective message!");9 q' { W2 J; Q! t# A+ H6 H
} t0 G& E* J1 {* a, x- K, g% _, _
}
3 s; J2 F: k4 `" h2 o% i
' d% W3 Z0 e- D" V$ k6 k, m# H# n* t
4 ]: M# I% ^) D- A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 f4 z, l- C) I
使用下面代码,对内存使用了mmap函数后:7 }, C2 Y6 o% B' y: ?& Z% e
#include <stdio.h>
! R, V8 D( M, L' `# U#include <unistd.h>+ g7 H X* b. K: N' V/ H# a
#include <sys/mman.h>
7 _( E: T. d# ^9 \4 H2 `#include <sys/types.h>4 j- p! l" Y9 B' C E/ A
#include <fcntl.h>
$ z. j4 u) w7 J
" P5 i9 _* w _! M' h#define SHAER_RAM_BASE_ADDR (0x80000000)
1 N& q' L5 {* S: [/ X$ L#define SHAER_RAM_SIZE (0x20000) ~. v* |1 w; m! f! ^) m
7 ^# b2 S% u/ B" K+ m5 R; N" k
typedef struct
* m- L' E0 Z3 G% p }{
5 L' H" A. W) M2 f unsigned int a;8 {% E9 m$ E% f1 r/ p2 \9 m/ |
unsigned int b;
( q# p+ y) U% L: }/ D unsigned int packet_cout;; S8 }+ u _7 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. T4 _- W- i* G6 m4 i
) P2 h3 q( M5 g9 M0 e3 Q
void read_MSG_buffer(int *baseaddr);
- s" s+ x1 Q1 L/ Q' d& Runsigned int count_copy = 0;, v) t/ ?! U5 m/ e' b
) j( p4 s# d7 n6 C6 `" n# kint main()2 j( _0 ?. _! x* ~
{& k$ Y+ y1 ~: Z O+ D
int fd;7 p& f" W c1 a4 B
int *mem = NULL;
5 D( Z; T; Y$ r7 C+ Y3 `
+ y7 O; F) o3 o" A' A if((fd = open("/dev/mem", O_RDWR)) <0)6 j g& i0 I) E# E) b$ @: n
{2 h' r/ d$ G; ?& I: H8 e0 b
perror("open error");
0 f# s- M- u/ _+ w return -1;
8 ~: q9 N0 s1 }" S' w: c3 n }! Z4 r3 N# G; b2 B% j
" e+ T$ s% D& H$ x/ \$ f U3 x% K$ G* f( A mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 P* l) E6 n6 T' ~6 r! c0 h6 l
/ ?' P, e" B7 h: o while(1)
: n u5 v2 N% Q6 D! s( O {! e6 H; V; c+ T/ ~$ T
read_MSG_buffer(mem);5 [: q# |, G. y8 T
}
3 k2 `+ d: B) A# D M' s}- F. C5 n9 {8 O3 X
& U; `0 X+ O9 {0 s5 l+ I7 v
void read_MSG_buffer(int *baseaddr)
u3 x1 n& g7 h* L{+ p7 K8 V! X% z- u3 x* N: ]. }
pRX_MSG_PROTOCOL pshreRAM = NULL;
# z: w1 F5 q. `/ U+ j0 B
" Q, o9 g1 ~ }$ N) b- P0 j pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( w+ q7 G: }7 ^* ]4 z! i
$ U# S; H, b- o ` if(pshreRAM->packet_cout != count_copy) r$ N2 O% ~4 T% L7 W
{2 i& C+ f/ e4 t. X
printf("a is %d\n", pshreRAM->a);# t1 r5 ^( P4 S# k: R
printf("b is %d\n", pshreRAM->b);- [! J7 [% M& i" `9 g
printf("count is %d\n", pshreRAM->packet_cout);
( D) w5 C. w/ u- A4 R count_copy = pshreRAM->packet_cout;2 b% c& S5 J: e7 ~$ F' R4 {- ?6 R
}
" L3 b8 d& R8 v else
/ Z5 ]/ [3 _) W M% N- {( y+ E {# Y. v% |+ b5 k0 z" I
printf("No effective message!\n");: S2 L5 ~- B$ ?- J" [) S+ ?
}
) g/ y6 A9 R1 U' f}
# T3 g2 h$ X2 D/ A9 `; P0 ^" g' u$ T. l( G2 \* {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ @2 F& D" I8 s U2 {6 x( V2 T/ \6 A- q8 z: d1 S2 t8 q
2 \ ^7 Z. p1 m/ ?: ?- ?& }' o
, V7 ^9 ^, Q% W: X+ t5 [ Y Z& U2 y4 ?
|
|