嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- e& \. }4 y! M& z% V" I3 Z/ \& X
5 f" |) I) o [6 B6 x- N2 w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( d% _: c6 z6 M5 K
#include <unistd.h>
( Y# B& Y' G. R: Z7 m3 ?: ~
#include <sys/mman.h>
3 l) R$ C& c4 J6 n% M4 Y3 S' s
#include <sys/types.h>
, }5 Z+ D! f# n8 b5 V# R
#include <fcntl.h>
$ k7 u6 Y3 c" z
8 G/ u. @* \" K/ x, e5 x3 O8 o
#define SHAER_RAM_BASE_ADDR (0x80000000)
# l9 ^+ C' N7 p/ c
% U7 i& }! N1 S5 x5 P7 W
typedef struct
$ n5 A0 e5 j9 H& D
{
. W; [' N; B' i' _- m- R4 V
unsigned int a;
; p3 @; v/ ^ a, F; H5 ^* M3 C
unsigned int b;
4 l; U. Q/ y; G2 K( q! c7 E
unsigned int packet_cout;
5 P( a% C' ?3 l# Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) }& a, S) r: q$ g% ?9 z# B
* q6 |5 F0 ?, N7 i3 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 y9 J* H) \- W( q2 T
unsigned int count_copy = 0;
$ I& N4 l B/ h' q2 Z M% f1 F
9 H7 `: Y( T' `, ?
0 V' e/ [& z( r9 f
int main()
( |0 ]' t$ ~& {% n6 j
{
: C" r. o5 P6 j8 H/ z9 c& J
pRX_MSG_PROTOCOL pshreRAM = NULL;
; t0 f1 b6 G# J. j+ F& G/ P+ a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 h( z$ \! W, S; x3 n
e' a1 O0 b+ j& ?0 A
while(1)
7 q g, F S# j* f
{
9 b8 A( P$ {# V! F$ M
read_MSG_buffer(pshreRAM);
3 k! l; W# n, Z- M0 K8 k
}
$ j; }. J# ]4 M ]3 T) n
}
) ?' G- O( w: K7 ]
1 g+ a: y$ s( z1 j2 M0 P! M2 [$ i) E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 _' [, w& J7 n/ m& f8 n" f
{
8 Q( w" p8 N6 s t
RX_MSG_PROTOCOL buf;
' J5 `# s& u7 }; _0 B
; K: ~- O% A, s0 f) D: s
buf.a = pshreRAM->a;
8 e2 q+ w7 x: G x d2 H
buf.b = pshreRAM->b;
7 O0 L( ?: [' S& m+ a. X; }
buf.packet_cout = pshreRAM->packet_cout;
0 l4 B$ {1 v8 x
: x5 T' J# e9 p. v4 w! n; }$ C6 U
if(buf.packet_cout != count_copy)
+ a/ r, H: Z" W& J
{
0 d2 c+ w* I7 C8 m+ y7 w4 O
printf("a is %d\n", buf.a);
1 b6 I# P: _9 ?- K# B f) b0 A- t3 B
printf("b is %d\n", buf.b);
0 Y0 h* ]1 @3 s# J
printf("count is %d\n", buf.packet_cout);
; n5 @/ I+ U! q3 B7 i
count_copy = buf.packet_cout;
" y" Z) o1 W( Q, N1 ?4 S
}
0 \, D: B+ M6 Y( Y. V) t* i5 O6 P( ?( ?
else
( @) r) Y g8 Y6 z5 L: j8 H# [7 J+ C
{
6 i6 S" B( Z; O
printf("No effective message!");
9 U; h0 W, b$ H9 l- L( @4 S
}
+ }( q+ [" O0 X$ D1 |9 M: @/ b
}
+ i4 k% j4 G' d2 |4 X( a$ _& W
% T5 s: d8 f' C9 C- f
4 l5 C( V' B/ R9 ~, G% v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! o) q4 m& m# B+ `
使用下面代码,对内存使用了mmap函数后:
8 g8 e9 N6 ~3 r! |
#include <stdio.h>
$ ~* X: L& N. k1 W
#include <unistd.h>
Z$ p* `. X5 y6 w+ k% [% z- ~
#include <sys/mman.h>
/ u, m1 P: t2 h# j7 q2 R9 Q) V! k
#include <sys/types.h>
; b. z, V( u* Q
#include <fcntl.h>
% {6 b N4 ]. l5 i( M1 D, V
: |, z* ~+ N* b$ h8 K3 J
#define SHAER_RAM_BASE_ADDR (0x80000000)
% |# b$ @, U7 p' t/ w
#define SHAER_RAM_SIZE (0x20000)
# N0 Y- h; o# I7 [4 S: D; `
9 \9 ~9 E) e0 T5 J! j" L
typedef struct
: h( x* q$ P2 t9 q* h* U* H9 @
{
4 `# X% T# {2 D- \- X* z- P
unsigned int a;
/ P* ]- V8 b; J6 O+ U" F
unsigned int b;
: U0 J6 \; C+ g# x; \
unsigned int packet_cout;
- I. p* }% [8 n' `; P5 J- r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 Z; W! O2 T. n" p9 ?
' J' ^1 k g3 V: l4 |% U' W* ?
void read_MSG_buffer(int *baseaddr);
# ^6 E3 i' ~, B* d/ h) B2 }( G" g2 C% {
unsigned int count_copy = 0;
7 \$ T( c% R5 @
8 _+ K# g+ q3 Y: K
int main()
1 G: d4 `( `& [/ X! f6 R; G" g
{
$ O; G) G/ H8 W2 n! \$ n
int fd;
3 s0 W8 N; I7 ~5 W! L
int *mem = NULL;
7 m: h+ W D& P. l
- {# f7 {: y) z* s& M( {5 i
if((fd = open("/dev/mem", O_RDWR)) <0)
' q. e; N* ~ R) M
{
. T5 G! J: v% t9 L) C- O
perror("open error");
# U; K4 j. N/ r- G/ {, j( l
return -1;
. s/ v4 ?& p$ T E5 x& d
}
. _5 i6 `, N0 f5 w4 N7 v
' i1 ^% }' K4 n) H& A2 x5 o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 {8 I+ u3 |! W; l- f) J
7 ^8 D4 C$ E; }# o2 {# V2 A
while(1)
4 o+ I/ Z% |; A+ |* _6 Q, W
{
! o+ ]. Q5 w" M `/ \4 v" S' a; g2 a, k7 F
read_MSG_buffer(mem);
# p1 j6 g8 R8 c! G- |/ z
}
8 T- g8 R6 j% {# r1 E1 o; ^* } }
}
, f' H% q0 U* ?8 I+ b4 `: {+ n
. S, k& {0 k! x3 F9 l
void read_MSG_buffer(int *baseaddr)
) M2 B5 G7 }9 Z" ~2 H
{
( C1 M1 N* F3 u
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 b7 b' r' Z, y4 x o) z; q
. }" J9 i( [8 t& A+ h' \ N( P& Q g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- d! S- D0 ^. x+ {9 i n
; ] h! J9 K8 [
if(pshreRAM->packet_cout != count_copy)
3 R9 r5 R$ W" K
{
0 \+ R* M/ E% X# o: N0 W6 u# L5 i
printf("a is %d\n", pshreRAM->a);
/ c4 f( u) b, V$ Q) p7 a- N! d' M
printf("b is %d\n", pshreRAM->b);
, m) M g; p& `; x& H4 z
printf("count is %d\n", pshreRAM->packet_cout);
# v1 m& b* |. s
count_copy = pshreRAM->packet_cout;
& Z; X8 f& ~3 W2 X' z: z: j
}
! D4 f! `- I( q9 e
else
, \/ } Y. s4 o, S2 j
{
2 _, _. V. F; z8 U* ~
printf("No effective message!\n");
% w/ L" d8 p& H8 k3 ~" L
}
. |3 O. a* F5 P3 G
}
) N3 l3 }( x5 d5 N0 K4 [0 f
Q$ {; \1 p5 q% G6 f0 L( G. K" @% P
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' W# B6 `% N# X# H% @7 q: F" ]
8 o- E0 F9 s4 |! b! i: m4 m" E; L [& k
" l" g' t0 g% `/ O" R) c4 |5 u; w
8 z! Z- H, ^; i6 }* w) f, Y
( K# L5 }! W- J' Y+ x& T
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4