嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 S; n" o8 G g* P) Z
3 A1 c! l. s' A: o' L% T7 ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. X' C1 u! F) k
#include <unistd.h>
1 s* W2 W! Z: x* F
#include <sys/mman.h>
0 V% t2 O. D" t4 t+ R$ B' u
#include <sys/types.h>
. _# h2 x8 d, a2 F
#include <fcntl.h>
7 A% E& A. V4 X+ ]
$ B2 t/ m9 E) i) K' s
#define SHAER_RAM_BASE_ADDR (0x80000000)
: f6 ?, S" ]8 ]$ h& p
( t0 O9 v8 Z( C4 G2 ~
typedef struct
0 ~4 d$ z3 t( Q4 D# ? c
{
! \; O" l! W3 M3 n4 r( }
unsigned int a;
1 L7 y3 v* z3 p; Q' ~/ X* \% F& x9 A G
unsigned int b;
X- R$ Y: W& r
unsigned int packet_cout;
! D6 o4 u# _. J7 C5 T% a% m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' U7 P u7 K/ C2 A( p3 o
) g% E: f3 h' G: y' C" ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
}+ T0 K" |* ^0 G) V
unsigned int count_copy = 0;
! f# X! q" I% S
+ @3 C: m2 _/ u9 S
8 _! l d( K8 ?& {% u
int main()
$ M( H9 H6 L% }5 Q6 L) Z
{
; ^- |. F( ^% n$ b3 ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
) S4 m) b7 i6 U
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# X# k0 n4 H% P$ V/ E0 l& j9 y
P/ V, P# Y8 ^0 s+ w
while(1)
9 v0 z' @; ~7 _- U; W
{
( J# q0 S( z6 ]' u: F; O; ~
read_MSG_buffer(pshreRAM);
. M3 ?3 N9 @0 @: g
}
1 M+ G' }* Q. X% k
}
# f; K" A0 ^: R- x' a& j
$ f- o- C! y R( Y) m. ]' I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 r. v- m( ~3 }0 M. p( \3 s6 ~$ {
{
: h u: R1 N4 k/ d# C; u; L
RX_MSG_PROTOCOL buf;
5 R+ d" ]# t: G8 T# ?4 x: ^- Y
, N5 B4 ]8 e$ x6 J
buf.a = pshreRAM->a;
" z/ H& B0 s: U/ ~3 `
buf.b = pshreRAM->b;
3 V9 q+ L0 y& G7 }
buf.packet_cout = pshreRAM->packet_cout;
/ k P d. k3 S7 n" z
3 m ^9 Y2 S4 n2 g; G- D7 s
if(buf.packet_cout != count_copy)
$ M- _, z: l0 u9 z$ o
{
; K& M2 I- w8 [4 x
printf("a is %d\n", buf.a);
Y- I+ M2 `+ g: i
printf("b is %d\n", buf.b);
# ]0 b' f) {8 w4 u
printf("count is %d\n", buf.packet_cout);
2 N1 i3 A+ M+ k: u1 p
count_copy = buf.packet_cout;
, F( z" U# u% C/ u# T/ O
}
+ Q2 F, C% ~9 ]# `/ K
else
8 [+ P$ T% H1 [% [! j/ c) f
{
/ r2 w8 L# \4 T/ [% @
printf("No effective message!");
* N, s2 `/ [# i! d( Y
}
9 w1 B% V% S1 P t( m7 M: _9 `0 k) l
}
6 L* u! o8 _' \8 t" z0 ~
- {7 i7 Q1 J, x5 k/ S
" `2 }) Z9 ~$ m5 i }. k9 o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 N# D! E0 }' f6 z
使用下面代码,对内存使用了mmap函数后:
2 f7 K+ `9 F" A S
#include <stdio.h>
t2 {% n5 p$ M' s m1 _% k! \
#include <unistd.h>
! }7 m6 ] X8 X) L9 w
#include <sys/mman.h>
?& n8 o6 v/ v/ X+ J8 Z
#include <sys/types.h>
U4 k3 \$ M9 e8 u" R' A0 S
#include <fcntl.h>
4 K* Z! u: k* m0 y! j
. V, ^% Z: k3 [0 D8 H a: z
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ | `" A" ~9 F1 U/ z5 M
#define SHAER_RAM_SIZE (0x20000)
& e1 O$ a9 D2 q
( Q) J9 B2 b X" e3 k
typedef struct
. `, Q) J- N& E# l
{
2 w5 _9 L5 ? f4 e+ P+ q; N
unsigned int a;
% e# `# n# }% {- }8 y$ K+ |1 r& W
unsigned int b;
: d/ x$ C& o! o s. D |
unsigned int packet_cout;
$ t$ e1 I0 L0 t! P. K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* q% O$ l; S# D1 Y- B1 J4 S: p
2 R, H, A# u5 I X
void read_MSG_buffer(int *baseaddr);
8 U U" `1 x% G8 J) ~
unsigned int count_copy = 0;
: L1 ]) X1 B7 ?; P* e2 H( I) b4 ^" N
: v. f, s! W. l: x5 z
int main()
0 C' L7 J9 R' ^9 B' b2 I: S% f4 [+ A, |
{
2 H- ]" Y9 H; y! O* d8 |
int fd;
' b: d/ q0 Z( u- r8 A# ?
int *mem = NULL;
& J& t4 ?" m0 ^6 ]) J) c1 O2 }; ]
' N1 u- O0 j; T; P
if((fd = open("/dev/mem", O_RDWR)) <0)
0 S% o4 q" J8 @& \9 Z/ K; ?
{
& L0 `9 O& g C
perror("open error");
: G- m9 U1 B8 e) v( ]
return -1;
# b4 D4 E. C/ Y, \* N# G; k
}
" H/ X9 i, x$ U
' f& [2 f/ e- \8 Q: q! ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' o, c W/ h# b
2 I6 k0 ]6 c2 u# d8 m$ p
while(1)
+ }7 O- z) _% o3 U
{
5 I7 K# }9 \; x9 l# q
read_MSG_buffer(mem);
6 c: A/ {1 G" C( h" ^
}
* J, |% Q& v% \1 A( @+ `: |
}
I/ A6 }0 E4 j# _' t4 t9 _
* ?) d7 j0 I" h
void read_MSG_buffer(int *baseaddr)
, _4 l- z* A( r8 E; z' [# W
{
% H2 m% l0 J1 f6 V9 X8 G
pRX_MSG_PROTOCOL pshreRAM = NULL;
# G$ q4 v4 w) {
9 q' L" {% N; N! v1 _& }
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ ^" _( \" u8 [. U% X
1 j; P% ]& r, @' R6 p' a( W
if(pshreRAM->packet_cout != count_copy)
8 H( f J8 H+ d0 u
{
7 k( T8 r6 _3 P' i
printf("a is %d\n", pshreRAM->a);
3 c: f2 r) n2 ~
printf("b is %d\n", pshreRAM->b);
. M" J; n# e8 d }9 o4 F" M6 |! I( B9 M
printf("count is %d\n", pshreRAM->packet_cout);
0 b9 B1 s3 }% L) p( f
count_copy = pshreRAM->packet_cout;
( X9 M& L* |) d6 t) S1 ^4 e
}
0 k" j8 P" m4 ^) z
else
: h! e/ Y3 r J; k
{
3 G6 T m' q$ `" i; }5 X* F, Y
printf("No effective message!\n");
4 P) _9 l4 d7 R* U, |
}
/ [( Q7 }9 p, O0 b P9 m: j
}
" n5 f+ S% l0 l
$ V" N; b: G- n/ d" I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& n- l5 r ^5 Q$ U" O; y9 X
7 f, j1 B0 E0 S/ D; P
7 k2 c$ n+ z( G8 W1 X' P
$ l' o+ t% v* |' s6 S4 C4 N, d
( J. ]# b/ u* D9 ^: i
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4