|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! p) d% n5 F+ ^; E/ `$ x% S+ e8 u9 S) n- n0 I, B2 t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 ?; s! Y: m! c, Q- X$ N7 E#include <unistd.h>; k. @4 q- j/ d0 u1 |6 X- z4 i
#include <sys/mman.h> A2 E' O* G6 v* l4 j+ Z
#include <sys/types.h>
. Z. x8 I4 ~( j3 j. s#include <fcntl.h>
4 W8 b, X/ b( U; e7 u& y& J1 _* Y
. e7 Y+ M, x. i' X% S, q#define SHAER_RAM_BASE_ADDR (0x80000000)
9 {& C: K& L* U
5 B% }4 Z4 N' k1 |+ }" ctypedef struct
- i9 ~/ g/ m) z4 N{7 c1 a& m/ P2 ^" ~1 @% y
unsigned int a;0 u3 m+ `, _! |% x9 P$ P) j) x3 M
unsigned int b;
' O9 E' e& k) F& D# K* x unsigned int packet_cout;; l9 w. E$ l2 N0 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 a7 t4 G$ y- n w( _
2 D! _! Y0 k3 i0 K# Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 q8 x8 I. t& d Y1 a2 T$ Y9 h- K9 @
unsigned int count_copy = 0;3 P2 p/ D" h2 u; Z! u
* e, h& R+ d- X! I) ~2 \) ]$ k
G# r" d! @, x A/ X: T$ A' l
int main()* z/ P/ {$ O3 ?/ n4 K% ^9 F
{
A. g4 |; G# S- B) ~ pRX_MSG_PROTOCOL pshreRAM = NULL;
8 g3 C6 O9 M, a7 R; m pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ L" C. B3 F1 X5 Z x1 c' I0 k' G r- g
while(1)
, @' V1 b# e' t0 u7 o" V) W0 ` {
7 o8 q& I3 G+ u; T" c9 g" K9 N read_MSG_buffer(pshreRAM);
0 y+ |) c% A1 c: \" k! j }
* ^6 L/ y3 L* ~; [, q; T' a' \}2 o5 y( ^ t, |4 ?& J3 E
$ G; e F. B) u* z5 [, K1 m5 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; c! n: e$ A* @5 [" K+ S! B5 F9 l: r. k{- ? u; @% m; ]4 T1 @+ M
RX_MSG_PROTOCOL buf;( Y1 F4 V5 s) Q' b4 Y
% _2 [. c c c7 S& B; O5 x0 j: \
buf.a = pshreRAM->a;" d: _0 |! @4 K: W
buf.b = pshreRAM->b;
5 _* Y0 m& i+ N/ {' }% m1 { buf.packet_cout = pshreRAM->packet_cout;
9 n' t- B$ W) ]/ p$ t
) a4 S W8 K0 [ if(buf.packet_cout != count_copy)! h7 w# l9 H" ?3 z- Z
{1 w$ U, n- u: u& a
printf("a is %d\n", buf.a);: @# l' Y8 f& v n* d$ D& `
printf("b is %d\n", buf.b);" Y$ L' R2 I; @+ }: ^+ b/ y2 `" X
printf("count is %d\n", buf.packet_cout);
9 x& C2 k# u7 q& F9 |9 h count_copy = buf.packet_cout;9 t- ^6 `, E' g8 t+ }4 p- [
}
0 b$ l+ _- W) d7 C# u* x else9 R/ A1 ?9 g/ X2 G c6 Z' q4 ~
{+ Q4 l; Q, x' V1 {6 A! ^& @
printf("No effective message!");2 X- \- b: U& {$ }. q; `
}) ~: |+ l2 O( H; Q2 U2 B
}
7 `# g" f' [. K+ c" r& ]/ ]0 N/ I* G0 P
7 C0 [6 E, X6 F" B. X( I4 _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. X p |& d' L9 ?+ H. _0 Z
使用下面代码,对内存使用了mmap函数后:
* ^* X. x; D ~0 O7 F a% _3 R#include <stdio.h>
& `. L/ h) h$ D; Z( Y#include <unistd.h>
/ H! c4 M4 @' ^! Q) D' c#include <sys/mman.h>
/ [( g8 V3 a: ~, o5 q h+ K* ^+ [#include <sys/types.h>
5 p7 [" p3 w% Y& j! ]3 v: [#include <fcntl.h>
7 Y6 ]9 G7 X7 W* m: n, f( K2 d6 \- H
! _% r8 \" |9 V4 A3 |7 P& v#define SHAER_RAM_BASE_ADDR (0x80000000)
B3 e% c+ K9 v" @#define SHAER_RAM_SIZE (0x20000)
3 r+ I: s2 D4 u+ n
7 A5 d6 ]' B0 |+ I; A- N/ htypedef struct( W; f( x; Z% f# @9 ~1 a/ T
{
3 H/ n" Q# q2 i unsigned int a;
3 p1 C) j9 k2 d& |+ T unsigned int b;2 q- V; @! q+ G' B
unsigned int packet_cout; Z$ y- t* a' z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 r) ]0 k" O$ q- G8 e( l8 ^( h0 z$ h( r
void read_MSG_buffer(int *baseaddr);# n O5 h7 }1 G7 X
unsigned int count_copy = 0;
6 A5 X( A: b9 m7 `8 C, ^8 c' w2 ?. S( d; d5 ~# |
int main()
6 L2 Q1 ^) s- W4 ]+ {$ Y: i{8 x8 m! g4 u% f% d- N* v/ A( g F
int fd;
/ y: |9 o& y6 M: Y3 e i int *mem = NULL;
' j& Z' ^, G, z% {, n+ S5 N
; p9 n$ _" k! n1 M- |( L- y3 Q3 i+ b if((fd = open("/dev/mem", O_RDWR)) <0)
9 z# v& b1 h+ Q0 g. s$ |# V {: O1 ?' [3 d9 ~' R
perror("open error");* h0 P3 ^0 {' O% u% k j/ w
return -1;
. Q& x+ j3 E0 c8 \$ d k }
& A; X0 E g9 d# g" S
' f& I9 S# R: g2 Y& [ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 p- J4 M, Q* J% L5 ~# X, \" B! H7 I+ \3 _. I7 B# j3 U
while(1)
( V5 B% F6 D4 G6 z { v7 C e4 j& Y1 E+ B* i" x
read_MSG_buffer(mem);
7 E u: p( A" e0 i2 c: F9 _ } ; W' k1 ^9 `' }5 J* d
}0 j# x6 I6 h3 C" B
; z" ^# N' ^) H3 j9 A& K7 i1 r
void read_MSG_buffer(int *baseaddr)9 L' x3 @. Q3 L7 B# F3 h) S
{/ h, X. e s9 ?; s) d
pRX_MSG_PROTOCOL pshreRAM = NULL;, k% c2 T6 M: l% ?& }! m, j0 R
) N" }4 q. O2 N2 i) U pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" E% C* a4 _" P2 ]' m7 s$ U
) r. d, H8 W1 C0 \5 m5 J if(pshreRAM->packet_cout != count_copy)! j" J, ?. H! U/ j
{$ g' P# p& V" f! K' P1 N
printf("a is %d\n", pshreRAM->a);" q+ H, b) e" Z3 B5 M
printf("b is %d\n", pshreRAM->b);5 N9 n$ ?2 y4 A. N! t, d, J) @& g! c
printf("count is %d\n", pshreRAM->packet_cout);1 g1 l0 ?( e$ B0 g
count_copy = pshreRAM->packet_cout;
& ]+ u% k& }/ t }# {4 h4 \+ a/ A
else
' H7 Z! w* D) k- }/ R' l {
$ Q m3 N+ Y% q5 l* } printf("No effective message!\n");
S- K# j5 f8 n) m" h) ` }
% Y8 @& ], H {0 c}
- u5 P ]8 F/ x. d1 P! M3 e
8 S$ A: c, `1 i! v$ U! u. m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 [' H, ~4 E [+ \
: @; s: m/ g. P: t$ S8 |" A4 J9 r# A! J- p9 T, t: ?4 Q3 @
5 a) w: E, x) r5 V& X. D# K# p0 ^* P! c0 Y; L s6 R
|
|