|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; |6 [) P3 ^$ E, j! u( u7 J& w( E9 O h
$ q8 Y3 J2 ^, B' o& z/ a- B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! H$ R! N, y8 X: i" j" V9 e#include <unistd.h>$ {# Z& S! P( U' T
#include <sys/mman.h>
9 R7 i. X6 L3 s1 n7 B6 v( V0 p#include <sys/types.h>
) J. L6 {2 ~: L3 |( Y- `$ {#include <fcntl.h>
# j# @1 p6 ?; M/ g( b, G9 H1 ^& a6 c% |5 o
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 ^+ L7 P, L; U- V; N& ]; a( x1 D8 {6 g& Z! D
typedef struct
) e+ c; m& s4 \" ], U" U/ _ R{! U/ ]9 L \ ^+ ?
unsigned int a;
2 s: n4 {4 X+ P* f8 Q( v, o unsigned int b;: V/ X* e% w( U0 Z
unsigned int packet_cout;, }0 i5 P/ _0 X5 D: Y; V6 \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( ` [* d% `2 K' V9 I
. _, ^" T! m$ c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; B& K+ q. E$ U8 s6 N' Junsigned int count_copy = 0;
9 G* c: @9 {' a9 M# l: h
9 b4 ^8 v0 `3 M b1 \0 z* y( h) z/ g: N p: \, W
int main()8 ~) X$ R9 Z! M" G) [! b
{
; ?$ |/ u8 E6 a B1 }5 E pRX_MSG_PROTOCOL pshreRAM = NULL;
/ T8 s6 H/ R% H$ @: D" P pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& V. k( u/ `0 M# f$ m$ s
2 \; J8 X4 A. _! q' K while(1)& O3 P* c- f' D
{& _4 b! k: K8 h) U4 Q
read_MSG_buffer(pshreRAM);/ U/ i! o0 q4 y, _ j+ w2 b/ A9 `
}
+ p. Q6 A: W+ U' w& ~& c* f" ^}
: f# l- g% J/ D1 s3 g0 k8 U* l' a, W1 J3 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ n) U K" P) G+ R! i3 a# g% \{; I# Q% p3 ]+ l" `8 b
RX_MSG_PROTOCOL buf;- g/ j! ?* q$ |2 w9 ^! h' ]* t
+ J2 p4 q/ t$ c2 q0 p buf.a = pshreRAM->a;$ m% E& _4 m8 H! c* H' }* r, s- Y
buf.b = pshreRAM->b;
4 U; w2 v8 ]/ Z5 r6 t/ ~6 ~ buf.packet_cout = pshreRAM->packet_cout;
. x; Y* O! `3 [1 u1 B' q) U. y& y$ K
* j, q$ \5 v. k if(buf.packet_cout != count_copy)3 ~( B+ v- N! J' U5 ]+ p
{4 p7 o: p. b9 A' [* V% W
printf("a is %d\n", buf.a);2 `& g+ L# G( a7 U, V4 g* {
printf("b is %d\n", buf.b);
. P4 G0 Q+ W& r6 I; C printf("count is %d\n", buf.packet_cout);: s/ O1 e. ~+ Y7 L( J
count_copy = buf.packet_cout;
( t& l7 j2 O a4 D" D" @( V }
1 n( K! S; T/ \ else
+ O) P. C. q( g" L! E0 ` {0 x& L- [4 y1 R' N: A- |# N- ^
printf("No effective message!");
( \) q! m- x8 s; ^! v! @- w) z }
& N `% l6 H _# `; _6 m}4 v# Z$ H; p8 r' {. u
3 k' m h( r, ~ A, k: [
O6 o/ T9 k8 c9 Y) i$ }9 G3 }8 f但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ M- M# a" M5 S5 @7 k& F6 P% `
使用下面代码,对内存使用了mmap函数后:) z) p; ` Y! v F! Y
#include <stdio.h>
$ P( D! k* h7 x9 A#include <unistd.h>
( z1 f& m7 ?' M1 U, \* J7 Y#include <sys/mman.h>5 o& }* \- O6 O& n! z+ T
#include <sys/types.h>
& f5 C$ `2 o& `/ D#include <fcntl.h>
, x2 D3 h' M$ Z3 ^( U
. b$ R `+ i$ u" W#define SHAER_RAM_BASE_ADDR (0x80000000)
/ \& X; d m# L2 z$ V#define SHAER_RAM_SIZE (0x20000)
1 O( l/ b5 Y( I" ?3 ]8 B- H8 k j5 z2 \
typedef struct
3 q. W" k$ M0 p x7 @: K& [{( m5 M; I( x! n2 p$ x1 H
unsigned int a;5 D4 W# T" E- d2 E( u
unsigned int b;" W9 ?5 i0 g1 h' y
unsigned int packet_cout;% {% O9 G+ a+ ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ v6 |0 i- w: g& X; Q0 m, S' Q
$ s3 _: ?; ~" u' j) Gvoid read_MSG_buffer(int *baseaddr);
. i- x; V( w9 G( p+ Gunsigned int count_copy = 0;
2 a. \1 F2 ^* p& a) f0 h m2 H& M# L* ^- j6 U* B
int main()
6 j7 }! Z C5 b# G# [{( V% J0 B% B; H7 A7 F
int fd;
& u1 j* ?3 x- d+ K int *mem = NULL;
+ U3 P, ^ W7 E5 l! H9 n Y+ W( f+ v
" ~& u" P# M2 h* |9 u if((fd = open("/dev/mem", O_RDWR)) <0)* F/ O7 Q( z6 I$ U+ W) v: B9 u
{
& O# }1 ]/ x% \, ~ perror("open error");
1 d# M8 ]. S3 h1 v' E) b return -1;6 c7 Q7 D, p J' k' P
}
& Q/ X1 B: n/ X " `, C) M- e8 l2 M1 G. b
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( R; d P W$ h2 p
) C6 v3 @ r5 J while(1)* G- i) Q" @) }& e2 E( k
{0 t @& A) D( @9 ~2 ?; k1 L
read_MSG_buffer(mem);
# a5 K! U. C5 x7 Q4 p: _0 ~# ` }
0 J; H1 { X% a7 w5 g1 i}" I+ s; }' J& L* ^5 y1 ~% H
' Q" E* }2 S6 r2 _$ z3 g: h; t$ Lvoid read_MSG_buffer(int *baseaddr)8 Z+ X$ \- U' w* B, g( n: Z7 ~ a
{# k- V" C( P/ a6 ~$ g7 ?% ^2 E
pRX_MSG_PROTOCOL pshreRAM = NULL;
! U+ Y, l. e q: y/ Q* ^6 d
3 i5 F' x9 ^. m& a! s( \# \6 V) ? pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 b0 |. w$ h# o# C
" r% z6 {0 Z0 ~+ D9 b% O* C
if(pshreRAM->packet_cout != count_copy)
6 X, Y# }# z- @, n' v, e' [ {
0 C3 `1 ]# B ~" |% j3 P printf("a is %d\n", pshreRAM->a);
# `. h3 K9 d5 y+ {6 V. ^% ^+ o printf("b is %d\n", pshreRAM->b);
4 v* i* s0 ^9 } printf("count is %d\n", pshreRAM->packet_cout);
0 y# z, a I/ G* u) H" _+ n& E. s1 q' z count_copy = pshreRAM->packet_cout;
( O6 o: y0 v9 c1 S+ ^$ ]/ L; N0 n }% s4 R: h _1 v, V( K: X
else
% D/ S, | B! I# n& N! m {! P2 f! \# N1 x _
printf("No effective message!\n");
1 L# g4 \" I3 [/ @# k1 g }0 L# O+ k, p; U* |* W# r
}# ?& n4 Y% ]; J! C. F Y* t
% _- ?% M- l2 S4 ?# |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, h; K6 r( A4 e1 n
: ` B* Y5 W9 i! T" H8 q. ]
$ w$ L; }, d' r8 i- s! W$ W) j5 s9 H# \: W9 ~1 V( G
4 S3 _/ h. P' m% f
|
|