|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 ? r" O4 S4 ?$ L* b
1 Y* w* L% J) M/ VOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% D' _' `1 d5 V2 C" b2 ?$ U4 A
#include <unistd.h>
' |; R4 e" \- I+ l: f* V#include <sys/mman.h>
I7 R+ v; Z# j5 b% L h0 Y% P#include <sys/types.h>
& M0 H" ~' A& I8 u9 p# N#include <fcntl.h>
" U* C: A" z- ]% C. X, ~: H& z" H7 Z( P
#define SHAER_RAM_BASE_ADDR (0x80000000) 4 T9 h2 g9 U: s: f4 r# i
- F4 H1 r( d: t# i, h: a
typedef struct7 ^/ ]) {( C* B h
{8 d) S& W1 a1 E
unsigned int a;
/ c/ o! j1 f% i i. n3 N. d/ V7 R unsigned int b;
" \, ?- _% d) C6 o$ j8 x unsigned int packet_cout;( H. ^+ D5 K4 {! ~: G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 F' V( G2 y8 ?4 T' ~
9 l1 s, r4 E9 I+ a, P0 ]% P0 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, _& m! B" o8 ?6 x5 ^
unsigned int count_copy = 0;
8 ?0 p% w& t/ e& V3 q7 _, J' j* ~, z. r8 x4 j5 C. M B- I
1 K" X" M d2 D& {- J2 }int main()
* D4 T1 r7 D7 I$ T% l1 j i{
, F) J( n/ T X, n pRX_MSG_PROTOCOL pshreRAM = NULL;
8 n& ?5 O6 X u) f7 z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: O' p+ X5 v' l/ b
3 [' V$ U0 n4 q3 e while(1)
: v" h5 [8 R( U' U7 Y1 b {
+ c, C Y, F6 j5 X% U1 b1 b( C% n read_MSG_buffer(pshreRAM);1 c# s+ x' v6 r/ [
} - E V" v2 G$ m
}
) n1 L. j C9 h/ n; W0 [; B. R" z' F0 L ]' ^8 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 E( W3 |5 K# k% ^% c9 t; c j{- U, M/ O/ i! f# E
RX_MSG_PROTOCOL buf;
8 Y+ l8 p' a4 ]7 \' K* ^
5 e i/ I3 z$ D2 T' k0 J* i buf.a = pshreRAM->a;
. n1 |) L' d- o buf.b = pshreRAM->b;" u& O( F* ?% |5 s R1 E0 @
buf.packet_cout = pshreRAM->packet_cout;
, _0 T2 a8 M4 h& p/ O/ g5 n/ A
. s9 ~- b" K; T1 {: f7 B if(buf.packet_cout != count_copy)
/ m. u; b) Z# y+ \# P0 f {% `1 ^6 P6 W& P$ N3 v
printf("a is %d\n", buf.a);" f5 q5 `- H, e
printf("b is %d\n", buf.b);
4 X5 P2 q' C8 e2 _1 D printf("count is %d\n", buf.packet_cout);8 S U8 l/ B7 h9 A4 R
count_copy = buf.packet_cout;
4 P4 o& C$ j* s. k }
$ [, Z5 a9 d) W else
! E) h% L: Y* x* ~7 ?+ h {- ^, Y8 A6 D4 c# F! P. t0 p8 b2 v
printf("No effective message!");
( T1 G, _, |! r/ R8 I0 ^ }9 a) c7 l! m# v* E
}: Y ?& t6 S( w. c$ p/ g% {
1 r7 f# j0 [" C5 t" o- _; R& n0 G& S1 E5 l8 l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 x. _: T" y, l7 A5 q
使用下面代码,对内存使用了mmap函数后:4 Y* Q1 s) E1 e& A
#include <stdio.h>* s7 w ~% D4 m/ k1 x0 u. `
#include <unistd.h>' K9 o7 `/ I v. E
#include <sys/mman.h>, y# k0 u$ ~: b4 {" h E4 ]0 d
#include <sys/types.h>
$ Z8 I d F8 j0 j/ Q6 ?#include <fcntl.h>
( W: u d, O2 Y- |+ D: |* i
$ Z" [# \9 ]; ], n w* ~#define SHAER_RAM_BASE_ADDR (0x80000000)
- t; ^: D/ V9 o9 y% o3 ?#define SHAER_RAM_SIZE (0x20000) 6 g T# j0 q2 U. `0 R
& C2 g4 F: _7 l5 e
typedef struct) P' W1 x( |, [: C
{
" G& [7 Q1 B! d) Y unsigned int a;
- a3 T) h2 E$ N unsigned int b;
5 ^( D4 o6 e/ O# a7 a3 e unsigned int packet_cout;
- ?" B5 F- M9 a8 P) K1 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# \+ I; p, M; _# z. {) e- K3 h+ ?
- B- o7 U: t# ^void read_MSG_buffer(int *baseaddr);: |: @+ z& e4 i0 |
unsigned int count_copy = 0;
0 H, u* u. H3 I7 u" z2 P4 I* x
( b8 ^, {7 d1 s: _0 m3 o3 p+ Sint main()
5 y) _3 `8 u% c8 H9 Q: a{
. d# P& `) T) e int fd;8 N" H5 ^( t2 L- }* \
int *mem = NULL;
$ `9 o. w Z' A; h/ w! O! p; W0 c) W! X! v
if((fd = open("/dev/mem", O_RDWR)) <0)
, d* K/ S1 I- P9 m' ] {
; y9 U; ]0 E, w. }4 V perror("open error");
7 T/ ^, R, h6 M# o% F- F+ o& c return -1;( W# Q, |+ E/ e. C4 Y9 N" |8 |
}9 ]/ j) a( ]/ L6 a2 T
. v, N+ A( T0 U6 a1 E; r4 } mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ K2 E. C4 a/ q* i' r& g+ r
6 Q; W$ C$ z' L2 s4 D6 c2 E9 I8 i
while(1)
& v$ t! f0 |8 P. O {
* ^: K; J* G4 `! r2 {" ` read_MSG_buffer(mem);
7 k0 b: G( B) s3 A- [ }
4 N" T# M/ [5 _/ w8 Z}( }6 M. i( i8 Q* N" M
# N( }0 k1 J) c8 O! D- {
void read_MSG_buffer(int *baseaddr)1 ]- d3 S, B" B9 c# P/ Z; C
{
- F1 S( R) p5 B# X! q pRX_MSG_PROTOCOL pshreRAM = NULL;
$ p( ~' g4 c6 _3 f2 ~$ o6 H; ]/ I/ D% a; L% ~5 z- M
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. l7 ^0 h7 h6 c- Y: |) ~; y7 n) j; r) D1 O; Q' Y0 t1 a
if(pshreRAM->packet_cout != count_copy)) G. T6 {5 l; a, u/ j& i0 m, u- z
{
! y- i1 ?& T: N9 h3 g printf("a is %d\n", pshreRAM->a);
} c) D, n/ j. v printf("b is %d\n", pshreRAM->b);$ n; r- \$ k( i4 ~3 A
printf("count is %d\n", pshreRAM->packet_cout);: ^! y8 g( O2 |0 u( M; L
count_copy = pshreRAM->packet_cout;' O% u9 m# S" K
}0 n$ j* ?4 R9 l
else
8 T" S' V8 r/ u# |4 z2 q8 ? {
/ r/ L) d& n/ E' S printf("No effective message!\n");4 |4 \9 d6 R) l& k
}, i2 E4 W" F9 V" ^$ h$ K& x+ ^$ M
}# F2 ~. _- v$ F+ x4 F2 s
0 e5 k' }8 P" z* T. \没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% @! n" H( g& W T: B( K$ p/ f C' E+ E. r
/ T* L b- u. |* E/ K$ G: a
' {; T/ e( R$ P& @7 y. C
9 B6 @6 O l8 J5 L$ h |
|