嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* k( H! i$ s- o3 `$ p2 T. x
! u* u' T5 {& G; w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 N. D+ f% k+ K# p' `: d
#include <unistd.h>
, X" H; C3 n( i4 C u- i4 E- j
#include <sys/mman.h>
; x' p' i2 u/ h0 ~0 ], F3 `
#include <sys/types.h>
! s7 d& Y$ V* F0 t4 u
#include <fcntl.h>
. l/ M6 V/ \4 q& k
3 n& [/ @) r) w$ |" Y. k
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 @$ o+ w3 H/ D: _. X0 [
2 G6 ?+ y, A( y5 @7 e/ R
typedef struct
5 F/ C- A1 k! e
{
, K7 u' V5 Z+ @) d2 G/ a% j
unsigned int a;
+ r$ \$ D* [$ f$ n
unsigned int b;
3 B3 H* a) Z% F& C7 F
unsigned int packet_cout;
; ?( ?9 {: q* v4 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 g: a1 ?+ m4 y7 Q j# y
% C4 V M! w2 a' @0 X3 l# }0 E" M+ x' [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 C; x0 v2 ]0 s
unsigned int count_copy = 0;
! y# s# o# U( P7 R
+ c% J5 ^& E7 N
$ k8 H4 g% F: c
int main()
" ~3 T: C# u- q) R& F. Z
{
" E3 Y6 L7 X# h! ~9 o
pRX_MSG_PROTOCOL pshreRAM = NULL;
, q! Y' P8 B3 V" \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% O: \, [% I I' j0 F2 L9 d0 g
1 i! h9 s0 W5 |
while(1)
( I$ D; l* T0 H$ Z) u- G
{
, p& I( j# F' l
read_MSG_buffer(pshreRAM);
; f7 B8 i0 T( @5 L
}
" s9 C4 H1 [7 A4 W) \" E o$ o
}
/ u5 E& L) Y9 h; d, {. z
7 ?9 g2 e! M3 D$ N( P. q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% z1 d7 O/ @7 y! i( l$ Q
{
h7 j/ F* q8 g6 V6 _+ K
RX_MSG_PROTOCOL buf;
- M3 T2 A0 s$ {/ O. g4 O' m
B( @ A; }% f. h6 s4 a
buf.a = pshreRAM->a;
) n8 e% A# ~$ y f1 C( G
buf.b = pshreRAM->b;
, r9 R3 ^/ c- e* z
buf.packet_cout = pshreRAM->packet_cout;
+ B4 Z0 N; t# U' N7 Y7 K" {
G+ L9 T+ T" z
if(buf.packet_cout != count_copy)
; I% d2 l0 r. g8 K$ u
{
) j& q6 c- p" S+ m
printf("a is %d\n", buf.a);
. u# c+ F+ g# w5 p& X/ a
printf("b is %d\n", buf.b);
- l( U8 j4 ` P6 J# g2 N# }
printf("count is %d\n", buf.packet_cout);
4 v) L4 u/ @3 G+ S
count_copy = buf.packet_cout;
6 w# d# T/ _ o& o
}
7 ^5 Q. k6 g A! }0 d
else
; x0 x' C5 f6 s: G8 O# }; |
{
. @& r1 w7 k X7 u/ C5 K
printf("No effective message!");
" i$ m* F; l$ L8 x2 ?) o
}
; y- D3 y! m* q; R
}
9 P# N- ]) V* @; B" J# E
% Q" t- ^5 H2 \& N) m' X
+ y4 j" a* B" S0 D( j% V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' {' y% N9 M( f& j7 Y2 X( C
使用下面代码,对内存使用了mmap函数后:
, T- U; w' M) u1 T: N" j2 j2 r
#include <stdio.h>
3 }5 m% a9 _9 w+ s( t; B) N
#include <unistd.h>
" h6 J. _9 M& u+ g# Y0 i0 Z
#include <sys/mman.h>
" [/ j1 S+ k2 w
#include <sys/types.h>
8 U0 U* T( Q: v
#include <fcntl.h>
5 w$ p* L1 @* o" z- W, q- q" P" |
j! A/ s( W6 Z1 M
#define SHAER_RAM_BASE_ADDR (0x80000000)
! D0 j2 B, ?. B. v
#define SHAER_RAM_SIZE (0x20000)
( n3 L4 D- M! ~5 A" s
8 y# ?( Y! l3 j4 n( E) h
typedef struct
' d! m# E; q% x7 P
{
* x( k/ z0 w6 m
unsigned int a;
( n' x7 k7 }* ]9 b9 f
unsigned int b;
, O) O) V' P$ F k; z+ x
unsigned int packet_cout;
5 }2 C; D- o! [" ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 }9 M2 C, x! {- ~% C
9 o) t9 {1 h) C- U1 G
void read_MSG_buffer(int *baseaddr);
, u# }! I: ?# @
unsigned int count_copy = 0;
; D! R j6 R; s/ a
$ S6 F( l+ {, }
int main()
/ A2 _) h0 K* q3 N
{
2 w" B. G! @6 p+ I: r+ V& ~
int fd;
; d# \; `. }/ ?0 K7 c5 [) O
int *mem = NULL;
' T2 Q8 \- R8 X6 E5 r( c: ]
$ H3 t2 Y4 k- A9 l" x0 c. i
if((fd = open("/dev/mem", O_RDWR)) <0)
- S' i7 X2 U* I5 q
{
M1 f% [+ w: X
perror("open error");
2 |8 W. x; N: P8 @& ^- f
return -1;
) n9 F- c$ `3 ] n. F% @) E" H
}
# }' f" D0 g, }) ~$ [# T
/ k) C: s0 o) i4 W% `4 N6 j O4 w
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, V# X7 y* g+ y H, @4 W- X ?
( @1 A7 ^+ p' \% k" M/ D
while(1)
$ ^* ~4 F: ]$ |' P, C+ l& ~
{
) |/ ^( v: D+ x+ `; o& [
read_MSG_buffer(mem);
7 n/ g2 }% l% g- C
}
& _& V! U: v: L2 h: @5 h
}
0 A( |& \5 z( l, x, g+ Z0 i
% _9 K* n3 J# z. @, X
void read_MSG_buffer(int *baseaddr)
- J1 b" T( x8 {3 V' L' O# l5 X+ G
{
7 c9 ?* M7 }8 v
pRX_MSG_PROTOCOL pshreRAM = NULL;
# D! n I! r# z& n+ E
% d; n n" j5 V: P+ j& x
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( i; j' s6 s$ n; n4 V
$ M2 O; t' ` s5 \4 }* q
if(pshreRAM->packet_cout != count_copy)
* C/ ?; @' H' @' G: F
{
, q/ q8 h0 }2 T! Q
printf("a is %d\n", pshreRAM->a);
3 x0 d2 P2 U9 q
printf("b is %d\n", pshreRAM->b);
; x8 w2 ^0 ~2 Y% t* N0 p& p
printf("count is %d\n", pshreRAM->packet_cout);
& X% I" p z; T% A# i
count_copy = pshreRAM->packet_cout;
( q& a! j2 B( a8 l4 D( U5 ]4 X
}
+ v) v& N7 `, ~4 a* ^# s
else
6 }# t9 j+ o, Q! G) o4 N
{
) h. H7 C J% A5 h7 H
printf("No effective message!\n");
- ]1 Q: ]- ]) T7 J! \
}
: V( X4 Q; b$ Y* |1 O5 f7 r4 a
}
0 ]7 K% D5 O+ [
G# \2 w% c; M; o: a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 q3 R' G+ D/ p3 ^& X& F0 Q
0 M0 y2 A% C/ P4 C' _
/ g3 [9 V0 q6 A4 P+ ]
0 e% M# e6 [1 x
% d; \5 O) v! L I) S
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4