嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 _2 s; z4 n& K% R( t0 h: P! a
5 l* k5 S- c0 X! }+ n5 A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ b( V1 e4 [+ W+ q A! O1 ^( M+ o
#include <unistd.h>
1 V5 j: |* j" [6 Y
#include <sys/mman.h>
7 d; f. }; [4 k6 J; T* |* \ @
#include <sys/types.h>
C5 P/ B7 a+ w* a- X. k
#include <fcntl.h>
% o3 H7 R& n: s8 N4 D" f( c
- Y! p8 z1 W( A5 q
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 d g w$ D1 U! ]) C2 X( N
& t" U; o, R; k5 T. H3 t7 B3 v' P
typedef struct
& J8 G% S; X& I, z* S% @3 n
{
9 W3 n2 x9 u6 T( ~$ T) Q9 f
unsigned int a;
8 t+ j* X( t$ O
unsigned int b;
& R+ Y3 {5 O7 C& C. R3 ^% t
unsigned int packet_cout;
1 `4 i6 a( b8 B/ l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# q" o+ N7 L" i% M* Q. U" p
u3 t: q+ ]; n3 _( z u8 ^! W6 T4 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 {6 m; I8 m! x' a9 a; L
unsigned int count_copy = 0;
/ z# B) H$ D" _% f. g3 K
7 M$ u# V- Z, k5 y2 y
8 k$ r/ ?0 C/ @" d, U: G" S
int main()
: G5 o) V& `# V9 V" G2 `
{
% Z# ?1 G7 a. Q8 i0 M' N2 ^9 ?9 q
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 m3 ]; I# p1 v4 y5 d3 y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
N3 l' k. p5 v
% s! v9 s6 i" g7 a4 C
while(1)
" _+ t2 U V% L+ u2 @ {( x
{
" L& G. {0 L3 o0 l& ` k4 P2 N
read_MSG_buffer(pshreRAM);
& u J3 `1 ]0 I- n+ i) s' |
}
+ s5 V+ B* D" o1 ~( ]
}
, z: M9 `7 A1 v: O
- p, J/ k7 d* C( a- V3 s, E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 [7 L) t/ ~ F% i; O7 ?% S M. E, y
{
6 j5 T; X$ B" Z [7 P2 r* Y$ u' A5 i' ^6 n
RX_MSG_PROTOCOL buf;
# K! K) e, l1 W6 Q: W/ |
3 C, `* u0 N/ Z( P ~1 e% l
buf.a = pshreRAM->a;
3 e# U) O1 n4 B. Y5 \/ M
buf.b = pshreRAM->b;
+ i6 R( E3 J: K$ c9 U' K2 ?4 a
buf.packet_cout = pshreRAM->packet_cout;
) L: I& q7 K- l0 Z" \4 D
+ a. l7 c5 I' Q! R; L
if(buf.packet_cout != count_copy)
, x' L/ _+ }& F
{
! i) f4 n8 [% n3 K
printf("a is %d\n", buf.a);
) J7 Q: Z k/ u Z, b8 A# G2 X$ S- @
printf("b is %d\n", buf.b);
- \+ I$ F2 m, Q- J1 h* }; s
printf("count is %d\n", buf.packet_cout);
1 Q3 n; \2 o: N
count_copy = buf.packet_cout;
1 _/ |8 D8 L& v
}
, A# l" h7 t8 G: H# Z1 |- s; g( m+ q
else
( Q8 m8 `: o% i7 Z% g
{
3 f" A6 S8 k l3 V4 q
printf("No effective message!");
3 p* H& [8 u6 o$ o* j
}
2 }3 `7 R2 d" k+ z# a( p [
}
+ j. w9 R5 v- |/ U7 | E/ C
/ |/ G; Z( q. H+ v
9 y. ?* l. @: B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 k) I% w: A' g! l5 _
使用下面代码,对内存使用了mmap函数后:
4 k$ I8 g3 d' g% }# H2 U- ]0 S
#include <stdio.h>
9 [! J. ^! V0 o2 F
#include <unistd.h>
. G {& \! q% [" Z& P+ q7 A
#include <sys/mman.h>
, b6 X7 b9 m" L/ Q
#include <sys/types.h>
; m( [' A. b2 `7 V8 h
#include <fcntl.h>
/ M7 i4 y- z" U/ f7 ~4 V
/ E3 b$ w+ c0 k+ y+ w' [
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 M) ?9 j. ^" h/ j! x
#define SHAER_RAM_SIZE (0x20000)
7 _2 c, K/ F! D) a2 H0 L
! L8 {3 H- B* a
typedef struct
/ c' z' k# I- Q$ E: a8 K
{
$ ~/ Z, x% T$ f% E& \+ m# k7 _2 E1 d
unsigned int a;
H% m( U9 M8 r% |0 X O; |
unsigned int b;
, R1 E& [' i0 d/ Y
unsigned int packet_cout;
- O) j6 r; u8 y9 x; _; S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- x) @ i( _, L
; N5 Y* C4 I: r! i& U0 {" U
void read_MSG_buffer(int *baseaddr);
. R4 \9 z/ o" b1 U3 a( z# ?! c/ G0 l
unsigned int count_copy = 0;
5 p- u9 U# Z) V! O& |- r
3 q0 b! y/ _: t; S& S
int main()
0 _+ r7 G1 W4 s* W) Y' X
{
* u; {. Z# n; {3 j) L0 l
int fd;
% [. J/ p& B% ]: P7 o
int *mem = NULL;
. d5 Y; s. q- D' r& N
+ F3 ?) a, E8 s: X! _, w
if((fd = open("/dev/mem", O_RDWR)) <0)
# s5 u7 _% M l+ U& O2 O6 D
{
- ~, x4 C$ ^( r L
perror("open error");
% @8 ?0 d1 k6 w- D$ c' U, \
return -1;
% X9 @- a; b; x4 q8 o" T- f& ?
}
9 j% g+ U. y9 J. }
8 L' G* \6 w$ O9 Z9 C; T5 x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 _& c1 H1 b F; A% M% Y+ C
% z8 y+ }, \1 R1 l9 S
while(1)
1 E* `/ H- c, g! I
{
1 D/ O/ n. A; x. I+ I1 U% a& d
read_MSG_buffer(mem);
) [: n8 H+ P' j. E1 W
}
& t/ S) D: z& z9 q$ \7 c
}
( M' `# K& z8 P; o! P6 Y* |
- C8 y# z* @- W$ J9 H) e- c
void read_MSG_buffer(int *baseaddr)
j2 R+ X0 B" `! p+ r0 o0 b3 _! U" _
{
/ |) ?+ {! \+ u/ w1 J) L* ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
% q( S8 H/ K; ?. n- ^% t
* i' e* a5 Z; D
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" [7 p/ B: ^, I+ g3 m8 V9 @
6 i# M9 }* h6 x: p* Q7 a
if(pshreRAM->packet_cout != count_copy)
6 k/ V q( P2 l0 G h) a! j8 @
{
- Q- E% Y" _ G8 q! ]! j, o6 r7 o
printf("a is %d\n", pshreRAM->a);
6 `2 x% Z9 a7 J6 F. c
printf("b is %d\n", pshreRAM->b);
) A- `+ P6 L% @9 q% h# u2 O
printf("count is %d\n", pshreRAM->packet_cout);
1 N9 x+ w c9 N8 y- p& Y
count_copy = pshreRAM->packet_cout;
: O6 L! @$ ]: M* F* i0 q* u _
}
' o1 }- D2 `; |' y
else
; b* V. a7 Q/ u d u/ r3 `; R
{
: k5 v; _6 w5 H
printf("No effective message!\n");
9 E' H# a9 u$ a: J; s
}
5 `0 _4 R6 m7 |7 Y3 z# S. S/ @* m
}
, C( O8 O& S$ t9 J' O# v+ D
) _; J3 s k* i* O1 c9 G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ k6 |* \- ~; `4 c9 j
, `+ X( E7 J: f) j
/ [, N/ [8 _1 t/ r
, D2 ^ v5 Y4 r4 b
4 D; h* K* v% }9 ]! E
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4