|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , ]1 \8 E* j1 I7 C6 N7 s- q
7 T. w6 d3 Q- _" L- rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! V% v% Q/ u; P! [' j5 s
#include <unistd.h>, K& x8 @; K5 @* L8 k9 G5 L
#include <sys/mman.h>" I+ B5 i( ?) q* ~) ]9 Z
#include <sys/types.h>
5 \1 f# Y) [& j6 z& B) L#include <fcntl.h>, N; n" X& K7 C2 t# w% L# p
/ F1 O! N5 R: \' H- b# y' K" y#define SHAER_RAM_BASE_ADDR (0x80000000)
& L( G9 k6 ]. x' n$ e6 ]$ e2 j+ V$ ]2 l& V, t4 o
typedef struct# L. \3 k" L8 _/ B* X" F
{% S1 E; B/ L9 b9 v B: \$ F
unsigned int a;+ @' t3 @* O7 w
unsigned int b;
0 }. } W% Y1 R }1 O: u unsigned int packet_cout;. o" ~# ?7 V& ^; K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 \. M m8 m. Q3 l
+ ^' f; |) U3 s( M) D5 w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* G u( E2 }* |$ u
unsigned int count_copy = 0;
' o, _ X! Z; C/ }1 o5 E1 l5 I6 J( _3 R" I
# C B0 J% n7 t- G
int main()
9 e w: i. g1 H; O{
- g3 j$ D7 I% m- O9 {( ~ pRX_MSG_PROTOCOL pshreRAM = NULL;
1 p9 f& P: h/ w* ~ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 I$ C; B# c. l: X8 J4 H/ ]
0 @5 J6 C2 C( C while(1)2 u$ c* L3 Q" g' k7 T& O
{
* O+ y5 _- w6 a( u/ e read_MSG_buffer(pshreRAM);
' ~( B9 J: t7 B. H$ i* J' } } 1 C0 m- Q2 P# G- Z; x. m9 E V
}
- @/ q2 [4 Y& Q4 q' e1 T; T* w
+ w/ b3 E/ Y4 i% {& [; c0 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% w5 h1 v: s1 s: ~' z& x$ N
{: d7 s: A# z- l a2 f3 u
RX_MSG_PROTOCOL buf;( W$ J$ I# M7 H. e/ [: K' S
. J# \+ O! ?7 C
buf.a = pshreRAM->a;
+ t# {$ h! G3 T; Q9 z! h buf.b = pshreRAM->b;
S$ I! X' ], k: N buf.packet_cout = pshreRAM->packet_cout; V: b% M- o% i/ y# N
2 ~. A1 _2 `( F! E/ `8 `8 u
if(buf.packet_cout != count_copy)
& W* w0 r, c# Z X {
% c M ^+ p$ Q& l) `& I }# f printf("a is %d\n", buf.a);
9 L' N3 U! k" h2 }! d$ x printf("b is %d\n", buf.b);- V9 i" {& b d6 K: k
printf("count is %d\n", buf.packet_cout);, n$ w! y0 G6 i. t" c* p) k
count_copy = buf.packet_cout;! Z/ c/ ?0 C ? B
}
9 l1 J! P* B9 x2 R: G1 n) `7 H else! ~' q! c' v. t4 }
{5 n, O' `& ]5 `* w% d
printf("No effective message!");
8 G! e( n/ W A2 x }
8 B. ?3 z" T3 g! g, n2 G}
5 L9 a; c5 P: X- J5 T! [# I; W$ H* \
9 l: n# J% S8 A* n: L! k- M0 e. J& X5 C4 A
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 `1 ]' C& a$ ]9 ?使用下面代码,对内存使用了mmap函数后:
" [! w3 X' k; U0 \#include <stdio.h> F: P$ G! ]$ d% x% D
#include <unistd.h>
3 f9 z4 ~& K" w7 f+ z' ]#include <sys/mman.h>9 [3 b: c6 |2 k, c q1 g
#include <sys/types.h>
# B7 d: V. p( }* c }& A! K5 X/ C#include <fcntl.h>, Y% \ P, F; Y2 G: h/ i+ n: |+ Q" F. e
4 }3 E: J y: H# O5 e, |9 [
#define SHAER_RAM_BASE_ADDR (0x80000000)3 ~( f: ^6 b9 o) O
#define SHAER_RAM_SIZE (0x20000)
" @6 c7 K9 _- m) H' m
( |& r% d! H( h( B; t. Gtypedef struct
* D2 E. m4 e# d: Q5 ^{: G$ Y1 T& q$ d
unsigned int a;
+ O% F4 D" ]* e- ~* c g! B unsigned int b;9 G( b" g/ N+ W# [
unsigned int packet_cout;
$ U! Y- q1 H7 O" i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) V t0 d$ Z2 C" @
9 i) e' e- ^' Y4 jvoid read_MSG_buffer(int *baseaddr);5 t, a* a9 F, ?+ [( R4 G/ ?% v
unsigned int count_copy = 0;: O+ D9 X6 ^, a1 x$ E: b! R7 L
" I/ n) q- X) X) k! ?2 d" A! e; _2 cint main()
- G* p" q+ C* q$ v, R9 {{
- Y2 D n% t7 ] int fd;
9 f$ s8 R9 W; E' q: S int *mem = NULL;
& y0 c) o7 |3 @$ U" p3 C0 x. E& C8 n* @3 l4 B5 P$ g
if((fd = open("/dev/mem", O_RDWR)) <0)0 l% b# X5 c) y* U5 o/ P
{1 s ^& B( I* ~) A- M/ R8 G( e9 Z
perror("open error");
C6 ^ d; b9 ~( ]$ F return -1;
7 f) @8 _' p9 X# |' {( s9 y& n }
# f: q4 J# z! v( E7 K& k- e
+ x3 ~5 p. Z$ c- k0 d( Z! f; Z mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 [8 b, ^) J% ^ E9 o
( t, g, M7 x |; `2 k. O% O- \
while(1)
3 K6 y+ @; m1 V$ m* G O5 l. x' u+ m+ G {+ A0 x8 d+ |7 `; L, I6 C0 f
read_MSG_buffer(mem);
! t1 ~1 \: T$ z5 M7 x) G5 l }
/ L8 L$ |* X) y* w) r/ }}
f# T! ^. o+ J! s, \; c W7 j/ d2 N) g- ?# }( b
void read_MSG_buffer(int *baseaddr)$ m, e% @ S. ]2 o, ]9 @3 ^4 _
{
) B" ]3 s6 N0 J8 u0 U pRX_MSG_PROTOCOL pshreRAM = NULL;# Q3 b, o+ Z" f/ f( V4 {1 c* X4 Z( F$ G
# U$ h, S0 b8 o pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 i8 P% L& @$ e: N. c
- a: a% g% ^5 I( u3 {! t' H# M1 W if(pshreRAM->packet_cout != count_copy)
6 Z9 ~8 D7 z) P {) y: Q1 W/ Q: c6 K" j
printf("a is %d\n", pshreRAM->a);2 i" m; f2 T! s5 D
printf("b is %d\n", pshreRAM->b);
: k) u) T4 {' b) Q& V printf("count is %d\n", pshreRAM->packet_cout);- j# J' x; Q6 G$ T* `! ?" s! J
count_copy = pshreRAM->packet_cout;3 }0 p+ `* H5 t) g5 |, [, C4 e
}5 f. i& I6 W i' R. O7 C
else* |5 v+ m# P! [( k5 v1 X
{
: o/ ? U) h5 s; M3 E printf("No effective message!\n");
9 X7 r4 t9 u. N) J, J( t }
6 f" v3 O; Q) o, v- J5 t7 Y}( r$ |$ S8 f" G x/ q) o
; W) w& [# d! q) N" B. u" ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% v# r% E) I0 W2 V! N* X/ d6 A% w/ ?% P4 x( n3 M
& m5 D9 R6 q; S% ~' E3 e" t
; X! l7 ?! e( N* n
- q2 G! e, S; E' D! t |
|