|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( X( G; y7 T( N K. a: h, U; e9 ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 y6 u( t2 [) L1 q
#include <unistd.h>% `6 {4 U/ j& }7 V5 Z c! n
#include <sys/mman.h>
- A) f5 |) n/ o0 ]; [9 {# c#include <sys/types.h>2 d3 v) H0 h' v
#include <fcntl.h>* f9 q) s, s1 u- _+ P
1 y4 Q9 S, @3 ^/ J t#define SHAER_RAM_BASE_ADDR (0x80000000)
2 e& m: t* Z: k) g' E C" V5 X) v+ ], |, S9 ^$ Q0 \+ t
typedef struct" N5 w* x& @ F6 U: M0 A
{5 e& _# M% d! J- @) [
unsigned int a;& r. q& Z: o' ^ t6 ^* v
unsigned int b;
5 [7 P8 {, O: b unsigned int packet_cout;
- d# M" }2 h: R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 ?5 d: A( n; [* R5 E7 F" ` S" \& i t2 Y6 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 C- C- L) W$ ?5 Z2 \6 q8 W- Uunsigned int count_copy = 0;* ~9 g: T3 _3 ] `1 W
* h. D. N) `( r% Q+ y7 Z. p" l
l3 z5 }: {" M& g2 {$ @: lint main()
0 H7 T& l6 b1 R3 K! l0 r# i{& [6 ~$ r# Z$ b G
pRX_MSG_PROTOCOL pshreRAM = NULL;, W& `$ y$ I" D7 a3 ?
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" h9 I) X% p$ S0 s" A f# }
8 e$ m* u: R4 ^" L7 X5 k3 z" E+ s3 } while(1). m- k0 P' e/ N9 }0 _7 [4 f
{( h% m) X3 D+ v/ F, l
read_MSG_buffer(pshreRAM);& J+ H, K9 c$ i
} 8 \4 }% \/ L) [
}# L' S+ W( T; m' O1 X2 ~
9 |5 L2 {$ B9 |2 d+ Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- u" U7 [0 N! [7 k
{
8 e1 ~8 ]( K1 n RX_MSG_PROTOCOL buf;- q# I# f( a1 ~' [% T# A% M; z. p
. s$ k5 j w/ n7 b& U3 V7 [9 H/ R! P buf.a = pshreRAM->a;1 }0 [1 A% ~" s8 J
buf.b = pshreRAM->b;
! C3 ]0 U, e- `4 i$ Z; i% v" s N buf.packet_cout = pshreRAM->packet_cout;
0 B2 d! j' t0 u# J9 ~$ c # B7 }0 p3 ~6 [$ z+ U+ H/ f
if(buf.packet_cout != count_copy)% @' d: z; ?* H/ K9 L8 ^- u( [
{
/ `9 _+ c" Y+ Z printf("a is %d\n", buf.a);* S" L0 g9 L. \2 f: e1 d/ e
printf("b is %d\n", buf.b);- U. s! R k. s- H$ g2 h/ Y% B% \
printf("count is %d\n", buf.packet_cout);
+ P) k0 J9 ^% R6 y. X' u& m count_copy = buf.packet_cout;2 g4 a ]- j" N \6 P9 t
}
; w0 z! {0 ]/ W1 d( I& l else
: e. i6 ^7 Y- J9 H {
" Z# t: P& F5 `% x- I5 A printf("No effective message!");* g; b5 l6 h& b% r
}2 z$ e) v. D7 l5 H# h4 L" y1 E
}8 n: `0 S/ v: U3 W/ B- }
! x A* ^/ p- P9 I% N, H
: l) h/ P3 s6 w+ o: w但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- W% Y' e5 o' o8 b' U
使用下面代码,对内存使用了mmap函数后:
" C0 {* m6 [& i V% K#include <stdio.h>7 B6 r7 {, s) D. ]8 n
#include <unistd.h>
H3 O4 k" C0 x, }# g9 R#include <sys/mman.h>
& d7 r0 @6 |: r4 l+ y#include <sys/types.h>2 \6 ]$ _5 ?) w
#include <fcntl.h>& N% x' y/ P4 S B3 T0 F2 ~
' u% `) l: `; J& e: I
#define SHAER_RAM_BASE_ADDR (0x80000000)1 x" d* v( P' f9 s* I0 ?) C, Q
#define SHAER_RAM_SIZE (0x20000) * k8 C8 d7 z% f& c3 Z+ ^
: C1 [& c( h" g6 Z" W8 Q
typedef struct. V8 G- D0 ^9 b
{
( x: X. d/ d% {# R1 z unsigned int a;1 K- }9 W' F( K
unsigned int b;
7 a& p+ u( y4 ]$ n0 d unsigned int packet_cout;% b2 e: M4 U) i+ w8 V' \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) a+ w6 N. H4 a9 {1 |
, i {0 D5 D1 q9 lvoid read_MSG_buffer(int *baseaddr);
- z c x, Y6 e( O3 Xunsigned int count_copy = 0;
8 i& E' u L6 Y6 R% @( P
. ]4 g' F8 s* i! I4 n$ Pint main()
; G: w: Y0 b3 \( Q U{$ q! m' x" V: w V9 @7 i5 l
int fd;
3 v, o0 n" D4 d% C0 `0 T4 d int *mem = NULL;
/ z1 l2 E; f: @* `- `& z+ T: D1 Z
) n2 C; X0 y* ] if((fd = open("/dev/mem", O_RDWR)) <0)+ T& w7 s. A+ U% C: F
{# j) O8 T, g$ C6 U9 ]0 z
perror("open error"); U0 I* j/ ]' u, _* v& P" C& x
return -1;( d$ a- l7 m! W3 T: T }" Q8 ?* h
}
# x w2 p8 o+ Q: E, x . Y1 b; C- v: \ V M" |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! j+ ^/ y" T T( r6 v4 A) L3 G9 Z% g) b( I* |& m6 k% h
while(1)
# `5 q' q3 b5 j* B3 E( T( h {
% g0 V! { O" Q read_MSG_buffer(mem);: c) d4 E; T+ L$ K) s
} * D# G$ `6 o9 P! q9 b1 S& @
}0 W) D- q( J, [1 x: v8 S
' X. S7 B A$ \6 x9 b- d
void read_MSG_buffer(int *baseaddr)
1 z5 S0 ]5 l1 D. l$ G% A{0 y, H( _- D& k' S, z- [
pRX_MSG_PROTOCOL pshreRAM = NULL;. a) R- ?2 H4 p- y; n
/ |! S6 e" {/ R4 s: v( \7 x
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' R! ], d" p% @7 h" b r
" c! ?- u# b" @- M. I( e4 p if(pshreRAM->packet_cout != count_copy)
" Z" y E- S0 v {% @( V: a- i y( E: Q
printf("a is %d\n", pshreRAM->a);* K$ R0 m- v2 F$ r. M% u
printf("b is %d\n", pshreRAM->b);. \ Z1 t. y, I5 f- b" \5 u0 a
printf("count is %d\n", pshreRAM->packet_cout);
- |( Y+ k* F0 n& U! h count_copy = pshreRAM->packet_cout;
+ s1 H6 V7 V" Q+ ?. k: t }0 Z( V% i0 c! F; K! j% g+ G( x
else
. Z- Z( m8 b9 d, ] {) b* }0 C! y. w7 C, h
printf("No effective message!\n");
% i, l! i/ U+ c8 z1 d }
- ^: z7 r2 R6 |2 w, }1 h}
?5 z$ g' z/ P
5 w6 F3 \/ F, U0 [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# D& T& f9 D! v$ U* u: U
4 l0 _6 j/ Z2 h) Q: A2 r( P8 f d$ L
' X1 |8 y1 s! s- Q7 p! G' \; w7 A. D$ d
|
|