嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 e1 p, j( p' _2 C8 M
; _& v9 o; P' Z! A2 A9 t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 D3 a( ]% L$ X6 i: X
#include <unistd.h>
' C+ t8 ]6 {$ e/ p2 k# p6 d
#include <sys/mman.h>
: W: B. W; s# e
#include <sys/types.h>
; [- r6 f! k) a) o$ X" z
#include <fcntl.h>
" ^" O( o- P* W
: F. o4 u0 n7 d! ?7 r* g5 R$ K
#define SHAER_RAM_BASE_ADDR (0x80000000)
* f# ?8 w% l2 U4 ? ~
, O p {$ @2 H/ V+ [) F
typedef struct
; P& P. |4 o( `) K4 O/ K
{
- ~ B- R: K6 N- _: N
unsigned int a;
1 A$ f7 O, c. [2 M
unsigned int b;
% ~: R( E3 g; `/ H) y
unsigned int packet_cout;
, r: V8 S1 ^4 D- C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ m/ q: {8 [: a4 |" a F
( x' `4 x' Q% y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 U2 A$ {4 R" a3 X2 _+ d, S, Y
unsigned int count_copy = 0;
, j$ Z8 Z3 C* n; k2 v0 |+ n5 l
+ z }6 D* K* n+ y
. a# |0 K. F* \7 f7 u( x' X* X5 L/ h S& M
int main()
1 D5 X4 ^% |5 k S9 J
{
* q. {9 I) i! S' q) U; q0 a
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 _' c4 l6 j( B
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: I; R9 r5 W: m1 n# ?8 I
9 N4 n' c& {4 p5 J/ f( b9 a6 @
while(1)
- J2 K$ k& j% T0 [) B
{
8 k2 Y1 {& C( Y. X/ x" i; Z
read_MSG_buffer(pshreRAM);
, s/ o N+ H( V3 w5 e" X9 z0 @
}
# P9 b0 f* b$ e# |8 r" a( S
}
& n; d4 x0 P1 b2 u: ]2 T
: M7 ~$ T3 c1 l& q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 r) d& ]1 w5 s5 T3 d* c' a$ e2 j. _
{
{* c h/ S* @1 u7 _
RX_MSG_PROTOCOL buf;
- Y I8 _: F- ?3 I. _ c+ e
8 O$ v) L' S o. x! e& o' |
buf.a = pshreRAM->a;
8 T% @: ^( b" n6 o
buf.b = pshreRAM->b;
3 I! Z% A n* }0 N! |# F2 S
buf.packet_cout = pshreRAM->packet_cout;
( I7 g. t* F' u! I, b. G! M. p
0 h4 p% h: r" F8 O1 N1 n& J
if(buf.packet_cout != count_copy)
3 D; f5 ~( _" D, W+ z6 S
{
7 F6 n! c' K5 B9 h
printf("a is %d\n", buf.a);
H: i: N5 S2 L. P3 b
printf("b is %d\n", buf.b);
6 B" ]( \+ R; E; a0 M& J4 [+ M
printf("count is %d\n", buf.packet_cout);
- u1 Q+ U8 k: ?5 N
count_copy = buf.packet_cout;
1 u- P5 g2 U& ?1 c b
}
1 l& d9 E% }* N7 `+ a: ]
else
& x; h+ s8 t7 a1 L
{
3 K: l# z; w! G, X. V
printf("No effective message!");
0 v5 P- m5 `4 L' W9 p, m
}
5 I3 N( I0 i4 S4 w% H' W
}
! z; S4 B" {5 @. c+ @
# [$ L; \* `- f
7 T3 l2 p" I0 k* [& S& s9 X6 i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 D8 o% b& \: u" p% Y& u$ k, O
使用下面代码,对内存使用了mmap函数后:
6 v! i2 ?; R1 R( Q" S
#include <stdio.h>
. t# Y) l4 O' _" Z5 S+ l! `! P% |
#include <unistd.h>
; r5 t. I& ]$ y4 y; B: _& d
#include <sys/mman.h>
* K1 m( L2 j( A6 `, `
#include <sys/types.h>
9 ?' r) Y" Y$ K, b8 Q
#include <fcntl.h>
$ F5 a) J( Q* L$ i8 q* H
0 F: F: V/ U& W7 V; w
#define SHAER_RAM_BASE_ADDR (0x80000000)
. v7 {# _3 m' _( J( h' J& x
#define SHAER_RAM_SIZE (0x20000)
|5 {) Z6 c& ^, }& b9 F2 Y& n& m
4 e6 O. @: L3 U% z2 A6 w6 t
typedef struct
5 P* E* r4 {' q" ]9 {; z
{
* J c( u: q& i* V' |2 V
unsigned int a;
( W' L6 @- c! V- n: [7 H
unsigned int b;
9 ^, F4 [* c* Q; X& |5 ]- U
unsigned int packet_cout;
: b* [7 I- _' u" y" O: C9 ^/ C( v( y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 `, {4 S6 l. e' _6 x. Z" J: C6 ^
1 x/ [& v% g/ f( Z0 G* o
void read_MSG_buffer(int *baseaddr);
! b3 Z# j, t: b. L' [8 z
unsigned int count_copy = 0;
' u4 b* t" P( D/ ^6 d( z; T2 X
4 d$ H0 a6 e+ G0 I
int main()
/ p/ Y) |* P" L. p/ x! m" h
{
" K) ` \. Z. n3 m' d- c h0 z
int fd;
2 M3 s; M- ?) ?* \8 X
int *mem = NULL;
) @% D# N V: c6 @" Q. s1 k
( @. L7 Z) Y) n- B8 B
if((fd = open("/dev/mem", O_RDWR)) <0)
- d& i; b9 }% c& \
{
' C5 S7 D6 P6 W* g4 G! u) E
perror("open error");
* M+ a9 }8 s+ g. M$ v
return -1;
/ k l+ P% d# k8 m2 b& a5 k
}
! }1 w) n% r9 z/ {% m
& p2 t j7 f/ v
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% {) ~& V0 M2 i
% U, y. l/ a9 N: a+ L
while(1)
% p/ b. I" N/ H" _( n
{
1 R/ t( {7 o$ u
read_MSG_buffer(mem);
( ^* \ n$ t- T" B
}
4 H$ H3 m) G+ t6 i
}
3 T' i2 m9 J/ k- f
; x. u4 h2 v4 u+ {9 k
void read_MSG_buffer(int *baseaddr)
$ }! h% \$ |% P. D: N6 ~3 t
{
% I% I' [9 P6 i
pRX_MSG_PROTOCOL pshreRAM = NULL;
' _5 C$ G6 k0 ]) d
! ~. }- N/ C( q! s3 L
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* O# p/ [% y" t" m; A& B
$ d# A M' u6 a/ Y( T _( |
if(pshreRAM->packet_cout != count_copy)
/ ]; A- N5 r7 i4 w
{
5 v# e& x% }, W( ] \, @6 p
printf("a is %d\n", pshreRAM->a);
. ~+ e* _1 z" y4 B& D+ K1 J$ i
printf("b is %d\n", pshreRAM->b);
1 [" k/ K1 A1 I. a
printf("count is %d\n", pshreRAM->packet_cout);
! E: x3 ^( u3 r* R) \+ a
count_copy = pshreRAM->packet_cout;
6 i7 |3 G( K- Y: |# N
}
I- u7 k8 E- t& k4 E6 ~
else
/ ^2 T* J# ]2 V
{
, V! d0 m7 }( ]+ f8 n
printf("No effective message!\n");
; O( }2 u- D/ ?4 C' A
}
6 ]( D' E7 y# q1 J9 T! Q
}
7 c" b9 e( K2 L) D
4 g' t+ L) k7 f7 [9 Y2 P' d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% _( h" z# _: u( I: S: Q3 i4 |
y7 m9 I: E! ~5 Z+ R& U% D
$ }$ v6 s- O. a4 g, o1 `
7 F7 {* r8 v. `% t% G- J) {
6 D3 S' z( ]. U9 f6 h
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4