|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
s& n0 }! H- z# ^. g+ o: ?5 s+ G8 W: e( F4 M# |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 d2 A! r9 j6 {; r3 v0 p" o0 D#include <unistd.h>4 F9 M5 @$ t: Q) f O3 x6 p4 K
#include <sys/mman.h>
3 }8 U* N1 o. Y# g) l5 A h#include <sys/types.h>7 P8 O) N3 A* z! R
#include <fcntl.h>
" k" \& L* z V1 n4 g
! A9 h! U- e+ L1 c; s8 u#define SHAER_RAM_BASE_ADDR (0x80000000)
* C2 h6 G" y$ _$ m4 e
5 C i6 X# K# s n X) Ftypedef struct
3 t* T1 Y" N1 \{
: K# W" D' S* c6 h unsigned int a;' X6 y% |6 ^- ]. {5 k
unsigned int b;. E' w, z S3 s- Z
unsigned int packet_cout;
7 k4 t. E+ L0 z/ H5 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* W H, G8 w& m! v, p
* C2 R3 e2 L8 u0 |- Q! Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: j3 {2 \# @. P! F0 D& L+ tunsigned int count_copy = 0;1 w$ Y& v9 Y; i' [4 `
) k% F) b$ w6 C* Z* T% F/ N3 o. i
+ k* n; l# j! yint main()
4 N& Y0 v7 q& W: [9 v, s{+ D& F) @2 Q8 _
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ K6 Y- H4 @5 H$ W, u, [3 l+ a pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 m& r1 I& d1 f) S4 o% b( n1 x# x
while(1)
7 P6 f- n7 Z0 h1 w4 O' _ {
2 J) u3 ?$ a% h+ w read_MSG_buffer(pshreRAM);( a8 E7 |3 P( _- r8 A
} 5 M7 L2 y3 c2 k4 n! l& e9 W# Y
}
1 c5 Y! E. J/ w0 ~3 O0 y) G5 W3 n) G) A3 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); D) v [6 \- q- j2 e7 X9 {: T
{! ~. O: o v, i# ~1 k0 h$ ~
RX_MSG_PROTOCOL buf;
$ B9 O ?$ f- J" g
* U3 W# G# x8 y! N- s9 [) S- | buf.a = pshreRAM->a;
( h0 o0 i) [7 a1 s9 B/ `6 i buf.b = pshreRAM->b;" g9 b4 p n: Y' \8 {. s
buf.packet_cout = pshreRAM->packet_cout;
' c. U/ N6 F3 v! Q
0 \$ t( @1 T& D8 _ if(buf.packet_cout != count_copy)! o. S: W3 K, a% f r( c
{
/ O! e0 k0 T% ~' b- f5 M printf("a is %d\n", buf.a);
. S( x3 f% K8 V h" o2 @, { printf("b is %d\n", buf.b);
& t4 N0 Q7 t1 ]0 C printf("count is %d\n", buf.packet_cout);
1 p2 S4 d2 t7 q( F' A% U& S count_copy = buf.packet_cout;
% L& h( [3 `7 a _ }
1 j/ ?# S- E1 F1 s# E( l else
9 G, t5 I* x' D2 L: c" }& i' a {, e, T. O" T5 C$ V
printf("No effective message!");
7 N2 _; t2 n% D0 ^, O8 c }
% ?9 C1 B0 v2 r% B3 G3 K/ g}
# y/ K" [" Q. [
/ L: r( I5 r# p
; K" V- Z3 m( S9 T y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 T6 E! m* e5 O& J2 J0 o# y2 P- S1 p使用下面代码,对内存使用了mmap函数后:' n3 f! `+ ]; Q; k: V' A
#include <stdio.h>% d7 F* j4 J |% ?
#include <unistd.h>
6 ~# u* `% o- l9 p9 s% E% F- d9 s3 R#include <sys/mman.h>, l: ]* m9 f& r1 E, Q
#include <sys/types.h>
, i8 S+ c5 T' K#include <fcntl.h>
$ e! z$ u) n$ R. P, e1 \9 ^
1 g Q& q3 ] E, \#define SHAER_RAM_BASE_ADDR (0x80000000)
& H, |5 }' m+ o) X#define SHAER_RAM_SIZE (0x20000) / y' M& k a' d3 b8 n# {
6 _6 h" W" h4 Q- X2 a
typedef struct
, Z* x; Q# u- `: j6 P- w{$ z8 Z0 y d. o+ U/ S/ |
unsigned int a;% m4 Y6 f! f5 ~: F# ~
unsigned int b;: M0 j4 p. ~1 Z) h: V8 ?3 D6 _$ `
unsigned int packet_cout;
# E, w( a4 W0 r0 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( x) |6 a; F0 y- T. b. Y
0 Y. |3 e* _, K
void read_MSG_buffer(int *baseaddr);
4 C1 E$ ^* i [8 W/ l0 P7 i4 o* Z. {unsigned int count_copy = 0;2 K0 l. K6 W t
' F6 }. c: h2 E# x7 qint main()
( v: D8 X0 d- ]{
: B% r0 G8 s8 L4 | int fd;
( y0 G0 n/ S7 K int *mem = NULL;% q6 C% ^) Z1 Q+ [
- V- y& s/ w& M/ K* x2 T6 g if((fd = open("/dev/mem", O_RDWR)) <0)
8 r+ Q' |+ K+ x" X( o( x2 Q/ {+ S {
J2 G0 }( c& T' L" A( P perror("open error");
& f% U# x5 x2 G- C. ~% z' x return -1;- |4 P9 @! Y% H! w
}5 l. e, R2 t* F. g# K6 @
5 Y9 g U% W( Y/ C4 d$ g
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 v' z$ z( g9 L. w2 q: H) Y: G2 b8 T0 D) A* _$ u% i9 L' Q
while(1)
) r2 |" n6 o6 g6 V9 Q$ F {
n+ `* e" H/ Q* X6 ` read_MSG_buffer(mem);
: i+ `7 u* J& p0 K4 z }
! ~$ ^& ?1 R f}( L' [3 i5 K, x
* T5 m1 x& H; ~( s
void read_MSG_buffer(int *baseaddr)
# n! a8 b" m+ l( H' l4 y3 D{) g) y% ?& i2 X3 _! u( E* F
pRX_MSG_PROTOCOL pshreRAM = NULL;- a# w/ F) L& q; }5 d" M
0 ?. {: D% b9 `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 M- {8 X" B1 H/ u# k! `7 z2 l0 U
( `; R g9 u3 D6 q, b( u if(pshreRAM->packet_cout != count_copy)
3 D- ]5 p+ B4 d2 t1 Z; f/ b4 y. S1 e {8 y q( }, P U: Y; r# f) N
printf("a is %d\n", pshreRAM->a);
- V9 D/ S0 S1 a3 I' F6 o, N% h printf("b is %d\n", pshreRAM->b);5 [4 v# P/ ^1 p, b! t$ ?
printf("count is %d\n", pshreRAM->packet_cout);3 H M( g( W1 U* H
count_copy = pshreRAM->packet_cout;( ?! a/ M% [* t* ^
}
" X. K i. v8 J) a, Z! Y else
/ \6 M# @0 F/ b$ b {# x) l, Q7 l; S. w t
printf("No effective message!\n");
+ t3 l* C: g" ~7 o- E/ E& E }5 V$ g& L. T" ?4 f6 H9 t
}
; B# @( q3 `1 d8 @7 O; S& H1 k1 n$ P. Q+ E; T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' H, ^) d2 v2 E+ @$ O3 s5 c/ N; b/ M- Q$ o5 T$ c
1 S2 S2 Q( _$ ^6 R" k( o1 z! V
{; I% j) [1 {8 U! J9 }6 ` a/ h3 b) O0 v
|
|