嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; n$ u8 p1 j- `& E$ M& Z* @
2 A$ F! E0 ?( X! u; R: F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 g( j2 I" Y4 i. E' ?: l
#include <unistd.h>
; q) M5 `* G. S* l1 \) J
#include <sys/mman.h>
4 [' h6 Q* m$ d
#include <sys/types.h>
' c; W5 j5 C+ t2 N
#include <fcntl.h>
% _6 F% u: u( U
( _2 W2 T0 R/ R6 [( M/ z; q& d+ E9 d
#define SHAER_RAM_BASE_ADDR (0x80000000)
) @2 `: [: u# N2 F' h8 ~
8 ~" A: r1 i" U8 O
typedef struct
6 p- ~3 M( f- x; e
{
8 L9 t6 u' G& }6 R
unsigned int a;
5 v+ V% ?! Q% z6 }* k6 |) g/ z" N
unsigned int b;
, y& @1 _: d" f9 U
unsigned int packet_cout;
) |' R) E! J; y+ d( y' j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; S: M7 v9 F+ Q0 }. N6 v4 ^- c1 W2 n
5 b3 n$ S& Z5 E6 W& ]# u' P8 y2 t8 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 Z3 e- [( T' j% G7 t- e& U
unsigned int count_copy = 0;
3 t5 ]' S' T2 I* ?1 t' e
( Q" U) I" H- e
$ D% a3 G, B1 l }' d! {; g" I9 o
int main()
+ ~1 w; m9 u" u5 q$ e
{
- g/ ^# K- _0 c, p5 k. u) e
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 j z2 D3 ?# b7 \: X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 \3 I3 T/ _! }7 P r
" p2 l0 N. y6 l6 r0 P
while(1)
/ j, a7 B. b% ]0 d m4 n# c
{
4 e3 l w! M T! H
read_MSG_buffer(pshreRAM);
5 f0 h, X/ [5 m6 T4 B/ l# w) L, c
}
/ o- d }9 L3 J* {& [0 z% Y
}
+ n' b0 o, z8 K& ~( \8 ^
( G& J' C4 I- k+ O1 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 V/ f+ k2 K8 W0 j' @! Z
{
/ ?7 Q/ R2 O8 ^! `1 y b! m% W
RX_MSG_PROTOCOL buf;
! ]7 f& W: w2 g. p( S) }( K# J
% T& B) i7 L. K; O! z4 h
buf.a = pshreRAM->a;
/ c# H) _! S( w( |1 T! X9 D
buf.b = pshreRAM->b;
! ?: `9 Q) n9 V9 p5 i2 l
buf.packet_cout = pshreRAM->packet_cout;
! Y2 ~$ ^. p$ o6 \3 ~
, h3 p4 d( f( r( k* o' O7 g
if(buf.packet_cout != count_copy)
+ v- d' o" @6 w# D9 c" p/ _% a' e
{
$ s0 C" N* {" d5 d8 u5 e& t
printf("a is %d\n", buf.a);
- M. t! R$ C$ q, s8 Q- \
printf("b is %d\n", buf.b);
& m( K9 o, v) A( J( O7 ~: [
printf("count is %d\n", buf.packet_cout);
% ~2 A1 ^, |2 z+ B/ M
count_copy = buf.packet_cout;
% Y* Z% _1 p; `" T8 `
}
+ L1 Q0 ~/ E# P
else
% G' K7 A. I) e. S) B6 {5 p$ k% c4 v/ ?! f
{
0 K3 F5 y x/ O: l# H, W
printf("No effective message!");
$ z( R; n# D" M5 j C* Q
}
# ?3 E) b" a' I
}
2 r) J7 m; F( s/ `1 u! k! M# q
, f0 C8 V* m" b
% w/ U. p v8 u- ^! r# {+ b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, {1 Y2 H0 w( a9 ~( z |* Z
使用下面代码,对内存使用了mmap函数后:
' U0 A# \+ J1 F0 t: i0 q
#include <stdio.h>
% ~6 y7 B5 \4 Q7 v. v
#include <unistd.h>
" |* z( `6 }0 L1 J! t
#include <sys/mman.h>
! |& m+ C- I" ~- ^# G3 \' Z
#include <sys/types.h>
' B% [- p6 a9 D2 W8 U& p& v) i
#include <fcntl.h>
# p8 B$ O g1 \) \
4 r6 G8 @, M- N. `/ \8 x
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 z8 A1 r/ b o
#define SHAER_RAM_SIZE (0x20000)
0 Q8 A. G& d" o& Q# l
1 `( ^ Z% ^7 k3 O$ M% {
typedef struct
# } j( l+ {1 [# C+ e- _) Q, C
{
! {3 J& q" @5 x" `7 g6 w
unsigned int a;
1 N! K( b% T u$ b. q+ V
unsigned int b;
' L) {' [: F. r# X# D' R
unsigned int packet_cout;
, X6 N8 k9 }9 P& E3 p; @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! t9 \! e4 G+ ~: ?. {! Q6 G% P) D
) p8 `( k: e- X6 m# `! E7 ?
void read_MSG_buffer(int *baseaddr);
: L+ U8 A4 N5 }) G8 s7 t
unsigned int count_copy = 0;
, u" q7 m" m+ O, J. G3 F
% K& k ^, I2 [/ ~' S
int main()
" ~( A% x0 p$ }5 d/ T
{
$ `' a6 i1 \; m
int fd;
5 V7 _8 t+ L/ q& b' d+ u
int *mem = NULL;
! q7 }; X2 K& d" ]3 e9 ]5 K1 J
3 J; ]6 q+ b; p, h5 L" @7 L+ ^2 l
if((fd = open("/dev/mem", O_RDWR)) <0)
: r7 G& Y8 O1 {7 r
{
$ g. h; W4 `+ Z9 ]2 x5 l
perror("open error");
2 t; I( L8 I, ^4 g- [. t; ~
return -1;
! _3 `2 Y. a5 D ~6 Z
}
) y& N0 b" j. R9 _2 g
7 v2 z4 w: C; m- A+ {' @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: d7 D- t' O5 \, C, M$ p
+ w) p: D3 E8 Q1 \
while(1)
5 ~; Z8 w6 f4 |0 b# O
{
* h; ]6 q/ c! f" w+ Q4 {
read_MSG_buffer(mem);
' Z8 d9 B7 \; c0 H
}
( b- V7 E2 R; m5 k& j% z9 j3 _% [
}
. l& C3 s& Y. r0 }: ^$ _7 ~
) `* ^ m# d% U/ y/ S
void read_MSG_buffer(int *baseaddr)
% g- R1 G3 m; F/ o U
{
% q8 d: h0 S- r
pRX_MSG_PROTOCOL pshreRAM = NULL;
% t, I$ G9 D3 g- m
7 X" O2 N) j) \" u
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% V- q4 N- ~! h6 X o
. m% e: N( J; y/ F
if(pshreRAM->packet_cout != count_copy)
" a) u+ q: j! O+ ~3 t" w2 C
{
7 i- `0 S# \8 ?) T5 j, l* {
printf("a is %d\n", pshreRAM->a);
: ?# |/ o# V# X* y
printf("b is %d\n", pshreRAM->b);
8 s3 y1 ?5 b5 a
printf("count is %d\n", pshreRAM->packet_cout);
- I$ ?" W0 D( ?. x; K5 z; J
count_copy = pshreRAM->packet_cout;
& J% B% s$ }& s. a5 R4 }
}
: k- X0 x' X8 W+ P4 Q( Y9 ^
else
9 Z e |. L: c1 l. L
{
" u0 v4 R, `% `9 L1 e
printf("No effective message!\n");
$ u8 d. Z7 l5 `0 a7 P$ {, Z
}
/ L% d: x1 p6 D# q
}
/ r$ P4 d, P p9 f' d. B
( E+ U! `1 k |0 \8 c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; `/ Q2 U _3 O, s3 z* G# H
! A. `# r ?/ ~) ?- m
% c8 g! v0 D! P5 r
, o& V O ?6 u3 H
1 b% d: b; l* u' C
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4