嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 e# ^ h3 m5 Q' ^0 Z
- H& I3 ]" S# v( I2 w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 e8 K6 i# P2 U! K
#include <unistd.h>
2 a$ S( e. `0 o% j1 I$ {2 ^
#include <sys/mman.h>
: e9 @ r6 j3 ]/ y; k
#include <sys/types.h>
8 n M" `1 q9 \% e# @: w
#include <fcntl.h>
9 R; O& e) z! }5 c& Q c a
+ V% G5 W# ~' |7 y% ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 j$ A6 I/ C' h: ]) s$ j: f
Y+ u0 K2 L* W& c
typedef struct
! r8 ~9 M$ P) r& z# r% P
{
$ Z* `' G' i' M1 ^
unsigned int a;
9 i( s' b' i- O
unsigned int b;
4 X0 O r9 @9 K6 d/ m' X; O) |/ K
unsigned int packet_cout;
8 X8 w5 f) |. j; B" T8 Q5 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 M! N, J' e* _) y
8 W: }' m# U/ ?' w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' M7 E" W3 N7 L; ]$ k5 q. X
unsigned int count_copy = 0;
& [6 T" w4 K. ~" ^6 B/ H* _
* a5 J! G8 R7 `$ R9 B/ _0 _
# L6 x, D5 ~- o+ g: z$ `
int main()
7 g7 ?; E' F9 R9 I% [
{
# k5 @4 e/ K$ d4 \6 e* x. k
pRX_MSG_PROTOCOL pshreRAM = NULL;
M- p, e3 f& w% f% ~: i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# N. ~. h% }$ Q V' e
! w" o" F3 R! c' ]5 g
while(1)
c' n1 {, }6 V$ d2 Y" f
{
, Z& Q8 T6 ~ L, H8 N5 \; ]& T
read_MSG_buffer(pshreRAM);
0 y0 `1 Z8 M7 u
}
2 [* m) u {) O
}
- Q5 i! Y1 G E) |: \
z( G4 c* H. B2 C: ]" E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# ?1 f! O6 ^0 l7 L" W
{
1 i' [: I# n3 D
RX_MSG_PROTOCOL buf;
: Y- K d6 r( w. `
2 B# k: [5 S- w1 }% F
buf.a = pshreRAM->a;
" f% ]& y" G I5 g" a' ^" W) V2 d
buf.b = pshreRAM->b;
* o1 D% g; U# p
buf.packet_cout = pshreRAM->packet_cout;
, Z& l8 q0 D6 ]/ O' R
1 u P, f- i0 w6 Z
if(buf.packet_cout != count_copy)
6 X7 p1 Q4 G# d$ `( n
{
* W! b' Q/ ]6 J/ V
printf("a is %d\n", buf.a);
& v7 j0 H! W0 T/ |+ v- K1 \
printf("b is %d\n", buf.b);
$ U+ t* ^ Z1 F' p2 ^
printf("count is %d\n", buf.packet_cout);
4 n- ]4 C% ^2 P/ R) L* e; p8 T# ]
count_copy = buf.packet_cout;
+ N" w/ s3 D. W
}
5 B- c9 G" A& W1 W+ |
else
* j$ ?) D5 z( u: ~
{
' o5 \" @3 \7 V! y' w$ [- \1 ]
printf("No effective message!");
& `+ \9 [ o6 _
}
; j# J/ e3 G3 _1 g1 @# Y
}
" A5 s, @0 @6 x5 H7 {; _
" h" q6 r2 ]. y: I$ e9 _
7 {9 P5 v0 F4 x. y0 T; P: m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) a- K' k. X D% L$ B4 H2 l
使用下面代码,对内存使用了mmap函数后:
% h! C9 o3 y- {* Y0 s8 C4 d
#include <stdio.h>
# o. p! _, K4 f; F2 _! v' A
#include <unistd.h>
& z& h3 p# O- E6 G# J2 G) [
#include <sys/mman.h>
: K2 O5 i8 A. ~* v7 z$ h
#include <sys/types.h>
+ w* P8 f0 W' c' l1 |4 g
#include <fcntl.h>
' ~# r" C' \6 v! n4 E0 Q5 J
3 p% F0 u( K! @/ n: }$ o r& v
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 ]% q$ C2 } P0 G
#define SHAER_RAM_SIZE (0x20000)
; b! K# F# Y+ B. m
2 O, [4 I* c; b. w
typedef struct
( z( ]. ]5 A+ A: I$ M: P
{
: [/ m$ c4 x$ W2 V' P' e; u* M
unsigned int a;
7 Y3 d! R; _4 E
unsigned int b;
4 W& R7 r, ]1 A9 m4 {1 N; R, `
unsigned int packet_cout;
* F: _/ M, A2 b: F; {& d) g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( B) Z2 r P; h* i s4 s9 I
. K9 Y5 X% j5 }/ |3 P( O8 S
void read_MSG_buffer(int *baseaddr);
h5 }- v8 ?: z; F0 A
unsigned int count_copy = 0;
7 A' j$ _$ F( j" b4 Z% }, ~7 a' C8 e
+ `) z3 f# b- Z0 J5 g
int main()
1 I% \2 g3 I. z% {, H
{
+ J$ W2 k. E3 o+ y
int fd;
! [- n( B& y8 i! z7 U1 q R2 M/ S. }
int *mem = NULL;
4 [5 B3 v" H4 E& ^3 f7 F8 ]+ B
4 p9 a4 [ ^9 ~; i ^/ B r9 h+ P) a. C
if((fd = open("/dev/mem", O_RDWR)) <0)
- e% P4 ^, @4 N. X7 W7 d3 d
{
5 [ u* ~+ h+ h
perror("open error");
. J/ f7 P% X2 T+ B; F, s
return -1;
# j( I; x$ _+ B' k. ?# |. r H6 D
}
) v) `3 T2 `- G, [8 X% s) V
! h9 q$ a( O; c2 W2 b. A" D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* F8 S$ W) X+ I! Q- {5 |
2 t4 F7 B3 z( L# T* @9 x
while(1)
9 e) p/ n" @, U6 v7 T; `9 Y
{
$ u7 \; k/ P) e+ S* n1 f
read_MSG_buffer(mem);
6 X. _* N: G$ n) m( `# v
}
1 X) B" G7 P @% Q. |5 {/ Q+ [
}
- o5 ^% ^& w. ]/ t7 q. z5 M# s
r$ b5 x$ N6 k( X6 P$ }8 \
void read_MSG_buffer(int *baseaddr)
, V2 W- }/ s- T& v4 p- }* k% p
{
% M0 M: U, F: C1 i8 ?8 v
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ C! |& x* r- J% R( x, }$ G
% |% G0 \4 L$ _% a+ M: s' w
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) H3 h: j0 m+ n- K9 \
+ Y5 k; u# ^' |" v
if(pshreRAM->packet_cout != count_copy)
' G! A2 E7 C) ^3 b, K+ O0 P
{
7 z7 c. x8 f- {9 h
printf("a is %d\n", pshreRAM->a);
; M# a# \7 _5 {! j$ Z0 x/ y* p
printf("b is %d\n", pshreRAM->b);
8 d7 U- ^2 J2 I
printf("count is %d\n", pshreRAM->packet_cout);
E; Z4 L9 |5 l" o. Z3 Z; _
count_copy = pshreRAM->packet_cout;
x5 a* [/ O" r( W
}
+ A: b5 C; C+ f4 @. g
else
. d' b0 \' H/ T, h' f/ q
{
2 ~) ?0 o2 E( j6 Q8 s
printf("No effective message!\n");
- |. z. t0 W* A% ^) |( p; r
}
7 R) Y6 i6 b' K# [; j | E
}
1 ]% Z% V8 s3 P' c1 t
9 S3 c: Q3 | i# M3 V& I/ N! F# ~; n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 y$ j9 N# o, @ ~3 W7 D
, a2 W$ R, _$ r
7 Z3 ?. \" o: G5 g3 d0 \
8 v/ Y% f% `0 t' l
) y% P' y: D3 i( ~0 f$ O, e' I2 Z
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4