|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % K/ K$ k; O- A5 F" c2 }
) e9 j0 T( M- F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ }5 B% j8 P2 `# D8 N" m#include <unistd.h>) @- v; ~. N7 n* A. f6 ?
#include <sys/mman.h>. |; s) \1 N8 d% u7 Y6 ~
#include <sys/types.h>
. _: c& V7 S3 D" [# m#include <fcntl.h>
1 p3 V8 P: `* u1 n6 C
7 X% h$ \$ q( U. B9 f#define SHAER_RAM_BASE_ADDR (0x80000000)
6 L: U& `! Y! y1 `% T2 s- r- a" V$ Y! N/ e
typedef struct8 V6 D3 [$ h. l* ^8 B# D
{
3 ~7 X$ a) I+ e7 ?; r/ F) |" b unsigned int a;
& p1 C0 C5 {' q4 H unsigned int b;
; u' n' H( k( Y- @: Q unsigned int packet_cout;2 n# \, k$ s0 M m- H/ A! C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 K W: r5 z* ^; V. D# _$ J, T' V7 ]7 H9 ?! q; H: _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* B! F# j/ E( h+ B$ m1 ]' z
unsigned int count_copy = 0; W) g$ ^$ V c; }5 l' b
% p0 }" E$ k( P3 X* F
& k2 h% C" P* ]- s! z( Pint main()# M+ c% v& [* E& O, A
{
5 \) x3 d4 O/ K, i- ?' s8 P pRX_MSG_PROTOCOL pshreRAM = NULL;
/ j5 \- d" I% ` pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- F% c t4 n' O3 Y) v# M8 t
1 v$ N; }7 I( {/ x while(1)# F9 ]( z. \: x% C# U
{4 Y5 r: C" e' L. I0 o2 w( j1 M
read_MSG_buffer(pshreRAM);
4 Q. y+ a3 H. W. z O- P }
, }4 s& C$ i+ Y. W9 O. h% U. y7 t}0 x& D$ S9 x( F4 e
7 p% X7 U- H( s! F _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 K6 k( a ^; |8 ]5 K5 Z2 x
{$ ~- `! I$ B+ S0 a" i) o) _
RX_MSG_PROTOCOL buf;. j. K0 r7 q: Q! K
& A8 u! }5 | Z' K: ^- ?, E buf.a = pshreRAM->a;
2 g7 X' M* f1 A buf.b = pshreRAM->b;
# K5 s" Y% }1 M, A- p buf.packet_cout = pshreRAM->packet_cout;3 z$ S& _/ ]6 A
# R8 Z0 Z! Z# `" K- i( |& d if(buf.packet_cout != count_copy)
% Q4 P7 h' |) G3 ?2 P& Y2 I" [ {
% H; y. {# k3 W printf("a is %d\n", buf.a);9 S2 g. e# ^+ y/ x# |4 ?' n7 j
printf("b is %d\n", buf.b);
8 J2 @2 H5 D) D/ s0 x* [ printf("count is %d\n", buf.packet_cout);( l4 t& v( v4 \5 U7 Q" X7 z( m0 o
count_copy = buf.packet_cout;) ]% `+ e! H6 _8 P; h
}
9 I; o9 e: M, u: w else) T1 e: P4 G& k: U+ Q/ D
{
& B: g9 V% Y9 y" u% G3 i. x: R. G; n printf("No effective message!");
( W6 M3 Z% j3 ~' S Q }3 M" d8 ?+ O3 H* U1 x( G6 l( |
}
$ y, F0 C$ x6 {" T' z: v, j! V
' Q+ w: A( Q" V
$ q b9 N# j+ q2 Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ X* M' d; Z5 p2 T2 T7 [* i- P
使用下面代码,对内存使用了mmap函数后:3 F) a: k) Q2 Q7 Q& C9 o; ~
#include <stdio.h>
# \1 B4 a9 d1 |5 Y#include <unistd.h>
' n+ x4 A4 E! f6 r#include <sys/mman.h>
2 a: H& d1 H8 j. w/ B p#include <sys/types.h>
. t. H9 s2 C% n' v#include <fcntl.h>
) O5 P" b6 n. h8 _0 T1 d0 E0 \; p& g' p, U3 a
#define SHAER_RAM_BASE_ADDR (0x80000000)
}, M: l( Z( c$ v#define SHAER_RAM_SIZE (0x20000) " A. r7 N$ ?5 H4 ?3 H
' G) a1 y; b, p* k3 \
typedef struct( i% e( i' v9 E/ L
{
& t3 q8 Y$ W# g. u unsigned int a;
& ?! w$ Y8 W& z; o' I5 X unsigned int b;
# f2 g. v* u/ Q* L' y7 e) M2 U3 I unsigned int packet_cout;, j; v# t) d" j/ u" c- O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& a! l- I5 B) K, H2 I
$ t9 v" m: O: C( A
void read_MSG_buffer(int *baseaddr);, t8 ~* O$ M9 w9 M7 R
unsigned int count_copy = 0;2 W- z* b4 W7 L6 q9 E7 a) o
5 \! F* m9 k. e/ X6 g& H7 P
int main()
8 h Q* Y3 @9 w4 B1 B{" D6 w0 H5 T5 A; P
int fd;& X. C& B5 g V
int *mem = NULL;
& S1 E, c% f1 A+ L6 C2 N; L6 f
! ~0 @ U. G% p* W: x- B if((fd = open("/dev/mem", O_RDWR)) <0)
% a% F2 l K h6 t: ?. A( Q {
+ i0 r, ^: @ h; ~4 X perror("open error");& q: w; O3 B1 \8 L: d- d9 b
return -1;
& M: d+ M j. e: [% u0 ^ }) e7 j+ B( U& n2 e$ U3 j& l
( R. g( a6 z9 V
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, r B+ ^& J6 Q9 c) Q0 h
" ]3 H7 d# x7 I while(1)
4 j5 o6 _) f- C0 j; d. g' G {
, U: Q" Z$ C3 t+ S! v1 e read_MSG_buffer(mem);* r) X) c. t, |4 V5 {1 g; M$ f
}
% U# r$ M U! }! z. d% s6 X}/ M* Q+ `1 m7 z# @1 V: M- T' w
3 o9 q/ U* @8 yvoid read_MSG_buffer(int *baseaddr), V( [9 U) N; ~5 x1 _. T
{
9 X8 b( X6 e$ l! W pRX_MSG_PROTOCOL pshreRAM = NULL;2 D- W( w {, y% [* R/ N Y
+ ^9 [" v' a1 ?% B) a pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 k2 t4 v7 i6 ]% H8 f# @+ i
" ]- B. Q. M6 B- a& `
if(pshreRAM->packet_cout != count_copy)( W; E+ k4 A8 I9 l' ] F+ o5 {6 y
{5 U# e, a: ?* K* R+ _' Y6 H- y
printf("a is %d\n", pshreRAM->a);
) @4 P2 F- D- {/ B) X printf("b is %d\n", pshreRAM->b);7 S* k( v5 Z1 m
printf("count is %d\n", pshreRAM->packet_cout);
) S; Z$ z: j4 U4 S- t count_copy = pshreRAM->packet_cout;$ J' g) M# l5 W0 D) s3 k
}0 S; Z, V# y8 s% I; p6 l. K
else) r2 Q$ ^: u5 ?6 E
{
8 Z$ m; ?9 z( } y5 c: G printf("No effective message!\n");
: n v! E7 X) o) s+ a4 F, m8 ~ }& f1 N- N4 B6 m! D7 Q
}( u1 _& x; `1 ^/ m8 }; g
0 B2 J" v7 P, O: E$ l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 ?! q- h5 |4 k* N1 ^$ a9 Z
/ Z2 O8 u% E' I
) B) A0 N) H9 x
" }0 u/ G3 H6 v& O9 Z0 {% l$ ^" ?$ Y- r2 w6 e7 v+ }( }
|
|