|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% d7 p) B# o$ {/ {$ r. n, O: t/ A; J8 U% x% y K1 s J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 p3 ?/ V& S u0 N. ^! Z1 ]5 [#include <unistd.h>9 \: g- J! @2 A
#include <sys/mman.h>- n! S- u& p" U" b; I
#include <sys/types.h>; X0 A( L" S4 c3 y7 N& t
#include <fcntl.h>* v8 N* R7 l9 k8 h* O: T
2 x5 l! @) p; A9 O% A8 A#define SHAER_RAM_BASE_ADDR (0x80000000)
$ S7 ^8 v9 F4 o1 L9 v$ d Z4 w
3 _, l x/ w* J; }7 {% V" ptypedef struct* \& u. ?3 l/ `% ]- s
{/ r* s; v6 I* _! h+ g
unsigned int a;
3 i5 E3 {4 D8 B. W5 z unsigned int b;
8 U. T* {) s9 ^: k3 O N unsigned int packet_cout;
% }2 e* v. Y8 a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 e! f; F; z6 s' m/ d4 I3 p
0 ?. z4 z' z s2 l* H% c3 y6 \8 svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 S, F1 o- P' k1 p
unsigned int count_copy = 0;+ ~% | i9 z% q! y& s9 Q
4 ~) y9 I* i( }" a/ @
# O3 N( L: P( q# U; w6 tint main()
( [- X1 u8 X' j2 J/ _) i{
& Q# `+ A$ n+ R T3 C# I pRX_MSG_PROTOCOL pshreRAM = NULL;) H& U1 i1 D4 j* N+ a3 A
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" z% _, r5 t5 a7 s$ v% N
/ D/ H& N [1 @! ` while(1)
4 A; J/ l& Y" f! u$ H {. ~" w" @+ p |+ J( E1 V
read_MSG_buffer(pshreRAM);
T2 O, `+ B: X3 g( J( O& n }
. q6 E6 L! F2 `) u4 m4 }! r. V7 ]}1 \" x6 k: Q. D6 V
* z! S! X6 U$ x+ I( {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- R/ H E* u; a) @{
4 Z+ Z( o# R" k8 ]( F" T. b/ p8 l RX_MSG_PROTOCOL buf;
, G p" H- F* {2 t' x 6 [2 F% w4 p; v/ b4 e' Q2 f
buf.a = pshreRAM->a;0 c/ y0 b- ]! Y% Q i* m# v: \
buf.b = pshreRAM->b;
. E' G2 p6 x0 ~+ ]; t7 {8 \ buf.packet_cout = pshreRAM->packet_cout;
; g% a* I# a- c. I6 a6 p; l
+ s+ X4 M6 q) G3 c" f if(buf.packet_cout != count_copy)% E) ?, l( R$ l7 P4 p# y
{" E8 r: A, M1 C* U
printf("a is %d\n", buf.a);/ F2 w; w9 @0 e" U
printf("b is %d\n", buf.b);
) r. e/ ?1 m' k; }$ M, B/ d2 b printf("count is %d\n", buf.packet_cout);& z/ M& [! h) [4 ~: |2 a6 p
count_copy = buf.packet_cout;
7 D; x+ t/ |( R' k5 K+ P: t0 e }
4 v: v, t+ u( K: k% o else5 U; j% U$ t6 r; F3 ]3 |
{
2 x' A- }: c/ A printf("No effective message!");
% d7 a5 F/ F# M% s' ] N }
, z' I6 l# R4 m6 O}
9 n2 j' c/ Y- b8 \; ?1 F$ i
4 @( Q4 s+ [$ N3 @+ d6 y8 [$ V% c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! n6 N' s/ [0 J; ]7 t1 X+ d使用下面代码,对内存使用了mmap函数后:
1 F" F& `! Y8 k) q#include <stdio.h>* J! ]9 E0 U2 D
#include <unistd.h>- D4 k* u# X' z/ S
#include <sys/mman.h>
. k( B4 ?# R3 p/ O, B#include <sys/types.h>
; {* z( I) g, y) S; e& C J#include <fcntl.h>$ L! l8 C/ `, `+ w( }
9 q2 C# j9 `2 \1 q) d#define SHAER_RAM_BASE_ADDR (0x80000000)+ b3 q' e& N3 Y1 D H6 p+ U7 w
#define SHAER_RAM_SIZE (0x20000) 1 C6 q$ R3 Z/ [! u+ ?3 R5 v4 v
6 e+ {7 G- G4 P- x
typedef struct
9 u9 V- Q! x U{. _& V1 P9 O% V" J5 K
unsigned int a;" a7 J7 |; u! t. e
unsigned int b;8 o0 ?; f3 n! U7 Y' Z
unsigned int packet_cout;
+ g. P5 k) p! A1 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; Q/ M2 g2 [5 R% ^" D# H2 Q$ E
3 c! z. e" d+ D3 y0 evoid read_MSG_buffer(int *baseaddr);/ \9 m9 J! A/ g" D
unsigned int count_copy = 0;
8 R3 L9 K& p' v; m% Y0 Z# ~
2 ~7 K/ z' d @ G# R( dint main()
( I0 ]! S8 @+ L0 A" N$ P! n2 C4 f- P) {{
# v( V! M+ x9 p! q9 `( j5 [; F int fd;) C: W5 ^; P' u2 t7 Z; U
int *mem = NULL;
. x. ~- U% i5 ?. P; ]/ y
1 f* D! {. I- }6 x3 ]" J, l if((fd = open("/dev/mem", O_RDWR)) <0)1 @+ {. d- U \ ~1 f# V
{
5 c) g$ a a2 @+ g4 k4 O. l$ i# { perror("open error");6 V9 G4 R) Y0 h% n/ B, r
return -1;- P2 F% k/ Q; B; \( b$ K5 ^5 {
}
% O4 G7 R8 o! c % p$ }3 Y+ r# t, Y3 y- t4 Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ E9 x- g" k3 y1 ^3 u- {
6 p0 ?" w0 ? T; e( f3 _" o while(1)
1 a( z9 `4 K; C3 @; | {
5 r& k h8 z# @" R& Z read_MSG_buffer(mem);0 H! x0 m: \" m9 _. M% \' O# c; h
}
0 M, [5 S9 ?- {" p7 o, ]8 C9 {5 d}
3 M1 e. P0 ]: w( N. J6 W
8 ?$ D( ^3 P5 @( T x0 U6 r$ j* Avoid read_MSG_buffer(int *baseaddr)
/ j& j: P r% ]' C1 t5 [# C: y+ y{
+ X0 K; U: C' h9 |& Z* b pRX_MSG_PROTOCOL pshreRAM = NULL;
, R" o; ] ~1 f: r0 f8 u1 S- a3 w* c3 |: d. M* e
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 i4 u: O* d# s! W1 c" v$ I
! a, ~ ^6 |, T6 I) P if(pshreRAM->packet_cout != count_copy)' i5 z5 j6 F# T9 j7 L
{
! W1 i1 I: F* H' g) b printf("a is %d\n", pshreRAM->a);
s C7 M: }" G8 \ printf("b is %d\n", pshreRAM->b);
4 \6 {$ M0 F9 U printf("count is %d\n", pshreRAM->packet_cout);8 w- U0 W. `- k7 I! A0 @
count_copy = pshreRAM->packet_cout;
5 p7 t% d1 O1 E0 w6 c }
3 r8 S8 A& w# C3 a9 Y: Y$ n) s else- Y4 _9 g, {4 X- @; G5 U0 }
{
0 x5 c% |% U5 s- |. Z# l; Y" { printf("No effective message!\n");
9 r3 r* U+ ^9 f: m W# W5 |* v }# u5 f! N$ E _: S+ x2 j
}0 J9 D) z8 p6 g) d2 V# ?8 t0 r* ~
6 m8 T9 \+ x. K& i& j9 M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 U) n* d2 G% \. F. j* \: d$ r! l. D3 e( M, n `3 g. h9 \
+ b3 e5 }7 a8 {
+ b: w4 I' Y& o4 u
* b( Z% [. _3 F3 O |
|