|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% @- A5 H& M1 C+ h& q
, G) p0 A0 n0 Q* ~( o# @# IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 J; c; J' r6 n+ N, N- F#include <unistd.h>, X. k7 |& m0 W+ V# }
#include <sys/mman.h>( z+ z8 X( t* a+ s* s, ~
#include <sys/types.h>
' P% L2 v9 u1 F/ D4 g#include <fcntl.h>
6 i4 [) ^+ i# `) @1 F! B4 H5 ~
$ ]6 {( s7 _* ~. j" C' z#define SHAER_RAM_BASE_ADDR (0x80000000) : P% h) {( z. U5 Z) k
+ W: C0 E2 M$ y/ \: C6 Z4 ctypedef struct
+ a3 k; _( t- g+ d{
5 G' Y+ \9 d8 X+ l) A8 w unsigned int a;7 @1 m. j+ @/ i
unsigned int b;
5 a, I8 N: i2 z unsigned int packet_cout;
9 v0 |% }/ ?2 Q" T- `; i$ F' k1 H4 _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 a7 {; }$ o. H2 k
4 v& Y, I6 f5 O, M+ _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& T" u: A$ x* a3 [8 ^' f" a% munsigned int count_copy = 0;
& h1 {+ r, @" j/ F. V$ ~
+ I. M9 n& `, d; H" U+ ^. _, ]1 _7 M9 ]4 y% i+ L. N
int main()
1 i J% E& E$ u% b( A9 k{
& {, a8 E5 G+ [! U pRX_MSG_PROTOCOL pshreRAM = NULL; T* M- x2 d+ l, _3 p
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# Z: R; x2 i0 w2 z' e; w; m' T& Q- |6 X
5 J) }- x; a0 R' H- E l) C* j while(1)" T$ I3 D( H$ K( P% B& y$ R$ _
{
/ Q+ H: g; H. H; a read_MSG_buffer(pshreRAM);
: c; ^6 {& |! f/ _ } 2 f# a M; W0 B; j3 y4 h# I- y
}
; c* a/ N4 n, K* w- {2 `- h7 L M8 L' K/ k% ~. I N$ L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* D" [# S' @% Z0 g{
! M& @) u5 e B2 k0 M# L2 I, _ RX_MSG_PROTOCOL buf;/ v; b9 g% J4 R7 S6 ~
% l$ k# E4 ^% s5 Z7 O( e7 R buf.a = pshreRAM->a;7 a! ^% u8 O( M4 i
buf.b = pshreRAM->b;; S! p; ]3 m6 o& ?0 m1 i: |" J
buf.packet_cout = pshreRAM->packet_cout;
% Q; S( E0 S2 ]/ B+ l # s. g( c5 @* C L. T
if(buf.packet_cout != count_copy)
# Y% o# d( e5 L& w+ \ {
8 z; r# `: a/ M _+ s/ j+ X printf("a is %d\n", buf.a);: F# N5 j1 c4 Q0 v6 e' x$ i
printf("b is %d\n", buf.b);
, c0 r+ n; D$ f2 w. D5 h V% J printf("count is %d\n", buf.packet_cout);
3 ^5 q: u' ?, A T2 D0 ` count_copy = buf.packet_cout;
/ O1 [$ c& e. z& b" N }
L* r; `' ~, Z) Y! M/ w4 G& e, ^ else
! f0 R0 f/ q& G& K' B6 u p: ^ {8 l4 X& `& j8 d
printf("No effective message!");
+ z7 i0 p1 v/ j& W }8 n2 e/ |& a) Y* B
}2 l w3 A" B$ M( m
% o7 y/ l6 n/ d1 j: J, d- B* O9 h5 J# R) i* o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ p+ e9 N$ w! r0 _) j; z4 h2 H使用下面代码,对内存使用了mmap函数后:
, ]) s5 i$ Z. B( `- A. H+ f+ f#include <stdio.h>9 S! a; @6 h. ]* S' _8 M
#include <unistd.h>, R, K8 h: p y
#include <sys/mman.h>& `- L. ^$ Y7 \9 k
#include <sys/types.h>% z! I c7 o* i+ S9 }% h
#include <fcntl.h>4 N! O1 ^ J& G* y: _: Z
' [" d5 _7 n6 ~+ }( h
#define SHAER_RAM_BASE_ADDR (0x80000000)' |+ E8 z( ^: }- V+ y
#define SHAER_RAM_SIZE (0x20000) ; v2 ^5 d) F/ t! t
7 Y8 d1 z& E) k% v# ztypedef struct
* K! @; l/ \ E9 A4 y* q! x{1 r7 l7 [& _- E* |# v7 m
unsigned int a;
9 ?% L3 H( |' R4 c6 Z unsigned int b;
, Q( w R- R2 O% G# k) ?2 ? unsigned int packet_cout;1 t. A7 f5 x8 @& _0 V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 @5 C( i e1 _; Z1 ?0 `# {8 x8 V2 C7 ^6 n+ [, n
void read_MSG_buffer(int *baseaddr);
& q) s8 b% P8 c8 u( Qunsigned int count_copy = 0;
$ s7 }2 {* i) _- |' z- R4 h9 n* z' \
int main()) A" g' _# v+ ]% V
{
# \( u% F6 J* n. s/ k" g; ]) c4 c int fd;
* n: L- i/ \' D% M5 _, v! o0 _. F int *mem = NULL;: x) O" H/ U/ ?
3 g( P- m/ O( Q0 P8 P; H
if((fd = open("/dev/mem", O_RDWR)) <0)
7 g% R, S% B" H ? {! c- S/ O9 P5 e7 ?+ O0 g
perror("open error");$ u' \5 p) e' |7 R6 G1 {
return -1;( L. X/ `$ {9 P% M, M' x
}
$ O w% k z$ n. \
4 G+ x' ^0 e8 h mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ X& R% D2 P$ t+ {
" ?9 i$ y, R6 N$ B, C while(1)3 K$ D1 i6 g' G1 F1 f
{" h+ B: e' X9 ?, P' o( m- L3 [$ r4 {
read_MSG_buffer(mem);: R$ B- L* E4 J3 J& f& ^
}
/ j( k: W) ^4 D) u}! k" ]0 ~# o+ L1 H% `/ d
' @* w/ S" K1 z" V" yvoid read_MSG_buffer(int *baseaddr)" ^# R0 X7 o, {) J( N* d, M
{
7 O" u; d: |& I! |, B. _* t3 C pRX_MSG_PROTOCOL pshreRAM = NULL;. x) {1 e) x" b. y, J
: j8 R: @, a7 T8 U. y# [ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" m' C3 L/ k% H6 t, U
8 E# T8 Y9 C" W& @" {8 d
if(pshreRAM->packet_cout != count_copy)
+ @/ J. j5 `; B: [ {
- x3 T! Y" I9 \& \& E printf("a is %d\n", pshreRAM->a);3 c \5 F+ G6 ?4 s$ C
printf("b is %d\n", pshreRAM->b);
4 I# r2 P$ z P8 `5 j5 G printf("count is %d\n", pshreRAM->packet_cout);
& R( X9 ]1 X- T6 L. s count_copy = pshreRAM->packet_cout;
4 g2 @6 i1 Z+ t }
* P( Y$ z0 ]& n( L) c else
7 l4 g$ G8 J) G3 X0 L {
/ m6 n |9 i7 n2 `4 K printf("No effective message!\n");
& c; ]2 \; L! H1 w }
6 G0 N2 ~, l/ A! p) B: M; n}
0 y8 z3 H3 \, P' f0 C6 p9 I8 ]3 K2 L# _5 E1 z/ B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, N# O/ `( B" _/ _! [
: g6 x# F( e5 {, |- k: W$ l
' r5 F; Y- n# |& `. ~, D3 i
6 [/ y/ U* ?* _6 d
8 T7 b0 p6 c8 D |
|