嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 Z$ ^! A* R6 j' X8 o: y/ w
& R$ @! s7 H: o
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% C8 S- J" }" E9 H
#include <unistd.h>
) m( P$ N$ d9 e2 a0 L
#include <sys/mman.h>
7 t0 z5 o6 T$ t% F X
#include <sys/types.h>
4 z' M8 e# H2 d/ \
#include <fcntl.h>
! g, t) U3 u# M# } h
; t6 Y* w# E6 ?: P) J7 A$ I2 @
#define SHAER_RAM_BASE_ADDR (0x80000000)
k$ V& b4 |$ ?+ i. b: `4 E
+ W# G5 {/ a) H, u% r
typedef struct
! P4 U+ K* ~ M. M: \) C& A
{
4 A5 x; F& {2 {: G, Y
unsigned int a;
* h+ A: g1 N$ ~5 `+ A$ h. x1 r& ?
unsigned int b;
( }+ Q& W* ~4 T9 t
unsigned int packet_cout;
. H j! B$ u1 \3 p% g! h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
x/ t' @% Y, | X- L
( ?7 u# P$ A2 c2 E& B* B) c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 e& z$ U. U8 s! B) L( g _
unsigned int count_copy = 0;
3 V0 V; y# u# p, r) L- i ^
6 l1 P4 s6 b# {. i9 J$ x/ L
Y! w2 V" f. W0 }7 Q4 F
int main()
& o) G5 N3 h; V2 b7 t% Y
{
- m$ x6 `, r4 P2 a! s
pRX_MSG_PROTOCOL pshreRAM = NULL;
' l6 i9 {5 z' {2 k( e+ `
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 e; @% D" J! a+ ~9 I' c% X
/ x' s0 p4 D' F
while(1)
* d& V+ ?2 Y# j0 X; |
{
- \. I- ^# D t! G. [
read_MSG_buffer(pshreRAM);
7 G5 p/ z) r; A& y F6 f+ \
}
: Z' ], p! A* l* ~( J( m" j2 `0 a+ i
}
# E2 ` Q, \# Z! N
4 U" y9 e. n8 @1 t4 ^- l6 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" P% V% ~! ~% U9 n9 f( {
{
9 V: ?% f- Y+ y
RX_MSG_PROTOCOL buf;
! N Z+ A( j/ @+ V3 i- ~5 i
. c$ P+ z% ] r/ ?+ Y# ?
buf.a = pshreRAM->a;
+ @: l0 c8 R$ y1 h; S
buf.b = pshreRAM->b;
/ S( q+ D$ ] x/ c
buf.packet_cout = pshreRAM->packet_cout;
* _# u3 H( W$ x* T+ h2 Q
) P$ C' R. C# e. H: Y2 N2 ?" A; r
if(buf.packet_cout != count_copy)
9 n( \5 c2 }; f* {8 j" s
{
. P- d1 x" v0 B# v
printf("a is %d\n", buf.a);
% d" H% v4 }" O+ N% {2 d
printf("b is %d\n", buf.b);
7 i0 d- t2 b: h0 |% r7 h4 p! P! u
printf("count is %d\n", buf.packet_cout);
2 l {& p1 M* W) C
count_copy = buf.packet_cout;
" z( c3 ], a& @
}
: H+ L0 A0 g+ ~: w$ ?7 R1 l
else
7 h& v* D2 Q# y& G2 v* e
{
: A5 _9 s) R& r( ^
printf("No effective message!");
: a! |( q6 h4 v
}
& X& p ^. x3 `9 q
}
( {$ W" n; [2 u% Z" l
8 e, G2 t" {% P$ l) `3 ~- r" S9 r
4 `' V8 r- \6 f" S+ _+ Z5 L3 h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% D7 e. X& Q. x2 u6 P
使用下面代码,对内存使用了mmap函数后:
- Y6 M# g) }. J
#include <stdio.h>
& v, K$ d+ V; ]$ c2 u" H
#include <unistd.h>
7 N" ~$ \4 \; }+ @8 G" K5 y1 w6 J$ _
#include <sys/mman.h>
( Q' {) U8 | E( ^
#include <sys/types.h>
7 s4 N7 Y7 x# U( C& |
#include <fcntl.h>
; y, C$ p3 \6 y* |: A* P; F
+ W3 x; K- P8 C( L% @1 w+ ^% k
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 l# b# g ^: G3 m& a
#define SHAER_RAM_SIZE (0x20000)
0 f. q& ^3 n3 d: ~) C% b1 V- Z
( z3 s6 M0 c! u3 e) p! x
typedef struct
. T% @9 u* ^( ~6 ~: `) i
{
) y l" X: ]' K% q8 d7 _+ Q
unsigned int a;
1 d1 s; x# l6 B& t
unsigned int b;
H; `; C, X* r" O- U {% c! v
unsigned int packet_cout;
, B8 m' t9 F2 t8 i* T E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 X$ y3 Q! a) |. p" U7 H! A
! k% |. S |5 [% U
void read_MSG_buffer(int *baseaddr);
8 ?# o. G6 T8 J1 ^
unsigned int count_copy = 0;
) h8 k& W' R, ?" n
5 E% @. A: C, J% d; S( ?( d
int main()
7 E* T* f" h$ p+ k! a1 N
{
! a& R4 O& \6 h ]5 w! r7 V
int fd;
1 n0 ]4 c. a- P/ e! N, R
int *mem = NULL;
: _, ~. Z; U d
5 A- j7 M# G( l+ N+ M
if((fd = open("/dev/mem", O_RDWR)) <0)
4 e0 p- i% x& ~" J( r' n7 K$ ]: h5 }' W
{
& W4 h* y8 P( D1 J) X
perror("open error");
% A7 z' B5 r; A; s+ y" z2 z; w
return -1;
: k, v2 [7 v) V( N
}
+ d0 E$ j5 A7 W9 `1 j
5 R2 _* ?1 J w+ h; T* m7 r% z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
N9 S# a& y5 W& U0 {7 G+ i
( _& O3 G" i* y( @0 y
while(1)
$ d( t) t: s g. s
{
! ?7 y0 |; a& ]- s
read_MSG_buffer(mem);
0 P; i; B w& H) z6 [; v
}
" b) V! a3 a7 H
}
" _% S- i* O( z \* \$ a
% G) c3 j) V# @6 \6 ?
void read_MSG_buffer(int *baseaddr)
' u: b) A/ f6 A
{
! `! H7 R( c. s( x% r, a2 I
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ p0 F$ w( {) P/ R$ r( x
' E5 U# r ^, |- s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 I9 C9 o2 v- E% A* l! e: _( Z
, o; ?3 L }! z9 a7 X
if(pshreRAM->packet_cout != count_copy)
0 I, Z- ^& u9 X
{
# P) @& l& O6 [$ v) n6 R
printf("a is %d\n", pshreRAM->a);
2 G4 m: Z3 j0 Z- R8 x; C
printf("b is %d\n", pshreRAM->b);
# A1 n% w& H& N9 v& C
printf("count is %d\n", pshreRAM->packet_cout);
- ?8 M* ~+ Y7 x: ^( c3 @6 P, g
count_copy = pshreRAM->packet_cout;
- H! ?' \; P% I. d1 @% Z
}
6 c$ T' d1 ^" {0 R! i7 A3 ~
else
% Y7 T) ]: }8 ^" D# G0 }
{
% ]: M0 G, H' c' c4 U; L
printf("No effective message!\n");
2 h- N( W$ `# r n) Q
}
; f" F4 x3 l0 B/ E* `! M, a
}
. D/ a( O) |2 F; P0 K6 Q( x
: G3 V, R) F) r) M: o) p% A- E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" w) h( ] R) I
_* ]8 Z3 w, B+ n+ ^) F) R, U
5 f, E1 z R' s2 X
$ ` K& S' G5 K }2 A
+ T. M! h# l6 u4 G3 J- i
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4