嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' m2 a2 W* C: _: b: }1 L
! u8 [; w$ L0 Z4 ^1 O Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, C6 _7 x. k- p& w
#include <unistd.h>
) q) V+ x. A* a/ _( X
#include <sys/mman.h>
, X0 R, K1 x2 i q7 n1 R" y9 {
#include <sys/types.h>
1 X1 t4 y! O' j
#include <fcntl.h>
E$ w8 W- e+ j& z
! @ N4 w' k0 O3 B
#define SHAER_RAM_BASE_ADDR (0x80000000)
' Q3 X1 f4 k9 o, d
1 s* N5 s: |9 o
typedef struct
" G3 r U+ ]$ W! @* A0 ~
{
' ]& ]. P# s2 y
unsigned int a;
- i! M" ~% p7 x& r
unsigned int b;
& Z3 c- }- ~6 e( f
unsigned int packet_cout;
& `* M. @* K" e9 [* \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 [0 v$ a! E8 J! y, s" E
2 c- D, F8 X2 E/ q6 Y5 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! o( p& ]. F5 ^/ O1 }6 I* s: h* R
unsigned int count_copy = 0;
3 L9 z3 z3 i3 `2 a
! n+ \7 N- n8 U; }2 u& i# F# \
, j6 g" Q) `5 N% G! ]& D& T
int main()
8 O) `# Q2 n. W' s0 O
{
% i4 k; s* o5 B4 }9 g" V
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 U1 [" w& m; n
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 r5 h, n2 N( A: I2 t
+ |8 K7 z5 Z( k3 E
while(1)
4 U& Y- f% _7 |, L9 W
{
" L: s0 r2 D8 I# ~* n5 D& d
read_MSG_buffer(pshreRAM);
! J% r7 s3 M) m1 i" E- d% @
}
* `, z* e1 [/ C+ C
}
0 a9 Q: D# q" P/ [( e( U% y
4 p# ]8 W- ^5 r; [5 E4 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: ?: o6 j# X, }" p7 J
{
' z1 b7 q( e4 d5 Y4 C* u
RX_MSG_PROTOCOL buf;
; R& s# _7 X7 P! ~3 N- R
# |9 g7 `- \: G& l6 i' e- \. J
buf.a = pshreRAM->a;
* I$ O w* f/ H
buf.b = pshreRAM->b;
1 N; ^4 a1 C% r. l1 V
buf.packet_cout = pshreRAM->packet_cout;
( \. T& b- a a; G: {" q
& F4 v( \- `, s& M0 ?& N& C
if(buf.packet_cout != count_copy)
$ |+ P+ I- W! r/ q B4 w4 b k$ I
{
5 W6 Z+ x) V P/ ]
printf("a is %d\n", buf.a);
6 c# R% D3 M0 j: x e& G
printf("b is %d\n", buf.b);
2 h1 U* | ] o/ R+ R+ ^
printf("count is %d\n", buf.packet_cout);
5 X9 i, h! @; B: f. N' b
count_copy = buf.packet_cout;
; n3 z, x7 n1 i( Y8 W9 y
}
* k g4 x9 U: e9 w" y0 m
else
W7 d! x/ s! O; r
{
* a9 H1 e6 v, `. d; t3 r0 s# K7 j
printf("No effective message!");
& v4 P$ Y* M" g- g7 A9 Y% H
}
$ _4 H5 v2 j+ ]& y, f! a
}
4 Y% e1 ~' T2 x- F+ R
% C# N3 t* j* I7 Y$ _2 _2 F- s
K4 Q8 |: [$ D& R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 @. r% Q5 ?1 ~, x0 ?
使用下面代码,对内存使用了mmap函数后:
# @ Z* H* Y, n( [# E2 |
#include <stdio.h>
4 X% S* H2 \+ [1 D( A Y- e" C5 w; m
#include <unistd.h>
# \$ A7 j) `6 g9 f4 {- J
#include <sys/mman.h>
: q7 [+ ^' G6 c3 h3 G0 I& `
#include <sys/types.h>
7 U+ \4 \- |% E# V; I# y
#include <fcntl.h>
. _3 J9 r/ l; D) T3 h7 G! A
z$ g8 d/ T r& A6 i9 h
#define SHAER_RAM_BASE_ADDR (0x80000000)
. Y- R- h5 S J x8 e, _- s. k
#define SHAER_RAM_SIZE (0x20000)
& E- L/ e6 c7 L. J' f' }
1 E/ l8 T; k( z9 j1 u0 k
typedef struct
) L# K$ G5 L1 {$ Q
{
' C }0 U8 O) b* V# K8 |- o1 o) N
unsigned int a;
' E6 _" ], F B4 m
unsigned int b;
. z, e6 r2 o, E7 r1 Y- q
unsigned int packet_cout;
/ s$ O3 ~6 N! V" R2 F2 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 \0 L* y# N! q" M8 T
0 P( D7 l3 _& V1 f
void read_MSG_buffer(int *baseaddr);
. Z8 b& |2 _2 }2 A, R. u7 h$ \
unsigned int count_copy = 0;
3 v% x B) T3 l. C, _$ m% U* @# Z
1 H8 W# c5 |) i0 R$ C- ? p& d
int main()
l u; K( A) S. ^& k
{
4 L3 v% o8 n4 p* L. I
int fd;
5 @6 M' x Y% w3 g/ ? y
int *mem = NULL;
9 z" G0 k% P& {( r8 [
1 {5 a6 Y4 @4 L2 A" g3 w) \
if((fd = open("/dev/mem", O_RDWR)) <0)
# s9 U; ]& t, R* i! e
{
4 ~. G# j; f. ^
perror("open error");
3 ]: p8 X" ?* s$ b. n
return -1;
4 ^3 G. F2 ~/ u& E' f4 s s: \
}
+ g8 A0 \7 d9 X8 W
4 f2 X; V8 t9 y% h0 t8 S1 r/ J% t' m0 ~
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( `0 N) X( o! R: M( `( D2 h6 k
' Q5 F# k2 @0 G0 [
while(1)
1 D# Q' z0 C8 `1 B
{
/ X0 ?' r7 T& j9 y- ]
read_MSG_buffer(mem);
, B% J8 |$ \; O
}
" ~ q2 u$ p/ u
}
, K! d5 l5 ~1 P, r3 g
X" T" i* \; i5 r" R9 \
void read_MSG_buffer(int *baseaddr)
, H5 M' t& ]. W5 A4 @
{
7 t$ V) v# G2 `! X2 F7 F) R
pRX_MSG_PROTOCOL pshreRAM = NULL;
; X7 j2 k7 C; W2 g( V7 Z$ w
1 C* G( j/ D" g+ ^+ a
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. o/ D- u6 J, c% A, t
3 r' {3 h1 E# \' M" N' M5 M; p
if(pshreRAM->packet_cout != count_copy)
7 \# |3 m' _1 ]8 W& u
{
! k- u/ J9 |6 x% ]
printf("a is %d\n", pshreRAM->a);
! b; Z+ i" T4 h9 w% x* }' g
printf("b is %d\n", pshreRAM->b);
0 ^5 w+ l8 u. I2 e9 T) j
printf("count is %d\n", pshreRAM->packet_cout);
: u. S% Z( T; z/ C! }( [4 T
count_copy = pshreRAM->packet_cout;
* q+ y8 N' k- g* f) K. b
}
( L) E/ D1 l' p/ A6 P8 U7 e
else
3 `, T! ^5 B( E- ~
{
t6 c6 f5 o/ x
printf("No effective message!\n");
: _% s3 I9 n% D1 K5 ^
}
) Y6 f) N) g H; x2 Y4 j- s
}
0 r! L0 \- D9 I& F% }
# \6 N7 E4 P3 B% D5 L( Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ t6 V% W$ ^$ Y F/ I6 U
' @4 d1 r f7 |+ j5 M
2 k) ?, r: j4 D$ ^
' c! x. A& Q4 x8 L* }! S+ \" O5 }
+ d+ i* c7 l; H2 {9 [# ~$ k
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4