|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 G N) a `+ Z5 M; A/ s$ s
# z7 E4 T; d2 a6 I7 Z$ l' wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: ]/ k4 B# e9 V* J8 R#include <unistd.h>7 n, x; ~' B, i7 Q7 f
#include <sys/mman.h>
3 o7 D. y5 r7 x#include <sys/types.h>
1 v2 s& C- Q) B6 M" x( ^6 x#include <fcntl.h>
: R0 D" V4 P- m Q7 ]
- s; p G+ u8 L& ~8 y#define SHAER_RAM_BASE_ADDR (0x80000000)
% r& M& |( m( c. \' _ F3 b- y- C5 {9 W
typedef struct
; ]$ R$ X% s1 w. \; s% M{
" T' n3 b7 `- V; \ unsigned int a;8 E* ]% i4 l" \/ W
unsigned int b;
* Z2 b6 @! U7 W, m1 Z1 x unsigned int packet_cout;
4 K- D! ^; _, ]0 y3 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. T7 ]4 [9 \- p: c' Y9 J
8 e9 L1 [ j! f9 C- `- jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ }* V7 {& u& B, J Junsigned int count_copy = 0;
4 D, O6 R/ Y4 p/ s. |& N$ K2 o7 L% K [& O5 K3 ]" R
M7 u) Y% U2 |' X5 N1 N6 Y
int main()
- j3 p2 `8 i% [4 I# n, E; |: ?{
4 [2 ~6 Z' x1 O pRX_MSG_PROTOCOL pshreRAM = NULL;
& i9 s7 h, M3 A6 r6 d3 R pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ ^. Y. o% C: x1 A0 |6 I5 o
8 }0 z8 H e8 b while(1)
' q4 T* J) k @" a {' ]) |' Q. d$ W& W3 f* K
read_MSG_buffer(pshreRAM);" ~6 i. B; l2 g8 M% T3 q( i& d
}
% n4 D4 G: W" q6 Q- g; s1 U. P}. a0 T$ ~9 b1 `3 L% o& b: d3 S; C$ v
6 f/ O9 ~+ |" `; r# F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& [" l! L o0 ]. }% |2 A# d
{/ _# o$ p2 t7 y. N# f& I
RX_MSG_PROTOCOL buf;5 l# c1 [9 p- c% }* P
w4 E! n c- S0 c6 P$ F buf.a = pshreRAM->a;
# {9 {* k7 r! S# c [6 K9 J buf.b = pshreRAM->b;$ [7 ~0 S, \6 z) e) N# y
buf.packet_cout = pshreRAM->packet_cout;
! h/ D) d, k( D% @( c
4 W- T: ^4 R; o N$ L# U7 n if(buf.packet_cout != count_copy)0 Z3 y( D5 u& o
{, M) V1 T7 o$ W5 L5 k
printf("a is %d\n", buf.a);: f u) J% R5 Z0 d
printf("b is %d\n", buf.b);
9 d) t) \$ O( F& O7 f printf("count is %d\n", buf.packet_cout);
7 e) y7 b3 H1 P count_copy = buf.packet_cout;2 C7 J2 ]9 W& j6 }2 _, t
}% {% H, |* v4 _8 D4 K' O
else X" c$ |& |: T9 r0 Q
{
8 B4 _3 e2 Y6 Q0 S2 `' H printf("No effective message!");
/ W, J" h" J; X2 p8 k }# j8 t5 H& J2 V# {- a7 n% F9 W
}
' C" @; ]& ~' v& q* N
$ R. e! ^! a- w7 F. F' d, Q" ~. {
- E/ k5 M: Y) k6 X3 H( q; G但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ p( m& C9 H) l1 z- C2 p使用下面代码,对内存使用了mmap函数后:
. M4 {& p3 {3 M; h3 Q, G4 D2 e#include <stdio.h>1 Z' {3 H: O3 q$ G' [
#include <unistd.h>
8 G2 u6 c2 B0 @ }" |; M5 l#include <sys/mman.h># M6 l' w) B( |+ \( p5 A
#include <sys/types.h>0 J+ }; p) `( i" P8 S, g. }" l2 a
#include <fcntl.h>
: l9 a7 x( l! [3 A/ g
6 S7 A# X. V# ~0 q#define SHAER_RAM_BASE_ADDR (0x80000000)
7 M8 u% I0 ~4 `4 y1 D#define SHAER_RAM_SIZE (0x20000) 7 M% j! {; B# t' \9 H0 E6 S% X* y
$ S0 {8 h& R5 R5 dtypedef struct
8 |7 e0 j' u5 s% c9 n% I; `{. I+ |7 _' l/ a- X1 h6 @
unsigned int a;, r8 o' s* ?( C9 v% n( T0 R3 y- d8 ?4 H
unsigned int b;* _; |$ \0 n6 @+ O
unsigned int packet_cout;/ f- K2 c, S- s4 I# j( X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 T) D5 a7 \5 `) w
. U9 z3 q, H' h' D, d4 m# G; Xvoid read_MSG_buffer(int *baseaddr);& E& ~( I) ^8 J, x& C
unsigned int count_copy = 0;6 {6 `% u# A5 E# f* M
7 F3 E' w( l0 |( a9 q" |
int main()
Z5 m; i, S, c0 b3 o3 ~7 [{
6 d C+ p: _* Y+ d6 x3 v s2 v( o int fd;0 t% S% J" m7 F! y8 H
int *mem = NULL;
* T5 R& a& s& z+ I! `0 [4 N0 L+ V. D$ K
if((fd = open("/dev/mem", O_RDWR)) <0)5 }8 [2 i, a J! B' h
{0 g7 f2 \4 w h n
perror("open error");5 r- Y8 {7 v( Q8 @$ b
return -1;
4 j4 H Q8 O2 L& `( y1 D/ Q }- s, V5 l/ k8 s1 n# e
4 x+ t0 m/ }/ J z( e3 J( v2 B
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 L+ T! N- d7 f! a% q8 k! g' y8 }- p
while(1)4 s( C9 S7 a3 E/ T' k$ u
{. q+ A& K3 t4 m3 b0 ?3 D
read_MSG_buffer(mem);
. y" n" R0 W2 F0 [$ U+ v) C }
8 D% @: l, b0 p! Z: R" b6 e4 u; k6 o}
& `$ Z8 P- T% L7 ^. \% m5 O; g! M- v
void read_MSG_buffer(int *baseaddr)
" S" h- ^+ E; L$ }. s6 b7 `{8 S9 r6 y2 P, U3 R
pRX_MSG_PROTOCOL pshreRAM = NULL;! G" J1 Y0 ~* U0 U% O3 L" A
' f. B5 `0 E1 j. Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, K4 d- e. x3 q/ E x0 `4 x/ R$ @
if(pshreRAM->packet_cout != count_copy)
( d; A* A7 f7 D {
! q) I) u% K& ~4 X+ K: U6 l5 C8 U printf("a is %d\n", pshreRAM->a);# U2 F8 w% k; n4 r
printf("b is %d\n", pshreRAM->b);
. h; m& m# v! \5 a7 x printf("count is %d\n", pshreRAM->packet_cout);7 W& j$ L- A# h, u
count_copy = pshreRAM->packet_cout;9 `0 q( {; p5 ^6 ^9 H: B
} W5 z8 c$ v c. B2 c7 d- @# [8 m
else; B- u3 [: e3 ~
{9 E+ F. T( M; G" t2 e" ?) H$ h
printf("No effective message!\n");% C2 N7 P* \+ {; v9 |( w9 v
}8 e2 G: z I8 r
}% b) ^% e* \+ W+ a( D8 |+ V) e9 W- Z
0 C* X7 {9 U7 i/ ~/ V8 J( d3 h没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 @+ A& s# c8 h# B- [1 A# h. Y/ ?" V; S h, G* S
2 D& O7 ~2 i8 Y* Q0 A! \ d
, L: `, z+ A, V3 g- c" ^4 [
# q6 ]; [. v: {# D1 ]3 \
|
|