嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 t X% y: |7 G; I) z9 R4 H/ I. a
1 \) k' Z8 }6 }) W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( I; e1 O: P+ h0 A1 n/ W) v- l$ D
#include <unistd.h>
) O6 L+ @, S4 C1 W0 Y% S
#include <sys/mman.h>
. X0 c, \4 W& D+ X0 }
#include <sys/types.h>
/ ^" i8 s1 M# G$ |( H
#include <fcntl.h>
! d% q) k& c4 p1 O
# o$ e2 @: u4 @( T. ~& [6 l
#define SHAER_RAM_BASE_ADDR (0x80000000)
# [7 H a, h( b! q: s5 J y% E
8 `9 ~8 s& }9 A R0 t$ ?/ G: P
typedef struct
- U: s% X; c) _" A
{
+ B9 ^' C6 I4 M( ]$ V( ^( ~
unsigned int a;
6 {3 T- B3 H* T- [4 p; o) t7 C
unsigned int b;
0 u& h2 D J9 P2 @. X
unsigned int packet_cout;
2 t2 y7 Q% ?# l3 l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
R/ A- r9 e$ J6 s2 Z3 h* a
8 d" L, ^+ O+ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 w# J( ?4 m4 j6 Y* @! J- ~3 z
unsigned int count_copy = 0;
- N {5 l2 n' o; i: p
7 J# `7 |$ y# b
3 L# _4 B2 l% `* _8 y- d& ]
int main()
# |) s I2 l1 z
{
6 O6 b4 f- k! d$ u9 ~$ S) R
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 J- P+ P8 @* _& ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 O/ |6 |. d E0 I
( n n6 u2 w9 g+ E {) R
while(1)
3 ~! q9 [* o& |- a' r
{
4 L9 l; ?9 x2 u
read_MSG_buffer(pshreRAM);
3 K6 l5 w! K/ R3 Q/ T& }
}
+ ]4 ^. I2 {+ F% p% r" f0 i
}
3 k6 f7 k( j* ]; b+ d
- i [7 `2 {& O( Y2 g3 @! b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# |/ Q! T; U8 J2 r% R3 W8 Y5 m
{
1 {7 F; ~7 c# N. U+ E% f' y
RX_MSG_PROTOCOL buf;
: ~- V& ~' l; v- ~" i
( M, N% Q( w$ p2 g
buf.a = pshreRAM->a;
8 M* x4 \8 Z1 e8 u P5 q. L- c
buf.b = pshreRAM->b;
5 Y1 L; y6 W; |: P! I; C' k# Z" Y
buf.packet_cout = pshreRAM->packet_cout;
5 @% x6 v( n! S4 c* x
, [5 H/ ?& x3 k0 P) C8 `+ [
if(buf.packet_cout != count_copy)
& z% t- O! x- b4 {
{
% u7 w. ~; g$ I3 K! w( H
printf("a is %d\n", buf.a);
# q) z1 \4 ?- a% O$ ?
printf("b is %d\n", buf.b);
3 Q( Q8 ] y6 N
printf("count is %d\n", buf.packet_cout);
4 t0 n* c( @4 v+ |3 y
count_copy = buf.packet_cout;
5 L! U3 d4 f" Q7 H. Q0 J
}
8 B6 _% g: o* ?: ^2 J" M2 L
else
# s8 S, r+ c3 y0 l! p7 @( c
{
5 K. D( W! u/ l& T/ Q6 P
printf("No effective message!");
8 S" E, j) \5 j% b) }
}
3 c% @' @# x; C" C
}
# o- O* f T- }. _
- d5 [: \4 J3 E% K
: t- D& u" k7 M- I" v6 P$ w6 H8 |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# W% q( `) O: u( a$ x' v; L
使用下面代码,对内存使用了mmap函数后:
" u$ x% @$ P a' t* p( t
#include <stdio.h>
& u* b7 n4 E: M2 u! v* v
#include <unistd.h>
+ x4 D. p0 x" F* }. F0 V. I
#include <sys/mman.h>
5 o4 X4 G2 v3 Y+ l+ m7 S
#include <sys/types.h>
) X) b0 A# g$ J! [, L' B% z; u+ Z
#include <fcntl.h>
# T& s f$ u) i; l; l
$ e: ]: T* x5 r& k
#define SHAER_RAM_BASE_ADDR (0x80000000)
* a( _7 w9 q2 h9 n# i! e3 u6 G
#define SHAER_RAM_SIZE (0x20000)
0 L H5 q: B' D- A& Q& \
% B5 ~* A; a1 Q" Y
typedef struct
\9 @/ j# x1 ~4 b7 @( G! f6 m5 B
{
% z5 o' i, w. t& L2 {* X
unsigned int a;
) T. \/ i6 E3 l* T
unsigned int b;
7 f# }& n# r5 B! _3 H% Z
unsigned int packet_cout;
- Z7 k5 r8 q) ^, D4 ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 v) P( F" K7 D7 P# a
: C6 v8 X+ Z8 U% ^
void read_MSG_buffer(int *baseaddr);
2 l$ w. `& M" I- A) I
unsigned int count_copy = 0;
2 {; Q, N: q8 r8 n: X2 z
4 h4 J* y1 X# C7 a3 E; S8 T6 v
int main()
- v& \7 r* ^# M
{
' i& p. y2 {, j) D
int fd;
1 s! C: F" y y5 j" P0 Q/ O4 R( r
int *mem = NULL;
" L H L7 T/ e: j8 P. R
1 L+ y+ J) a! S; w
if((fd = open("/dev/mem", O_RDWR)) <0)
6 O' m7 F8 i6 @$ c0 H- R" j; b
{
9 r7 N* `3 M% A3 }( x0 g
perror("open error");
- q5 t! H0 |6 W; B
return -1;
; L+ Z1 C6 @9 z. n
}
! g* X# D" J. @2 V1 ~# |8 a# ~
- S! ]$ M+ y' P
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; p8 Z" D2 H) h, J$ j6 ?
8 R' C5 L& ^/ w+ _& y: |6 V
while(1)
) f" ?- l6 S: ? C- Q; s5 J( k
{
8 S6 H: C' g3 O b
read_MSG_buffer(mem);
- i) G. m2 R; }( }* C
}
! w' ^; W. l2 m
}
. L( F; ?+ K6 k" Z; l5 b2 n
7 ^$ _ ~: p0 {2 `* P# t
void read_MSG_buffer(int *baseaddr)
1 C3 k4 g" p U- i6 L+ |
{
) z4 U3 l+ D8 E7 I1 ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 t- C5 U0 m' v( |# y7 n7 u9 }
; E9 w- @' O, W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 u3 T2 Z. k' Y9 @) \1 m( |
4 |% f, _- [" M, z/ u
if(pshreRAM->packet_cout != count_copy)
% |; l" f' u) O7 l l$ |) h
{
4 j9 h& [3 X. B: u& o, f7 X
printf("a is %d\n", pshreRAM->a);
: t! ]* V, ~0 }, Q! I
printf("b is %d\n", pshreRAM->b);
' T- P" y- H( v9 N" q# A3 X
printf("count is %d\n", pshreRAM->packet_cout);
! I! d" N8 G- \) }$ o0 V5 `
count_copy = pshreRAM->packet_cout;
; T# n$ D5 |) ?2 o! n: |
}
, @2 T2 }) e; `9 x* B( N8 q' p
else
/ I$ ^( r2 g: v0 l: A8 c% L- C" J
{
z7 c+ }# e8 W9 n9 ?
printf("No effective message!\n");
1 G6 z+ A* b# J9 l8 _( [
}
4 `- r; G; Z+ s: z
}
3 Y# i/ u- k% a5 k0 Y
7 \& O+ X2 J' ]3 [* G1 I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ F* Q& ~7 D8 _% n. M
8 E9 \& J$ P Y) v# E
| D1 p" F2 d& ~6 \; j4 ]
3 A; V% ^' r$ _ A/ m `
0 R8 H& S" P; g! t
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4