|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* J0 S* v4 ~$ z6 j; E1 h2 l; S1 N2 V; L" s8 E- C7 B$ e; V
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% T m8 c" \0 O7 c! M9 B% c
#include <unistd.h>! Z) ^. V* A: K2 f% `
#include <sys/mman.h>
- \+ r- O( e. H( ^& k#include <sys/types.h># {/ j4 w7 F/ N2 U! W: H# B
#include <fcntl.h>3 i o, R) W, H }: S/ T
" c8 O5 d! A! Y, k- [* s# N7 p$ G9 z
#define SHAER_RAM_BASE_ADDR (0x80000000) * |# W0 @# N T+ P- n/ j3 c6 m
y0 v' q$ J2 ^2 Btypedef struct* ^$ a7 [( g& f" ?+ b8 ]1 z
{, M) u9 K" D6 Q: A! L
unsigned int a;/ q* @5 s( E+ z
unsigned int b;: ^1 r5 i4 R. a$ m
unsigned int packet_cout;
0 T( }" R3 j( C- z0 A5 x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. @2 g; ?" D% h3 v' T3 q0 @, E
* d }; e/ q9 t4 D* K+ ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); O1 m5 a( o! o
unsigned int count_copy = 0;
7 L. q4 e) \. K- f$ x6 ?- m& U+ \4 w3 l, H; Y
. c5 g- K* Y1 Hint main()
0 F9 H0 u" i) b, k{
( ^) c) U' Z. g; t$ m5 f pRX_MSG_PROTOCOL pshreRAM = NULL;* {( v9 P8 C; ^! l6 T% m! I: |8 D, b
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 K& A$ U x- A' [
2 b6 j; Q, v2 A8 g/ q+ S while(1)
" w/ q/ F4 G, k6 r* J6 u {% I* ]5 G* E4 s6 h' p6 F# m# o
read_MSG_buffer(pshreRAM);0 v% Z @1 z8 k5 w$ G4 M. o
} 0 Y8 d) e6 \+ M1 C
}
2 T A3 C- y" P$ M7 x
) M I( y# q4 T" w$ Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) |' G' u+ D* F: n! S4 u" ~8 g Y8 a
{& I" C/ G5 p6 p( I0 n9 H7 M2 h
RX_MSG_PROTOCOL buf;4 b4 S$ T# A; k. x( F
' F X! a4 d% k; i6 E: { buf.a = pshreRAM->a;
" Z3 G6 M# ?. h buf.b = pshreRAM->b;
# x5 i! a4 V! [9 S7 m$ [6 o7 D buf.packet_cout = pshreRAM->packet_cout;' p; ]4 o8 S- z
8 G7 t: X2 Q6 S! ]& n* `, z/ c if(buf.packet_cout != count_copy)
2 o$ @4 ^& J, e3 I4 t8 h {
/ W4 R0 N* x( b, V" `7 @& ^9 X* U printf("a is %d\n", buf.a);9 x, J5 I# R2 B7 S6 r
printf("b is %d\n", buf.b); C2 D- x; w0 h6 l# I; C
printf("count is %d\n", buf.packet_cout);
4 |! _' c! S; r count_copy = buf.packet_cout;
( ?5 ^; K# x1 W( V }6 l" V" y2 `6 z: Z% c/ E" c
else: v, s A- T1 A5 ^" d( \! h
{
5 q! H- s7 g& @! J1 i1 i printf("No effective message!");
& h3 _! u3 Z. _0 Q) E; | }
7 F& G) F5 C9 w7 p; D}; y+ _. y4 n" F* M( j" x9 |* ~6 R( V
( d. Q! q1 X' H5 m/ r# k k1 k0 d$ A! N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 m4 U- o2 D) Q" F) u) P3 u
使用下面代码,对内存使用了mmap函数后:, w- U ?# [( H. l8 Q1 t- U& |: u
#include <stdio.h>& b1 X1 N# c- X2 r3 O( L
#include <unistd.h>1 q: X7 W, B- P) S! y! A. }
#include <sys/mman.h>+ z. |, {+ t# C5 Y$ N; i& T% w
#include <sys/types.h>
5 u' X4 i! Q: m! m#include <fcntl.h>
6 o2 D( _4 p5 _: W- u Q7 g# A5 A( c5 a! M$ I
#define SHAER_RAM_BASE_ADDR (0x80000000)
: w7 K. Y7 h7 b' s- ]* l9 i#define SHAER_RAM_SIZE (0x20000)
* l$ u' n6 N1 O0 y
5 D' ~9 @. g; a3 n. U6 k1 M6 ]" Ztypedef struct4 C! x) Q# X& ?. h/ a2 w; v
{
' X9 D2 B) b, i* l7 a unsigned int a;! S; K+ G( `$ w7 m
unsigned int b;4 p; C) h" ~) a# x
unsigned int packet_cout;3 ^8 b2 G$ z! X1 z* b( i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, Y/ C. }+ q( k& |2 r( ?
6 O& ^5 I4 B6 J2 N3 }void read_MSG_buffer(int *baseaddr);
9 J+ d C o, A# ^6 P, b8 xunsigned int count_copy = 0;6 k3 K; J8 x$ `: R- M
2 c: d; L5 S1 v: C+ @int main(); c/ K5 h8 g+ }" D1 p5 M% s
{! t3 A( R1 L6 d8 X
int fd;) Z' ~% I5 h, U- l
int *mem = NULL;
" G( a: o8 _2 v+ K6 C8 h* T- x) y' O: J: d2 f) h
if((fd = open("/dev/mem", O_RDWR)) <0)- v1 J# P" U4 ~/ c. K% A: Q0 C, T3 O
{
3 |% G9 p% i# b* v perror("open error");
! K, l9 A! H# n7 T# c3 b return -1;
4 E& C( m5 `4 d, w& v& l$ Y+ a, B2 ` }- U: S4 [4 O9 F* O) X
' ^% T) N: j5 D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: ^1 R; B, ^- `' r# p7 x; F/ c) ?6 q' [
while(1)
9 \1 t9 w- H$ z9 }0 S1 C# T- \5 u {) F0 L& S2 u* l! F5 S: M l$ w1 l) @
read_MSG_buffer(mem);6 ~* X/ s. k* E$ `4 v# B
} $ @) j; N6 B1 o, n
}
2 X4 s1 l/ H) T) Y; S* r6 Z
5 O1 ]$ W3 W" U. b& U: B' ^7 q/ _) rvoid read_MSG_buffer(int *baseaddr)3 a. R5 k/ W4 H4 g" @8 j' V
{6 I* Q9 t/ V* Q. u5 b/ \1 a
pRX_MSG_PROTOCOL pshreRAM = NULL;, n8 F3 E* D. w% [" R7 e7 |7 M! M8 F
- Y$ _ U2 @2 K' q+ u pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 S9 c9 i0 H* X& Z$ G0 P
6 S, V1 \5 Y+ |4 }9 h( U
if(pshreRAM->packet_cout != count_copy)8 b( C, k. W! }4 D, b' @8 R" G
{
9 v$ s0 g! \1 U# ?9 j0 b' _ printf("a is %d\n", pshreRAM->a);5 H. g# H: N7 r1 f' s' r9 S% a2 I
printf("b is %d\n", pshreRAM->b);
% r _' R; \8 O printf("count is %d\n", pshreRAM->packet_cout);
' ~9 ]% T7 L" w' c% K# m" x) D count_copy = pshreRAM->packet_cout;
% ^5 W- P. h: j }1 E7 k2 y' r3 s) Z
else
) p; S8 l+ [9 p+ K; F! _ {
6 W$ E, z% U* e, h printf("No effective message!\n");/ y- n, ^: U' i. U
}4 w0 j4 H, O: q! x
}, h7 L: Q' }9 g. j$ u1 r4 p* Z% x
! O2 t U. s+ a6 N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% M/ L8 O7 u7 l# x" z" @) F6 d5 k6 h( y1 M% {! i1 p2 E/ ]
& T6 w9 U) q8 A+ E+ w/ m( r+ { f3 r
$ ~* M* ]9 \ E: V+ h8 d |
|