嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 I7 t! N e; f
! q- j2 p. M* @! d9 p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 i. ]% p& R5 z6 ^6 R$ v& m
#include <unistd.h>
& D# W3 R: ^3 W+ C6 ^
#include <sys/mman.h>
: S2 w6 e, \7 Y% k" q
#include <sys/types.h>
7 v7 x& F8 M. t2 O8 E
#include <fcntl.h>
X# [5 O+ t7 E m0 C# l6 q7 G
" Q( Y0 g+ c0 @' M! U1 U
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 J3 i1 _7 @ i# @: F% Z# }/ x
- E* I* i$ C7 ]" [$ y
typedef struct
: x2 s/ K9 F% J0 B' `
{
9 @, S& x- Y2 M/ @7 k o& K' f
unsigned int a;
6 o3 E3 k2 u |, E* J; O! e
unsigned int b;
) T7 N0 g/ `! k, L& o F5 S
unsigned int packet_cout;
0 O$ G, Q0 _. w7 s" j4 S$ l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 a: ^; @% s! ?
, a% V0 K5 o1 Y3 ?/ n) b3 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" _* H1 G* b( ^- \3 i! A8 X) V
unsigned int count_copy = 0;
9 M# X+ h7 E0 `; A
0 r5 u8 S q! W) n; r
5 v/ [3 |, R/ d6 o+ h5 d
int main()
% i3 W, y& n3 {* E# j/ U
{
1 y9 O3 q. l5 S4 v: m1 e6 h
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 f5 o3 y8 O6 A- c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. d8 }% t; v7 A; S7 ]$ e
( V! x; J8 u7 v: V9 H0 K1 R, G6 h
while(1)
" P" j9 V2 t& j, P5 C8 T) m" Z/ u
{
' D+ T0 e1 ?+ C& ~ R
read_MSG_buffer(pshreRAM);
5 }# k& m( t4 F, f9 _8 H
}
7 K0 m P2 ^0 K5 x4 _8 ]
}
/ T5 M, ^' O) t7 T, v3 r/ g
* b5 l: ~" l3 }8 W5 ^& n# l% a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& w1 g) n% M! a0 Q* `
{
$ R( V& Z: J1 S: I
RX_MSG_PROTOCOL buf;
2 v4 c& o V6 \' \+ q
. L: a. ?, v. b) @5 l
buf.a = pshreRAM->a;
0 m v, h+ i( r8 Q& n
buf.b = pshreRAM->b;
: n. u5 V2 U* N
buf.packet_cout = pshreRAM->packet_cout;
- |- J' ?2 b+ a8 A
$ O( n; |# t& X$ u
if(buf.packet_cout != count_copy)
! e6 y4 u3 I9 X$ F/ s# D$ D* \; q
{
% D- { c7 G! C) B# \1 P) ?
printf("a is %d\n", buf.a);
; k% L# i2 G3 @* } z
printf("b is %d\n", buf.b);
, ?! z2 k6 c% j! y( b0 y
printf("count is %d\n", buf.packet_cout);
8 A3 D4 C6 i" ?! T* ~; c4 u
count_copy = buf.packet_cout;
3 H" E. \) o# J1 y- B' y$ x
}
t# L/ {% u4 i$ u" O
else
+ o( ?0 m: _ b7 g" G6 b* \# R
{
/ M$ \. x" x. Z! |- k6 C( B
printf("No effective message!");
$ V+ T- u7 A" O) \- v
}
1 `( m3 d( B- t i
}
8 X/ U* V4 U$ C1 |/ D' L
7 {$ P. |" J6 I$ W
, v5 U/ v, `, s' y! z+ W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: U# K% G! D8 `6 T% T% t
使用下面代码,对内存使用了mmap函数后:
+ M* }4 O* f( _7 |# P% {
#include <stdio.h>
; x K0 T5 h& V7 e/ z( B
#include <unistd.h>
- B! N& k! S6 K
#include <sys/mman.h>
. h- Z; J& T+ b3 M% y
#include <sys/types.h>
, m5 j5 A: F- y$ L4 t$ B
#include <fcntl.h>
2 Y2 @0 A" g* q4 Q
. w1 M6 _# o+ q! ^
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 I" h2 z/ j+ M, L/ O
#define SHAER_RAM_SIZE (0x20000)
! {. U/ K5 C6 X7 X
1 E" `9 U! T& T3 i
typedef struct
5 M/ A$ G/ b) y
{
; {9 _8 H& k# S4 Z2 O: K, M/ u! ~4 o: E# M
unsigned int a;
+ J# o* L2 J, x* R \ A9 H7 @
unsigned int b;
! W2 ] S4 r( @' r/ U* l+ q
unsigned int packet_cout;
& _& S' Q1 c( Z, }$ E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 H' B; L/ n0 u$ o- h+ H
) K6 i5 L8 {! [. H* W
void read_MSG_buffer(int *baseaddr);
- `3 T0 z" } d% k2 e5 V' w! x
unsigned int count_copy = 0;
4 e2 H3 ~0 s7 t0 ?% i
- p+ e& b! ^- S8 U P) Y3 M
int main()
# `0 g* B+ R" |2 u
{
2 h" }( g' G! w# A' }
int fd;
3 j- L4 @6 R' r0 g* D- g
int *mem = NULL;
" j: e* C7 @+ u
2 a1 R% U: x& h1 i2 Q" r0 L
if((fd = open("/dev/mem", O_RDWR)) <0)
9 P" w: X( q! c( J, J
{
( x/ x2 o& B$ F) _0 m; ?
perror("open error");
0 E' s+ q7 |8 S, z
return -1;
# k: H {9 M9 F; j4 ^# t
}
# O2 q+ j1 P, H8 J h" s$ o% D
# E0 K0 r" N7 b% b9 Z( Q+ e% `5 G
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; k7 H+ `6 v) \" }; X
0 \. V$ ^, h' ]0 c! b5 h
while(1)
7 m1 t) W0 k+ d: V2 K- \3 u
{
$ [0 q4 `/ h$ Y" m/ a$ H: R @4 h
read_MSG_buffer(mem);
) C7 Z# u& q5 w0 y- V, @5 w
}
! A- w: q1 S Y! r" d
}
1 m) ?- K& |) d: j# `
. ]" e2 C' K$ r' K$ R; U( k
void read_MSG_buffer(int *baseaddr)
. t: W+ {* y7 }
{
) d& V0 [! C9 q& m
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 Y- g' _8 ?/ M, _- z& o7 r r0 K
: f6 x9 B: u1 W! a! g, k
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# L/ j2 W5 p$ W: _7 h2 H8 c" ]# g
+ l# ?. e+ k+ w
if(pshreRAM->packet_cout != count_copy)
) g. n# U2 Z( P& S
{
M; w: D8 @3 V( o9 f j
printf("a is %d\n", pshreRAM->a);
5 j: `6 G8 [/ P7 v
printf("b is %d\n", pshreRAM->b);
8 Q" p5 \, u( N/ h3 ^* B/ `
printf("count is %d\n", pshreRAM->packet_cout);
* y g1 |% e g% `/ W
count_copy = pshreRAM->packet_cout;
2 S8 d* m) f( I: T
}
( P" \ n5 M! B. w4 a5 F# j5 B
else
! ^: p; Y) J5 i7 u" R8 S+ {- c
{
3 U! Q& }* S- o9 f
printf("No effective message!\n");
: ~) t) O0 p( w. I1 H
}
" x7 `8 `- r" T
}
& b, J7 B" r2 ?* u7 [
1 b& l9 `0 d3 X# Q% ~5 m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& j; y3 o7 f- d
$ \/ b, I# k( _
8 A4 c- d; Q+ F8 O0 \
/ k: O8 a' u% t' Z9 E! _
4 }& n/ B* t P& E) \3 j- @
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4