|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / G) R$ f- }) H& d% z+ T, x! ?- N7 F
# `* Z5 M; P5 r1 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 Q$ U/ @1 U! Q% _2 P9 h
#include <unistd.h>0 k) S2 M( [4 `8 T7 U
#include <sys/mman.h>
4 g [4 {! F6 H+ K#include <sys/types.h>1 t2 G. t* s+ w8 ]: C- i5 a
#include <fcntl.h>
* s$ V. C3 A* w9 [3 H' B5 F7 J
/ I& N4 W; K' c# I" u+ X+ u#define SHAER_RAM_BASE_ADDR (0x80000000) : P; \1 Z% L# _, j& y' }3 n
: E+ K& |8 U( W" p! i7 ?3 K/ _2 itypedef struct
- `0 ?4 v. H7 I{! F+ r( Z8 U/ x( c! D: j3 c4 P
unsigned int a;
& g5 \8 |1 d# C& A* J) o unsigned int b;
* U9 R9 M9 J6 n, i1 M4 G7 i unsigned int packet_cout;
# Z+ U$ g: l p& M; }+ x$ }. l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 M- L Y/ Q/ `5 z$ _0 T, h7 R2 z$ J3 ]4 S8 p3 @0 X' m6 }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 I# q7 t; m; K& }unsigned int count_copy = 0;4 V- i Q2 f2 B( X# Z1 \
+ p& S. S7 o& H. |* m( u
7 W- a7 k4 K, y( Dint main()
K& v6 h9 f: K( H{( A u4 Q3 n5 Y2 f, F6 Z1 r
pRX_MSG_PROTOCOL pshreRAM = NULL;. A- U4 K5 Y7 }5 _7 V. B8 x0 m$ h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; V6 w+ `5 l* t$ r8 l. u
; f+ U9 t; _2 r" k2 Z& a" k' S0 t% K
while(1)5 p/ l4 d$ c+ X9 F
{3 r$ J7 P% e. u7 c$ ^
read_MSG_buffer(pshreRAM);
" m% J; P: _2 k9 W+ O }
% q' r4 L1 f8 z5 G7 x- E. T}
1 H( H) q6 `7 l; M% W/ S; u+ p' q! ?/ ^' }1 o( |7 W7 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ ?$ m" m" m' {
{
# g% @5 D/ m: K/ U5 h: D1 D RX_MSG_PROTOCOL buf;
2 E) ^, y4 @5 e P! @# z
# w* R6 s& X o buf.a = pshreRAM->a;
$ `1 }/ |. c! @1 \! W& q9 O; b buf.b = pshreRAM->b; U8 y; J+ P8 y
buf.packet_cout = pshreRAM->packet_cout;
O% u: J$ \+ P 2 o* E! k. Z/ ^9 V$ y t" D
if(buf.packet_cout != count_copy)
+ \- p7 n2 { S# {% I4 J2 q1 v {9 U/ t/ L8 v' M, t
printf("a is %d\n", buf.a);
. u$ D; M. W* n" e( f printf("b is %d\n", buf.b);
* I A( S Z5 X; q; H1 B: f( ? printf("count is %d\n", buf.packet_cout);
4 x( s* l$ P$ W; L) a count_copy = buf.packet_cout;
6 P+ M, R6 r/ S }
( b0 v& W; W2 T1 a0 b. t! R1 k else
7 s; b% o1 M0 i. ?* v1 C( q! b {6 \% z9 |6 u. w1 L( Y* B/ l4 ~
printf("No effective message!");) j" n1 `, U' K* e4 J+ ~
}
3 u& [& C. w: J2 b% \5 S2 t}
+ P" P0 k2 S+ Y* m6 k( a& a& v9 [( T% t
' a7 z3 D* ?& L" F7 d' G8 i H# W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& X, y: ]+ Y- i9 n; C& o: d& S" E& D使用下面代码,对内存使用了mmap函数后:
! [, E- E2 E8 x' ]7 ?1 L#include <stdio.h>1 `. m' J: b% K" ?4 v* m( [+ a
#include <unistd.h>
( q/ b' L# x6 B6 u#include <sys/mman.h>
' D5 v u* x* f. [$ g4 k% x' x#include <sys/types.h>
- Z; ]1 h& O6 ?$ ^4 p#include <fcntl.h>
, q9 V {$ J1 ~0 Z% j( P6 w
6 r z9 _" C& n! N/ c1 x- A#define SHAER_RAM_BASE_ADDR (0x80000000)
7 j( A, y4 O+ x. z% x% G8 o#define SHAER_RAM_SIZE (0x20000)
+ b2 f$ s) P+ G9 ]5 a' H$ ?2 d
9 g8 q6 ~) t% v" ^6 |* C; Ztypedef struct
. _ ?% z; X( i9 N0 h+ G# C* u{9 j x4 F; Q% d/ [2 Y
unsigned int a;
, ^3 H7 G. L: N: i6 m t unsigned int b;
9 k/ X, u6 J& l" v3 l0 i unsigned int packet_cout;* u, B. l6 d9 C9 f& H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" Z, L- q% m1 V+ f/ [
* L5 m6 w, l; g0 a4 h- h j- s
void read_MSG_buffer(int *baseaddr);* k0 n. t* K! i
unsigned int count_copy = 0;
( g& f E) h! v$ n3 D( ^* }5 M: B8 R+ p7 }+ j" ~7 h; f
int main()
7 i/ W7 [3 q( C) |9 @{: w D2 A7 k/ F' N n
int fd;
. W' _! R' ? a6 t2 T int *mem = NULL;
0 T% K0 M4 U6 P
2 Y4 S4 Q! U5 e u: w' B if((fd = open("/dev/mem", O_RDWR)) <0)
a3 h) _* ^0 z. Y( {! n/ K: _ {
* J: @) M( J* b! T' p( X perror("open error");
, [& I. d6 t/ r( b& Q) m return -1;7 C3 @2 g) `! j- m9 ]! F7 w
}
/ D5 `# H, q" J" \2 u
) I! d5 G* l/ |( y4 F( c mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 F. ?; o1 `2 t8 ]
$ D4 @3 |. _8 x q3 Q# L8 S( L
while(1)
3 ~# b$ M" F& ^* I. r: }6 ], _ {: M' X0 ]0 i2 x, s8 @1 ?# Z/ m ]6 j
read_MSG_buffer(mem);# E/ B3 F2 I& @6 w( R+ s; f
} " b2 U! _2 i' s9 U6 w& B4 L7 e. W
}9 R$ Z+ R" ]1 @+ w
6 N- f) _3 Q1 J' H2 t! kvoid read_MSG_buffer(int *baseaddr)
T+ A0 p2 q# D{
. [" H) S9 r/ P' Z pRX_MSG_PROTOCOL pshreRAM = NULL;
$ j% Y) [3 e, e% H2 O6 W8 A2 L1 S# h. B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' @: _+ e0 }' x3 N; M8 Y
9 n* x9 E" v( x1 X if(pshreRAM->packet_cout != count_copy)5 Z3 i% F' N- o4 A+ F2 D: F) ]5 B& l
{
' a: [" m( |* F& f! u printf("a is %d\n", pshreRAM->a); h5 a1 i6 P; |6 D% ]( H
printf("b is %d\n", pshreRAM->b);
8 E r2 K; n$ h" A3 k8 y3 o printf("count is %d\n", pshreRAM->packet_cout);
5 H' w# L7 O/ _, S G count_copy = pshreRAM->packet_cout;
- U; _) |: r. @! Z( o v }
# U, }2 L/ y4 k- v, Z else" y8 z& }1 f+ w% |7 n; {1 v
{, i! S1 V$ Q u$ x, {2 t
printf("No effective message!\n");) B' p+ h; B' ?; [4 u
}
A" y* Q7 R8 c3 j}
( n V/ F. M ?6 d" v7 L
7 R( X" y X! P$ [. K0 G没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. m( t. r- e1 l; y
& B B. N+ ~" ?/ d' w0 `5 ~: T! D
& V5 x" v, V. ?1 X& o. j
5 Y& f) Z1 Q$ m: k$ `. J1 s+ D2 y/ i: ?6 {: i! }
|
|