|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- w+ ]1 P7 u- [$ |8 }$ ?1 F0 Y; h7 B; A% J/ {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, B* {, m) O& p0 w8 A
#include <unistd.h>
- U& X+ ]) S% c+ i, D% P$ s1 Z#include <sys/mman.h>
, R* l# {% }2 {9 [#include <sys/types.h>4 i/ C$ A: c: z5 W1 k8 Q( f- F
#include <fcntl.h>
8 r' K- Y5 h" l$ |$ L- K$ ?; J2 c. ?1 T C( ?/ R
#define SHAER_RAM_BASE_ADDR (0x80000000) $ h" v2 x2 x4 i# g# x5 T1 F. P7 ?
6 w$ u, d1 N. [# E& R$ a- Ntypedef struct
. W2 @1 e: a7 N' J4 |! t$ y{5 D& d% ^2 _5 F
unsigned int a;
t9 c R- o9 n+ L; y" C unsigned int b;# C- e2 E5 E1 M9 @0 P
unsigned int packet_cout;# i1 }' T8 `+ K9 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& ]1 w t- _9 p9 k& t6 D3 s) o: K+ T% [0 I( u3 @/ \; q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ b' r" ?3 B2 F
unsigned int count_copy = 0;! L- }: E! ]$ ?* W
& i; V c. v8 a- L7 D
* x$ Y3 V% P) [6 b2 b* T9 @
int main()- d5 _( w7 O* ^/ e5 K4 c2 `, f
{
8 Q! V" k7 M( W8 M' X, A, w pRX_MSG_PROTOCOL pshreRAM = NULL;
6 V$ g% L2 c( E& |" e5 S pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 C7 ]+ b' `5 |9 u4 {# B# `7 n: B9 N0 ?" G1 c
while(1)
C$ [& [- U- R8 e9 G {- K' ~6 a8 ?$ [& R
read_MSG_buffer(pshreRAM);6 d! q; ]" K) w
} * C/ A9 [7 L) f/ H2 v5 H% V/ d% C
}
1 D/ q8 E8 N! y: K( Q+ G
7 s g8 v* K3 G# z9 Z5 F$ dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* f$ w& V1 F+ r$ S+ G' e{
: O& _ t' k9 g- o# f( R. \ RX_MSG_PROTOCOL buf;
6 G& u; [2 c3 l1 R. a
9 u- Y8 ^) n3 u& F buf.a = pshreRAM->a;7 ]- U$ Q6 x# Y, Y ]7 D
buf.b = pshreRAM->b;- `. o; ^9 c9 {- \$ n1 A* ?* z4 g
buf.packet_cout = pshreRAM->packet_cout;
1 {) W5 z0 Q) O9 K 5 `$ c5 T/ g- T% {' h9 j7 l a
if(buf.packet_cout != count_copy)/ X) B9 j, v/ }' Y" y) ~3 V
{; b: \) M- B4 ?$ n
printf("a is %d\n", buf.a);
' q6 r1 A' ?) B printf("b is %d\n", buf.b);, _' s9 V p' \0 O
printf("count is %d\n", buf.packet_cout);: J# C' F7 O8 N" F, @
count_copy = buf.packet_cout;. o) C5 F0 D; s
}! u6 U* v5 r7 t# Q+ R7 h! V* i
else
6 ]2 W! u1 c7 C6 X2 R/ |( j {
" k* U) f/ g8 W, X' ] printf("No effective message!");* P" [1 B9 N4 I8 `# k2 ]
}
2 s7 C4 x2 K2 b$ \) I}
/ ]2 o* t: }4 D1 {. a# y8 i
; n: T, s- }* W# @! i7 y& [5 |& u
, k1 j' z1 G1 l5 M+ F M但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. S# V% A: U8 B2 x6 Z使用下面代码,对内存使用了mmap函数后:$ [$ f$ l' K9 q
#include <stdio.h> {1 {9 H! U: ]2 o
#include <unistd.h>3 h6 P4 F0 E, ^# v! ~) S5 c
#include <sys/mman.h>6 S/ f* g/ l) Q0 u, n% L0 X3 Y$ W$ g
#include <sys/types.h>; t0 h. h1 P' \
#include <fcntl.h># J h6 R$ r `2 N: {
3 z$ o+ r6 _" ?; {3 l
#define SHAER_RAM_BASE_ADDR (0x80000000)# D0 j$ t: X8 Q
#define SHAER_RAM_SIZE (0x20000) ' ?# o/ r. {( {2 I; V
' N- _2 q ?8 }8 T/ f, _# Ftypedef struct. q) K& d& w& h z( j x; ~
{
0 ]6 T% r% u( u+ l2 m unsigned int a;
3 t0 ?& {& f6 s5 X) t0 t unsigned int b;
) W* e" Z T% e9 S0 m8 p' f unsigned int packet_cout;
! ]5 t% X- n4 ~: H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* K' _% b. }! q9 D7 Q% M& G
) M2 ?2 i% O! Q3 Q0 j3 J2 Avoid read_MSG_buffer(int *baseaddr);
0 e6 d/ s3 `) ^* N) y4 v; D6 dunsigned int count_copy = 0;
) m9 {6 K6 A& j d* X' A! ?* i7 r4 T
int main()' }% O% L& f2 L" _; H
{
6 B# \; V- }" x0 |6 l4 K' w ]6 b int fd;
$ R# [2 E- g, J% F int *mem = NULL;( D+ \6 H `' D3 U3 A
2 |! h7 R3 o: f f
if((fd = open("/dev/mem", O_RDWR)) <0)
& D7 j. z" g# V- g0 i {
3 r: \( x2 I; W0 M perror("open error");7 ~& I" c. @7 b' s
return -1;
) X, D7 c9 |2 n5 N3 W9 Z }4 B7 a7 w9 P! K. E7 n/ c
) ~4 a0 ^0 l( p$ y0 n+ D mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ ^ V( A0 W" a1 q) B' n
L8 a7 D' x& @* n9 Z while(1)$ y8 X A0 e8 [2 z0 e1 @
{) K2 F, B) R! Q, _
read_MSG_buffer(mem);
1 a8 p! L0 ]" T } + l; f, Y* _2 s2 y0 N# a K4 J
}- a G- |4 p$ {% `$ Y# h
0 k" L! B$ k1 ^( ~. N4 Jvoid read_MSG_buffer(int *baseaddr)
* D& c+ T1 Y3 D0 W- L{
, @7 j6 A+ K5 s( ^ ^9 t$ S1 w pRX_MSG_PROTOCOL pshreRAM = NULL;' [5 q2 G9 m8 I. Y0 q
, h+ S1 H9 }. r' ?$ T2 J( c3 d* g7 Y# E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 ^' b% J/ `$ d" W. m& G! W; f; ]; Y
if(pshreRAM->packet_cout != count_copy)
/ }: I0 m+ V1 E) ^ {
9 C$ c0 k A& i/ V1 s* N printf("a is %d\n", pshreRAM->a);
% K( g' l' s' V- k! {. f printf("b is %d\n", pshreRAM->b);( k T. ~) R: [/ ~% t
printf("count is %d\n", pshreRAM->packet_cout);
2 o0 x# q& c8 W V0 O+ Y+ B count_copy = pshreRAM->packet_cout;
1 {8 l% {9 h' T# j }
; Q2 P m$ S. P) a2 k else0 {8 W; A) I; k5 t T
{ k8 @; Q" x6 g3 _3 O6 P' k; I
printf("No effective message!\n");
2 T5 ~ `- p F2 s( t* O }/ k0 D9 T. p1 K0 c$ V- q
}
$ H+ Y8 f" P7 d4 K: [. S0 z
3 n6 `& v V# S: N3 w, a$ l' G) g3 e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) J# a" \: t% M9 @
2 |$ T4 \- C. v; c
3 U+ \' f% x/ Z( w6 j; |
' I ~5 M, _" e0 z* Z( k& C$ n0 C7 Q) Q( g$ t* H8 p
|
|