嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 Z! N2 j# ~5 B7 I1 T, W1 m; S
9 P9 g1 Y. S+ M3 J5 H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ Z& v# v: |$ l9 u2 W) f& V6 K S
#include <unistd.h>
g* T/ S' X: t* Z. ~" ^
#include <sys/mman.h>
M# v( E( O) I* f6 \3 t. {0 x
#include <sys/types.h>
B Q; `7 E) i& p9 u3 K
#include <fcntl.h>
3 w- ]2 G) I. j. t7 u4 V
% P2 Z. d) q: g8 K5 r
#define SHAER_RAM_BASE_ADDR (0x80000000)
% Y* p2 w/ S b) U, E+ D
9 Q+ M4 A V% [& X" P# c
typedef struct
% G/ L1 H6 b2 I, J7 J8 O: h& n! l
{
3 f3 j% {6 K% \& D
unsigned int a;
6 ?0 z* j- O! n- I
unsigned int b;
/ [& F. N5 B/ s! Y
unsigned int packet_cout;
$ X! g7 s& e% c+ x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 l: Z% X- V. l" I
3 g) |- z; V8 f/ x* Y& }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 p5 `) p# h7 D4 I3 X* r0 y
unsigned int count_copy = 0;
% c5 a$ X9 ^$ _; [+ i
c4 r' d' Q4 v% F. @# Y( e
# A+ a; Z) z. y4 q* f1 e: F/ v
int main()
$ \; R0 F$ o4 V9 v
{
: p% |8 P) [% P& L1 v8 B
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ D0 ?5 z/ {5 j7 x: m1 ?# X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 j; }$ O" \, q9 G! r4 ^6 Z8 \
% B' B8 A: G. @! f. B& l
while(1)
p, t. Y' o) [8 Z# u( w+ j
{
6 {* f% z2 Z! n" I+ e4 Z" c
read_MSG_buffer(pshreRAM);
) O2 _ m7 i; n& y1 P* d
}
7 b1 f K" Z) H9 V3 u
}
: ^ x9 m" v9 q2 w; s
9 i, p+ Q8 i" i7 E ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 M6 C5 [1 \8 n/ f* j& q
{
% A* W/ r3 D' a, ?3 N
RX_MSG_PROTOCOL buf;
( P( ]3 K) B2 L- Z6 f0 `1 m; o# X& c4 e
* Z# [2 D6 [$ C2 [
buf.a = pshreRAM->a;
+ s( w0 p' `# q3 k. d& n
buf.b = pshreRAM->b;
; E! S2 |3 R! N1 _
buf.packet_cout = pshreRAM->packet_cout;
% S0 P% `) k; A9 N- J
6 k8 c" x7 u3 d% i* M$ i7 G
if(buf.packet_cout != count_copy)
3 A* q9 y( w; z. V8 ]
{
: z/ X1 S# ?, y. A+ e
printf("a is %d\n", buf.a);
3 _ M2 R. q1 T; r
printf("b is %d\n", buf.b);
- |8 `8 q2 i1 |1 u) V
printf("count is %d\n", buf.packet_cout);
6 M; u ~ B6 Z7 s# _1 Q8 q! I
count_copy = buf.packet_cout;
$ l, J& f' \1 {- t
}
* H0 e+ M+ @& F7 }' A
else
# i: w% i. a/ j& u5 ^& o! s! A
{
4 H4 e$ h; J! o9 P
printf("No effective message!");
6 U6 B) f2 s+ R8 `5 x6 d$ v
}
2 e+ t9 w. n/ M; [! K
}
$ x7 ~/ j( t* e6 k7 g7 f
5 g2 l1 [; \2 |( K& t
6 U4 \$ B4 R4 q( r+ m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! l" x% Y+ @" n" r3 g; C* f
使用下面代码,对内存使用了mmap函数后:
( ?$ T3 t) m1 ]
#include <stdio.h>
4 w l0 C4 i0 w1 k/ w
#include <unistd.h>
! g8 U8 U; J5 l9 S2 L
#include <sys/mman.h>
" l5 C/ s6 o* @" E! p9 U6 P
#include <sys/types.h>
! G& V$ }8 k' y+ M
#include <fcntl.h>
?; z0 n, B: k7 \' n( D
. D9 m8 ^( k1 U) _" {; I. G+ v
#define SHAER_RAM_BASE_ADDR (0x80000000)
# \: T( Y" ^: ?& j$ R+ [- f, |
#define SHAER_RAM_SIZE (0x20000)
, p! `3 \" y% I! I, q; m
8 _: W7 X! d2 H2 ~0 S7 A" Y1 U" k
typedef struct
2 | d0 ]& G6 [2 f
{
2 H) ^2 {- M6 v9 b# n; o
unsigned int a;
7 R6 t+ f1 ?) `$ p' ^
unsigned int b;
* ~! N# C0 d/ v4 U% E: e
unsigned int packet_cout;
I( S" U9 X# a x, P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
I+ e7 Q, F# W8 I3 }0 E
3 k% r( s" P; O- u
void read_MSG_buffer(int *baseaddr);
- |; u& {: r& z* i8 G
unsigned int count_copy = 0;
5 r; s" `+ k$ R9 M+ i
4 O6 W3 } r/ A O0 W
int main()
/ d- ~$ E% V1 Z/ @1 p
{
( W! v( y5 M# s' R. k
int fd;
5 y0 J+ J- T# q6 C
int *mem = NULL;
9 C# B6 H5 l( K: m2 M* r! ?
; x K+ ]4 y1 B, n
if((fd = open("/dev/mem", O_RDWR)) <0)
+ Q( O9 I$ y1 S! @: a
{
7 C7 e( |: ~, T) V' @
perror("open error");
# q8 ~; S/ z6 E6 T6 b- ^6 d& e0 d1 ]
return -1;
6 b" `" k# q8 Z* L8 V' F
}
0 O* m$ A. ?( u' m0 ~' o
+ i8 n" u& h1 R, ]3 t7 W( w( C) s
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ d/ y" S+ M* k
3 `9 w3 j% t/ W( G0 n8 P3 P5 [: t$ U% u
while(1)
6 t6 K& ]& Z; m h% r; v
{
$ D( _/ Q3 [ p: O& U
read_MSG_buffer(mem);
! Z/ O- Z' O* x! w
}
9 I' r, P) _# b2 c9 N2 G% c
}
- x/ |# x4 ?$ g7 k
; w- d) J f0 l% ~1 k4 [
void read_MSG_buffer(int *baseaddr)
( S( X$ H1 J* q# _$ p$ p
{
; R# p+ g) D/ g2 l2 H
pRX_MSG_PROTOCOL pshreRAM = NULL;
! Z" D/ w5 e6 w+ W k. t
# P I5 G( {& \' P
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# n# Q4 [: s) V( e1 T
_: F: ?+ S( U- f6 n
if(pshreRAM->packet_cout != count_copy)
" F5 N+ E% g8 z R5 I
{
2 x4 q+ U: a& U: N5 r" B3 n) d
printf("a is %d\n", pshreRAM->a);
+ `3 {4 Y) k. |& [5 Q7 _
printf("b is %d\n", pshreRAM->b);
0 S; [: ?" r2 ~, W6 N/ c) P. p
printf("count is %d\n", pshreRAM->packet_cout);
6 S8 z9 I/ x# l4 W' Q f
count_copy = pshreRAM->packet_cout;
/ j# C8 l+ n% b9 `
}
9 Z+ A# R. J8 V& v) k
else
g( r G& x) y3 ]9 f( ~& e" c+ @
{
( r+ @& t( M: i
printf("No effective message!\n");
! H; |) k# v2 ~. h% I+ \' I+ g
}
' e. L9 w) p/ ~& d5 |1 ~2 q0 ^) ~
}
( @8 I8 u+ T3 s/ O
% L' X; F1 J4 [/ X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 Y, D3 U& C( R
( a# @4 e5 i! L3 U9 b$ e% o
d& c8 d- I: _- l: O
+ L# r( ~* n7 d9 L
8 n( S2 o6 K" w# Z, T0 }( u
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4