|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! {6 A4 \" i. e: l( w" T
) w0 j3 ?* K* _" `& M: g9 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 R2 C. I) f# \, v) S#include <unistd.h>) l% E) o3 U3 L8 J
#include <sys/mman.h>; P# G; G6 N. h4 S2 r X$ E2 D
#include <sys/types.h>
# p2 W) l H3 S: K: F& q* q! M' g#include <fcntl.h>
0 ]4 x6 D% y9 W; ^( @/ E6 L, m/ s5 d$ h, ^ P( k
#define SHAER_RAM_BASE_ADDR (0x80000000)
* K5 c2 a! Y7 i
; x% x- T0 _; W; s+ e0 Rtypedef struct K1 g% \9 V0 D& Q& ^ d
{
4 w) V7 F! c8 M/ g6 N' q unsigned int a;
3 A1 C5 N0 q5 N# } unsigned int b;! ^" B' h2 i0 G& L7 f
unsigned int packet_cout;- ^0 |3 U2 w! S0 S+ v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 Y- N" y |2 g2 t+ y7 R; c1 ~* E4 B2 k0 }- G6 W/ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- q2 S# l; [3 f Y+ r3 K
unsigned int count_copy = 0;
6 N3 w& s) x2 k, X
. Q- F8 s7 T# x2 y) r! g9 W) h
- L; d- G; q2 a2 W! m) Uint main(); S( g8 i3 g% C' i
{
2 U" I3 @3 l" ?; z# r/ v pRX_MSG_PROTOCOL pshreRAM = NULL;
+ H$ O: B5 k2 \: x. ] pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( T+ G) C; D! U! \! n( O" p2 Q* v) C u$ x
while(1)( b! t& g4 Y4 x: M8 h
{1 h& o6 M% X* e) [5 W
read_MSG_buffer(pshreRAM);
, V) \! P) Q6 a: v, H; R }
& H8 s q6 }0 [}
3 p' h! Y* g# H: s5 n) \) m! }! a& v" ^; S. i% D/ D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" N% p$ o4 o, T1 k1 ?4 T5 d9 O
{
4 g' T; N& R1 f9 t4 X" b- i9 L% d RX_MSG_PROTOCOL buf;+ w9 |: A) P; R0 f3 m2 r
& G5 c2 D" q- x* J( |4 w
buf.a = pshreRAM->a;
. q) e+ m2 x9 o; M1 e3 h buf.b = pshreRAM->b;1 u# u9 |8 N7 B/ _( H
buf.packet_cout = pshreRAM->packet_cout;' p( M) B$ X$ `& y2 B0 z( M
6 y. ~6 z1 y' ~5 g6 \- J- F if(buf.packet_cout != count_copy)6 }% |3 A6 U8 Q: X4 ]$ Y7 V
{& i9 |& R4 P7 v: N/ S- T; z! T+ C$ J
printf("a is %d\n", buf.a);; z6 J/ h9 z& s7 t5 _
printf("b is %d\n", buf.b);
6 ?; S, f( u8 S. P+ p printf("count is %d\n", buf.packet_cout);4 D( v6 m- v6 ~' n+ c t
count_copy = buf.packet_cout;9 [4 Q' M7 @# |# u7 V
}% l9 p. ? l+ [$ R
else
b5 x9 L3 ^- ? {
' l& o |1 O; J, L printf("No effective message!");
1 o+ J" W; N' Y6 ~ O9 I' T }
6 M4 X, ~& D3 j. U/ ]* I}
0 s# i5 J0 b0 X' L5 e( P" o( M; X! Q/ o0 m T8 ~- X
$ ]% u* V2 U8 G: j) C% y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; B' }) ?" R& T9 x* g; Z% k
使用下面代码,对内存使用了mmap函数后:
7 g6 f+ E/ v5 S. S#include <stdio.h>. c- _2 R2 p# _. ]7 V: I
#include <unistd.h>
. E/ T4 k9 x: n#include <sys/mman.h>
) n/ }3 L' }9 q$ n9 E6 _#include <sys/types.h>
/ U8 K5 T+ z2 b" ^* @+ P#include <fcntl.h>8 F. V' U/ p; z6 c( T
. X# |# q8 B# j1 o( P8 K8 k7 h
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 {: V& k P8 _* \9 {#define SHAER_RAM_SIZE (0x20000)
1 O0 x2 A: Y, x$ E- v$ c9 D+ o. L) M# u6 e5 x
typedef struct5 m. H4 F3 g' e/ n2 f5 f
{
; I; }3 L# [7 B4 X, v! x unsigned int a;! ?6 `: ~; C: O: o. l( e9 O
unsigned int b;
7 s3 d, o1 _7 `4 `7 D unsigned int packet_cout;
$ q7 T9 R/ B6 S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' ~7 j$ p) ^ F( U' c$ ~- M& B* ^2 c* ?% p. T7 A& W X+ g
void read_MSG_buffer(int *baseaddr);
X. \0 }- V) B1 X; r5 Wunsigned int count_copy = 0;4 i, U2 r- V6 v# E, \- K. B
* |( l8 f/ Q# L& |- ]% kint main()5 n3 Z: q1 k7 `: @+ Y
{: D+ r- q* F: Y2 B/ J1 |# f
int fd;( S, A" r9 }7 ]
int *mem = NULL;
N" M0 U& _- r3 ~' ?0 E5 M( u" i/ U) B" n6 q! ]
if((fd = open("/dev/mem", O_RDWR)) <0)& g5 _- V5 f, C- ^5 b7 u+ e
{: e/ V% m+ E1 ^: b4 G0 ]! c
perror("open error");, x" L) V8 g8 V; S! M% m* j
return -1;
) ^* }) q' R0 A" u. Z+ M6 L }* P% ~ F3 l9 \9 D ?7 }0 u! K
. l% |" F- G5 m, E7 w4 z mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 y3 u5 U" J/ S( d8 g
2 S$ T# ] p; G, B) P$ s while(1)# k+ H8 p4 o5 w2 E
{$ O% M! f1 D& O$ n3 [* G) X
read_MSG_buffer(mem);1 q. |! Z0 W0 c$ i3 o' d' z3 r
} / g& z3 w# D& f
} J& v( \2 v9 g8 C3 H
7 A# P8 y$ l' p/ f" h0 G: {
void read_MSG_buffer(int *baseaddr)
- w- ~0 n9 _ M% k t6 G{$ A- f. \4 H5 ?. N! b
pRX_MSG_PROTOCOL pshreRAM = NULL;
' D! _8 a$ e- m/ Z- K. F. ]# Z9 f* z( O* g `% U- j/ r+ o, q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& C" j8 w& ~/ X6 y* p
' u( ? q# {0 ^2 k2 v if(pshreRAM->packet_cout != count_copy)2 ?% g2 `' |: }2 U/ d
{9 ^ a( q& \, I5 y8 H
printf("a is %d\n", pshreRAM->a);) o0 f: y/ u# l' m; @. r& i4 A
printf("b is %d\n", pshreRAM->b);
+ y+ b" s* y2 @* W8 u/ ]- l! B printf("count is %d\n", pshreRAM->packet_cout);
9 G& E- {' c. O. y' e count_copy = pshreRAM->packet_cout;
& j8 g/ t" s1 i' t }
/ e2 P9 s7 j6 h% z5 K$ U q else4 f0 }/ f' {+ z q% h' b
{
- d( M* o3 Y3 e$ { printf("No effective message!\n");* e; Y* _, k# [6 k
}
2 W) x, S8 i% f5 U+ S9 G}) Y+ @' {' |6 [, M% m3 _
# S0 M. x0 X1 [5 `: E没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. E, u5 r5 R4 A( {3 ?% s
' A4 ^- b/ Q7 X- \; K: k% p+ \# M( |6 k {2 v) e
9 K) |# c0 ?! |7 a
& @2 G- c L5 c
|
|