|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 M. Z: A0 D6 W# ^! U
" m4 h0 ?2 F: |* J( POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- Z E8 T2 K+ ]4 k
#include <unistd.h>9 a) I& X$ T# A9 f' K/ I0 [
#include <sys/mman.h>8 e! M4 D, f+ I; a
#include <sys/types.h>
c) L' W2 d1 X( N#include <fcntl.h>; A- O k. _! m2 w. I
5 K( F) C8 t1 w1 A; o$ V#define SHAER_RAM_BASE_ADDR (0x80000000) ) d# [# n. c, p4 G
: w5 p: |) q9 U! t, Xtypedef struct
7 e4 F- J- A# ]+ l7 O7 D8 h{+ U5 n/ W; L; `
unsigned int a;: [1 `* V/ M# C+ }
unsigned int b;6 b- D I k3 @
unsigned int packet_cout;7 Y8 `1 p6 S1 \8 _! p0 m0 O8 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 ]& N) o$ d' l; d( X( ]
, Z# o' n, t' F; Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; X% _( o; M B9 B0 O1 O1 V) Q
unsigned int count_copy = 0;, m8 Y, y4 Q3 y8 E4 W0 L% ?
3 X1 s* L$ m$ G+ @5 @
5 m: P9 \( x* [+ ~6 [, e! Q) h6 Xint main()
1 y) M0 k9 Y) _# _, T1 u: J{
6 E' t1 X Q/ v! z1 j s! W pRX_MSG_PROTOCOL pshreRAM = NULL;" o: A5 |$ \' H0 _* R. B
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# p, J; o1 [5 A4 {) U6 ^, f/ y0 G: E, J8 t9 q
while(1)9 s. s& F: J" M5 _: L; c+ D+ E
{% [3 q7 ^1 ~# T0 a7 x$ K
read_MSG_buffer(pshreRAM);
7 k3 W q/ ?2 D" w) G } : A q7 T# m! D% p" L* o
}
' c3 O% A; @' T y7 O: w3 g% q8 ]6 e! J+ k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' ]/ @) G+ D* R{+ K/ K6 f: R9 z; Q3 c$ f7 r
RX_MSG_PROTOCOL buf;
" x; g2 j+ w" w/ V: o& t , q' Y0 R' x$ Z- Q. ]8 \9 C z9 Q& T/ F
buf.a = pshreRAM->a;' w: o! Z7 V+ b8 D0 Y0 G9 `7 T! _
buf.b = pshreRAM->b;
# y" M+ }4 c6 a6 y3 z5 G( S% ^ buf.packet_cout = pshreRAM->packet_cout;6 E/ [0 e3 O$ l# O/ W
# G' \8 R3 u5 {
if(buf.packet_cout != count_copy)
) W' J7 t1 W# M; Q% D8 S1 M {( X- G/ [; H0 {9 ]) x
printf("a is %d\n", buf.a);1 L5 A+ M: W3 Q0 x; D
printf("b is %d\n", buf.b);
Q$ { U- J t C) V* N printf("count is %d\n", buf.packet_cout);0 t2 V9 n( R3 a2 I( I
count_copy = buf.packet_cout;3 v( h4 c E! {! R# T9 T1 F$ M
}) X0 O7 `( {5 |- T$ Y/ g* _/ k9 a
else' E" m/ A4 B: d
{
" d$ W5 N4 W! \3 v printf("No effective message!");
e5 U7 J5 A5 \5 x& K) o }/ u; [& {/ L/ @( m
}2 p4 u( W8 ?' q+ G$ l
1 x8 G, {+ x) t6 M" M9 a! V" v7 I' \' r" o/ U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" H: ]$ K0 V' _9 `使用下面代码,对内存使用了mmap函数后:1 |- [' z" h! `
#include <stdio.h>* w/ ?7 L: K9 d- Q% t
#include <unistd.h>& R$ O# i0 W3 o" t3 G
#include <sys/mman.h>. X2 O# n+ D! _! m% V
#include <sys/types.h>& J( a" y6 a) h
#include <fcntl.h>4 ?7 j* F" J/ f
3 O5 o* q4 U, m$ Z5 J. P
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 r2 K3 |1 h/ W#define SHAER_RAM_SIZE (0x20000)
- r1 o- p. g7 v7 {4 P7 \6 X- J% X/ o9 s
typedef struct7 U: v1 m" J7 O" W) l) f
{7 U4 @/ x& Q0 s4 t
unsigned int a;- b8 \& ~; ? m0 d+ z7 ~
unsigned int b; L' v7 O& N( x, u1 k5 |
unsigned int packet_cout;
5 Z/ \$ j: o" Q4 Z' s) `2 K; x% A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ q/ j1 Q7 x# \ \9 u
2 v, q9 C( b6 D0 T9 gvoid read_MSG_buffer(int *baseaddr);/ D! g y$ s5 ~4 ] x+ }
unsigned int count_copy = 0;( {6 L4 f" y8 Z9 d" }! P6 r
, T# q% B7 n2 x2 J, o+ Mint main()
4 m( H, H' E/ V& z0 G a{
! @% x+ H/ ^ l# d int fd;& I5 e4 r$ V+ ~7 u$ W
int *mem = NULL;
3 I( u+ t9 x0 m+ [. Y! m9 j4 C% D D7 t" T
if((fd = open("/dev/mem", O_RDWR)) <0)! z! r Y% @7 s1 s$ B3 c
{2 ~+ H& @( n' f, E
perror("open error");
- `. y- t& j* X5 e return -1;
, v7 h# |' f9 W; A V& R }
: W0 r5 X0 N0 u$ n' G( }1 v2 r3 L" R
2 I" }! v* o- j: X2 z mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 d6 @& w' W: A# e8 y% ~! s
$ G" A/ g& X$ S- J) V% H while(1): K' e2 x# S( D A5 B5 l0 s
{6 f' d$ C/ }2 i, {
read_MSG_buffer(mem);! Q9 U [) @& \1 {6 A
}
4 o r+ S, w7 o- D/ Y; e. u}
' K& h) v6 {/ @/ q
* Y- T( B4 d/ L, T) N2 p% U6 Uvoid read_MSG_buffer(int *baseaddr)
, d, U) k3 m) H3 W& u{
8 H8 F: Y' e" B! ~7 }- N& ]& H pRX_MSG_PROTOCOL pshreRAM = NULL;$ @2 m8 _0 M+ s3 X$ j" G* x
0 a3 `/ |7 a4 T$ } pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
e6 I g& V7 c- s/ w7 w: l" R2 J7 I/ @; c! `+ ~4 G. V8 \6 v
if(pshreRAM->packet_cout != count_copy)
! n+ E/ t* S/ j/ _ {
. d3 Q3 c7 Y8 _. f+ k9 y printf("a is %d\n", pshreRAM->a);% t4 H+ }0 a0 U5 m( ?
printf("b is %d\n", pshreRAM->b);
- k$ C# \3 D/ q, T! }/ K printf("count is %d\n", pshreRAM->packet_cout);
+ o2 C+ @" O" h count_copy = pshreRAM->packet_cout;6 k/ s+ K& l2 O+ @
}
/ `' P! x! J) R7 |5 l else
# e# f5 C% ]! Y: ^ {
+ I5 v% q; i/ ^% ]% e printf("No effective message!\n");( _" F% X( U, \, [
}
4 f+ B9 T! `. R6 x}
1 X3 h. P$ i: |' n
( R' T: j- M c% I, e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 w$ Q" H3 S) t8 N( [* V# C+ ]
! d$ G8 A! [" q- \5 s# ^
9 u8 _* m0 L; b3 N
2 q" J: a& Z k' `3 p. v8 A* ^' q( P" e5 X4 V
|
|