嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& a% {* L2 e5 ^0 c6 J
. r7 Z x( u5 O0 _, f/ M' ]6 N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 M4 s9 x. T0 A/ y' p- S) H$ ]3 h
#include <unistd.h>
( j0 U7 h5 i0 g5 O4 H; M
#include <sys/mman.h>
# @; f9 V ]% T$ I: L: h6 f% ]
#include <sys/types.h>
+ Y- Y/ v) o' ?: j3 _( O
#include <fcntl.h>
8 u* p J8 y4 v" X
& ~' I% ?2 m5 f& ?- T: X( B# v9 i/ p
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 U5 a8 r0 W. C
. h* [) w( ` H
typedef struct
0 u# n- \. p) @$ W, t% p% [
{
2 L7 c' u7 P# X$ f- g# a; T* b5 Q
unsigned int a;
$ ~+ `! E" L9 j% d8 \' F: ?* K
unsigned int b;
% v( u( f3 Z: i: U
unsigned int packet_cout;
: v* d; a4 U% w" V! h# B1 l# m/ i8 A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) W( r& a4 r, X1 B
$ o9 k% B" V0 U+ F/ e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ I% }1 G+ V$ L* `2 Z* |3 U6 ]
unsigned int count_copy = 0;
' F9 Z& N* w; \" r" T1 [7 o
% d$ _6 k5 k& r! {- n$ X
7 Q1 w6 o6 ?; L+ r
int main()
. S7 v+ g5 A/ r- j' p# f7 w
{
- R3 H! N% y3 y: d% g# f0 M
pRX_MSG_PROTOCOL pshreRAM = NULL;
* u4 b8 T0 h( U6 y5 ]2 \6 i1 D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: E$ x. a% j# N& \9 L5 p7 l/ ^* o+ R
! o$ g, B/ g' w2 E
while(1)
: s$ _3 L0 a7 I+ Y
{
( ^3 B% q6 q" p: C( J
read_MSG_buffer(pshreRAM);
. G/ ?, W0 O$ q# a. z5 n
}
3 m# H. H1 M8 r
}
: m4 K# ?8 `+ g( v' K
* A& O7 i; [+ h5 |* A& C3 E- z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- }( R# ~% ^) H2 f
{
c: S6 _! ?" s% y3 S2 o
RX_MSG_PROTOCOL buf;
7 |% r: ^) i) Y3 g4 \' S
( K1 E6 R0 o; `6 G |0 L7 l
buf.a = pshreRAM->a;
) X7 J) y6 e/ A, U. A. C; u& T
buf.b = pshreRAM->b;
3 W7 L! w U5 m% l P
buf.packet_cout = pshreRAM->packet_cout;
: e8 D* ^& h2 \* B( C- i& k
4 L) ^, |* N+ K
if(buf.packet_cout != count_copy)
$ r1 R. [ ^- R. _
{
* f% e! B4 ], j f: N2 x$ U
printf("a is %d\n", buf.a);
?- C1 i \5 C3 n9 t8 n0 R
printf("b is %d\n", buf.b);
) O9 K9 A: ?9 U3 [5 P, d# h
printf("count is %d\n", buf.packet_cout);
2 `8 N" H( A0 g2 j+ j& B2 {
count_copy = buf.packet_cout;
3 ]# S( U" E: A8 N
}
/ m J& o; M- k4 |
else
* i9 g4 |& Z* ?
{
. c7 T6 c5 |. q0 C9 ?3 d1 `( Z
printf("No effective message!");
( ^8 ?9 O1 {& U4 z
}
0 i8 a0 \$ j4 Y* G: F$ n
}
8 C+ w( ~ S) F7 |" Y
" |4 a. z$ H8 y c
5 s ]8 j/ T B1 F( j6 h: K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ v7 x$ x) ?; ~
使用下面代码,对内存使用了mmap函数后:
H/ S; X2 n- {, W8 i3 x
#include <stdio.h>
% E5 s( |0 b' C& b# O7 z- f
#include <unistd.h>
( e) b2 q. G! c# x4 O
#include <sys/mman.h>
7 `3 _- u2 _0 x# H0 ]4 @
#include <sys/types.h>
5 Z6 N" n6 {+ w$ F9 [# M
#include <fcntl.h>
$ ~4 r2 P; x7 \' f
( S7 `: L+ r5 J9 t
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 ] N. t# s8 d: c3 }
#define SHAER_RAM_SIZE (0x20000)
9 O, l. I$ T) A
' s+ q ]# ? Q
typedef struct
" S' j9 M) b# Z/ h. }1 X& V. E. B6 h
{
% `( s2 L, e* X1 Q& S3 ^9 j9 r4 q
unsigned int a;
: J' i0 X' V& T2 D
unsigned int b;
, c, ^0 h# _. i! L
unsigned int packet_cout;
6 F. |' c5 k& t3 t0 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) }7 N; x# L4 u) F# ~- k
4 b% S1 k5 ?6 r- P( e: l( o7 s
void read_MSG_buffer(int *baseaddr);
# X! d& {' F; i5 @ ^
unsigned int count_copy = 0;
8 \* k* K, e6 t* M7 p. c4 m6 f
5 W/ Q! z! S+ ^/ q+ K9 F$ w
int main()
: ?4 e6 e' |- _2 B- b+ N& F- u
{
5 h' ?- p9 r: I8 p4 @. y/ B/ `
int fd;
* ` x( c5 E7 U; |- w8 n. H
int *mem = NULL;
' W% E4 G. t+ k7 `1 d, u
: h% L% x$ L( H
if((fd = open("/dev/mem", O_RDWR)) <0)
- U/ }2 G1 C& @# `5 p& l; b- Q
{
9 [* n( T0 m8 T- _
perror("open error");
" ]: S2 T% `2 [# a& q: C
return -1;
7 h3 Z) f$ e4 O% y
}
! Y' }2 w2 R! K7 b" ?1 k$ k
) d6 o- h! x( _/ X9 b: h
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 \7 j3 Y& N4 U6 k6 m# E9 j) S" H
. T6 `: ^4 r6 g/ t- P
while(1)
' T$ t. D: Y9 c/ C0 F
{
1 f G! H& ^; B5 U5 n8 A) y
read_MSG_buffer(mem);
! }( A% V; J8 S" `$ U0 q' i
}
4 @6 c4 I( q; U: w1 \& n3 t {
}
/ q' {) N5 E4 O4 s& y
y# a9 P0 b( d# B# z& \$ ?& {
void read_MSG_buffer(int *baseaddr)
( D4 w/ T3 P5 L. V; n% `" B
{
( ^* z/ E$ x4 \' x
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ q5 h/ k0 D" L6 z9 O) P" h5 h
c2 F" e. D7 c% A' C( i) m
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; \+ k- }* J$ E' m
" ^' M. p1 Q1 r
if(pshreRAM->packet_cout != count_copy)
8 [3 |* U7 `1 m0 x
{
$ E4 I. W- i- i0 E; F
printf("a is %d\n", pshreRAM->a);
( U" F7 i) l6 |( h$ v- k& Y
printf("b is %d\n", pshreRAM->b);
6 l7 t' J/ H0 }& r: p2 }
printf("count is %d\n", pshreRAM->packet_cout);
; x5 {0 E/ v+ S- w4 T& }
count_copy = pshreRAM->packet_cout;
& ^4 e9 m0 {6 k& d
}
, O2 L- N) ?) `& T$ y$ ?
else
& D1 V- ~$ ^, K/ A# B$ R
{
5 v: j) w+ i' w% Y
printf("No effective message!\n");
" }1 U! }5 X* j/ W
}
" G0 { }( `& S0 F: |4 y# G% d
}
, W. T# _( W: a# k/ k3 V2 P- \+ B
& J! |) ]7 g- Y3 S( W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, }' N2 L' O: M. W+ N8 d
X$ N: `) T) K3 w1 ]/ Y
3 t9 f l& S6 F% ~% O! E; f" z
' g. W6 q3 D) n# {, _2 M
9 E& \" i8 G) R( y1 m
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4