|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , g" b* I, [- ?) c) G! u
8 y3 d9 w' f7 \5 B+ ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' K+ ]2 h, a4 W1 Q; n1 b$ ~#include <unistd.h>7 k! Q6 J# Z9 f: X' P
#include <sys/mman.h>
U$ t7 ^. x. x8 U#include <sys/types.h>. M( S/ a& D* k+ E& ~# a7 h
#include <fcntl.h>
0 }2 ~+ D6 N z5 S3 h# u3 x, L! J* f F1 f. u3 H* g5 |
#define SHAER_RAM_BASE_ADDR (0x80000000) ! F B3 x% z9 V+ B/ v2 O/ P
! b! t( d. G! D2 l3 B+ u# F
typedef struct
! \0 I9 g( ?. f( u{
) G$ `; w _8 B% J/ p. C- ^1 \ unsigned int a;: y' {# P9 x4 H: z/ e1 c
unsigned int b;$ F1 W: q# D& Z
unsigned int packet_cout;/ [" X4 h) z6 U9 `: L1 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 G" E9 R" B/ H6 k0 g: ~% Y I" X, T, Y- L: N% Q# @3 Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 S' G7 }; c* @( [" S! Q9 B
unsigned int count_copy = 0;6 C. }, \, p m8 S0 z0 F4 ~
, c9 l- j _6 X% u4 i( V
8 X# @, N" ` w4 p$ \
int main(), k' W- T3 C% x, e* y+ Y$ l
{
) l3 F% a5 t1 [7 Z pRX_MSG_PROTOCOL pshreRAM = NULL;
1 U- S+ V2 Z& n0 V* \7 B pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. a- h8 b" ?. d8 C0 Y* P! h1 ~' M& t7 Q/ l5 a( K0 p
while(1)
% f' v, ~6 D, l {0 w5 ^- z. ] @ k5 j% c# i
read_MSG_buffer(pshreRAM);3 V1 T( K8 ^. V
} 4 s3 |6 K1 x8 r
}
/ y" ] {+ D+ A' f, T5 V% ~6 \( ^- Q# [7 B1 K& f# O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' o+ ^! C; U+ y& q. Y$ o& E2 E
{% m9 K8 D* Y6 e( W. G4 U
RX_MSG_PROTOCOL buf;" V$ L! H9 l } `+ R9 }5 Q- a
( p' T; Q" ^& T6 `) A8 t+ N buf.a = pshreRAM->a;
! I5 \2 ^7 ^" H, V3 o5 ]+ B buf.b = pshreRAM->b;0 l3 y! v$ K, B2 T( B* v
buf.packet_cout = pshreRAM->packet_cout;
3 ?+ Z# I; @( J7 c
7 \9 q/ v/ }. j: f if(buf.packet_cout != count_copy)) B$ c% D3 L/ j- f
{9 u* ?2 V. G1 _$ i# |" M% F; d1 p
printf("a is %d\n", buf.a); e. ^7 r- j* Q- } b7 r% E) s
printf("b is %d\n", buf.b);) A, p6 t; M# [$ N( J
printf("count is %d\n", buf.packet_cout);
3 H& L. r d/ O; W count_copy = buf.packet_cout;
7 U% b& e7 Y7 g2 n/ a9 k" G }' j8 @% c" \& s' S( r
else" _- ?1 w1 m7 P& K
{
9 T. P! @1 l9 _8 y' K3 J! s3 }" x printf("No effective message!");
$ V7 k" ^1 g+ Q1 Y& y4 v }
- z- B; i2 h/ ]: B; W* s}
) f& @( {- q4 O7 p# Z
. k/ u* u% h6 v' v! ^& g/ S) `" }9 u9 i4 N y- R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 f; H4 _9 t* R7 O- u; M' ]; |使用下面代码,对内存使用了mmap函数后:
6 t' Q$ o0 E1 v1 C* J; {#include <stdio.h>
3 W* ]! q9 |; V, s. b" ?#include <unistd.h>3 t/ B+ y/ C$ ?; R
#include <sys/mman.h>
6 A& j- Q2 q+ |7 u' G8 V) v' M2 x#include <sys/types.h>
4 K) R3 }+ Q3 I#include <fcntl.h>
0 G8 E2 W$ b( V. t' n1 M
' O8 X6 B D( l, l$ s#define SHAER_RAM_BASE_ADDR (0x80000000)
# Y. `# U1 {: u* ^$ @% K H3 F. S#define SHAER_RAM_SIZE (0x20000)
8 O# D8 T i# \
5 H" d4 ]4 X1 Ytypedef struct3 U: V- ?' O- g
{) Y( v7 _/ `, }& |, g7 y
unsigned int a;3 @5 r# s# w4 t) E
unsigned int b;
# b8 O8 q: H5 {+ i! ]' B3 t2 G unsigned int packet_cout;
o" [9 _) a$ `; ^0 z5 z: O8 L$ l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- o- p3 B- W9 r! g3 x) E$ b: k9 ?/ G) t0 }+ ~
void read_MSG_buffer(int *baseaddr);) L2 Q; w' l" Z2 Y9 A8 F% n6 D
unsigned int count_copy = 0;
5 s$ c1 H5 a& y3 x5 X) ~5 N/ G$ {; C3 l0 ~1 `3 C* B
int main()
$ y+ r$ @: Q0 N5 Y{
0 ]6 a/ A7 H% |5 `- j! S+ f int fd;
: @& U( G: N9 ]0 h$ i3 ] int *mem = NULL;
: e+ z2 ?5 I) o# |8 J" _% m2 K# S, C( |" m3 U8 `% g
if((fd = open("/dev/mem", O_RDWR)) <0)( Y2 Z5 n& B2 G
{
# {* C# |6 }/ M) t' w. | perror("open error");
% n0 f9 t0 z8 R I* r3 | return -1;' p/ p( Y! L. [, ^: L
}
. ^1 g! a5 L8 X _; L
6 A1 V) e& ~* `, R mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 s( `$ I0 u& n8 s
8 X- ^; L' \$ o3 p4 O7 x
while(1)
/ f; Y' A1 k8 I, B% c {
6 o; B% C$ l9 B read_MSG_buffer(mem);
) o0 i' k7 P" ~# @- P) H } , a4 x4 G, w1 i& d$ e% ~! T
}
; h- t0 q+ }0 f% m8 Q# y, a9 w
+ ]% Q) l- y! Y) b! r: {. uvoid read_MSG_buffer(int *baseaddr)# f+ t5 k! W8 h- v6 x: H& D" J2 ?0 R
{
, W( _: B, r, U8 J pRX_MSG_PROTOCOL pshreRAM = NULL;3 @& ]. J3 B0 ^" z) W# |
- L1 f+ s, b" y1 p s9 S2 u# L pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" L) N/ Y1 v. P) ^2 |
7 S/ ?" M/ t0 P- {; s& x3 Z6 w
if(pshreRAM->packet_cout != count_copy)+ P4 m8 N* `. p! p1 p* C
{
- v m. w, |& w4 x+ y, J, a I printf("a is %d\n", pshreRAM->a);5 `; W$ F5 o) Q, ]! r9 u2 U% W2 L
printf("b is %d\n", pshreRAM->b);
6 M$ u- V7 n/ S7 }+ s$ p F printf("count is %d\n", pshreRAM->packet_cout);4 Q3 ^2 _7 v; r3 Y
count_copy = pshreRAM->packet_cout;, W, K6 v Q' R% d
}; _+ X- {" G) l7 N& T4 k. Z
else! n4 ~; r2 A. m! Z
{4 r0 D: q! g+ K f: t
printf("No effective message!\n");) Q- d. {5 h5 S& l, b
}; ?3 z" ]( K; w( L8 V
}
5 Z' C) e' I' Q* ~( W( u) L5 ]% N$ N6 g; X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! h, V! g) w( Q' w* y( |0 v# v/ D- s0 ]3 ~4 {
% x0 O0 G. |8 p, c( X6 x* r. c1 N X! r# r
& |. ^# @' q4 j$ |( m0 ^ |
|