嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) X+ S2 ?7 U- B. P a
4 C+ b7 U" k3 n, M, g) G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. w' S" Q! w; ~' W' `! x6 s
#include <unistd.h>
) a& m- q; R- j5 d- O" K) W# x
#include <sys/mman.h>
" o, o6 z6 d6 }, d- f. N; f+ r
#include <sys/types.h>
$ N' I; X9 D3 n: p- G
#include <fcntl.h>
6 \1 ~5 [9 o+ k, O! B
6 Q r' ~+ I# o1 P
#define SHAER_RAM_BASE_ADDR (0x80000000)
' @. Q3 Z$ z% d1 f" a- W: r& N
/ |& |" G7 | R/ v7 `+ R! c( U
typedef struct
" ` r! W* l$ f" L8 T9 v1 r
{
) d, ^+ S+ E r6 j
unsigned int a;
, R8 e6 O, K; _$ T# O0 U- ^
unsigned int b;
3 e! R: ^7 Y- d- J4 \5 y8 s
unsigned int packet_cout;
$ }; }1 j* M) M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- m* y! M% Q% W, E5 x
. b) h- D7 t, f( Q' J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% R4 s3 r1 t5 z) t
unsigned int count_copy = 0;
8 F0 I8 O* I8 v9 W6 E3 g& ~0 B
; Y% Q* Q4 d' y* O
" r4 Y' O/ Z; H
int main()
* z& I- A' v2 X" \* [* O: a7 }
{
, V* i" W, L) q& Q7 N
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ h9 F& P! u" d! K; V% O8 O* z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& C* c% |+ Q. _2 V# i# h6 X
1 q+ X; R3 q& x
while(1)
% ?. t# d! P( n/ s1 [
{
6 ?8 k1 u6 W- Y8 z6 g7 s9 L/ H6 N/ Q
read_MSG_buffer(pshreRAM);
- j- p1 ?) n3 t3 d/ p
}
5 K4 W2 I$ S+ ~3 o3 d0 H
}
" W, x, w5 R7 Y
% H; X" f0 h; D& A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- k. m* Z5 p# V% h
{
8 t" a( |3 m1 q* }
RX_MSG_PROTOCOL buf;
( [' U) v E V
: @) u" B) S2 B2 G
buf.a = pshreRAM->a;
) O$ D; v r# e8 b. t( s
buf.b = pshreRAM->b;
! Q1 u5 o: K% y* a2 E
buf.packet_cout = pshreRAM->packet_cout;
, L) Z D' }/ ^+ \0 }4 ?9 t
4 V" G* c5 u! G, N" O
if(buf.packet_cout != count_copy)
- y: o# R# r( A3 h; b
{
: v0 P/ R# S, E9 v4 h
printf("a is %d\n", buf.a);
& H. [! ~( m# V# }& R
printf("b is %d\n", buf.b);
! Q" H% |/ I# o z! e
printf("count is %d\n", buf.packet_cout);
7 p$ \; D4 m1 L, u X% v8 A
count_copy = buf.packet_cout;
8 o; G% `" O D1 H4 U9 y
}
7 d/ x, @ @% U) J2 }5 `
else
6 Y& k$ ]5 k' G w% P! z, Y
{
" I3 u5 {5 k! ?6 |& g! o
printf("No effective message!");
1 R7 k( H0 r8 z& i
}
4 Z+ F4 s) _9 W, S+ N
}
# t0 Y, n1 w: M" o6 F0 e
2 q) z# A5 c! ^7 K1 K# s" x* B
' A9 ]) Y! i: o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 `; e5 ]/ C B: L3 ~+ @! r2 e
使用下面代码,对内存使用了mmap函数后:
* {: |5 \+ R" f+ V+ a
#include <stdio.h>
3 l1 I) ]5 ]) a w
#include <unistd.h>
. d( U3 Q! o2 h- A
#include <sys/mman.h>
! z* e4 K7 N% n& ~) J
#include <sys/types.h>
! M& G8 l ?- \6 B3 Y
#include <fcntl.h>
: |- g4 J0 Y" ^
. x T& w4 ~, e, |
#define SHAER_RAM_BASE_ADDR (0x80000000)
% H3 |( E" _+ k1 ? v
#define SHAER_RAM_SIZE (0x20000)
7 l8 g# Y7 v( J2 d; F0 i+ M0 C% q
8 O. `: m' P+ b- m1 \2 _1 n
typedef struct
! C2 \& b- y% e" f4 n
{
* I" K' \! t, x3 `* z/ I7 u
unsigned int a;
: l* h$ v1 ^+ p0 l' d
unsigned int b;
) N, P }! N% h
unsigned int packet_cout;
8 A9 o% O. H! ^4 a& u5 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) a# _% |# k3 W
# r8 F) o5 b+ E2 J# u: h# v
void read_MSG_buffer(int *baseaddr);
' J) g3 u4 y. j9 Y( z
unsigned int count_copy = 0;
8 |0 f: m. j! A8 m& r |$ m
5 K( k/ r- F: y( d: p; m% S3 o d
int main()
+ F$ |7 {0 M: d+ r4 K
{
% {$ u. n" D$ g
int fd;
% O6 H; I4 G5 G) O; F8 h8 K* z& w
int *mem = NULL;
4 m1 U0 R! N) C. R. _
- v" n6 {1 N* N# j0 y' @
if((fd = open("/dev/mem", O_RDWR)) <0)
; P1 O) R9 A5 T
{
& M9 i/ s- V- K$ t
perror("open error");
# b: e1 ]- W& z! d0 J, O' K/ j
return -1;
6 b0 i+ s- \: j4 c7 i2 @' x: Y
}
' \8 Z1 A" ~6 \. ?2 v9 R
$ j6 ~4 o, r* \ X. f$ p. v; Z+ E( @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 P, {+ t( y" f7 a1 e, o! r
# I0 j" v9 ~- q
while(1)
. A5 L) b( [' x& I9 ?
{
& W0 @+ }* a6 y% }
read_MSG_buffer(mem);
% ^( ~5 ]- J& V9 t
}
9 H7 S( K. `) P, L% G6 Q6 ]3 m
}
: C: r. h' d! `& {, ^1 k- K
# D4 j+ g/ x8 k# d* n$ p+ N$ Z2 Z$ p
void read_MSG_buffer(int *baseaddr)
$ B5 Y* |! i# U" v
{
3 B4 y0 ^. _: T6 E! X* X8 j
pRX_MSG_PROTOCOL pshreRAM = NULL;
' ?7 ~; L" J- {0 Z9 S- f" N. S: X5 G
" e8 F, v% e: }2 q) G+ i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% [! i# B% I5 Q6 ]3 C: ~
/ f) u4 z4 x( `
if(pshreRAM->packet_cout != count_copy)
|3 {5 R/ i1 C
{
: z% @6 P% r1 r3 I: @
printf("a is %d\n", pshreRAM->a);
! T K% D+ u7 R! o5 S# E: J1 [
printf("b is %d\n", pshreRAM->b);
9 \7 j( u& C7 G' k1 Z1 z
printf("count is %d\n", pshreRAM->packet_cout);
: r q" D! G0 T9 l
count_copy = pshreRAM->packet_cout;
1 T) }3 G3 h7 m0 G3 g B& t
}
% {7 ]% T' f/ P) o3 o8 f
else
/ O1 t8 d" X8 K! k! H+ v f
{
$ n0 p! m# k1 r( m; S+ m7 r
printf("No effective message!\n");
% n# V6 J7 D7 ]
}
/ _, k4 c# c% v0 ?
}
0 o, ~' j) p1 g: v3 C) F
6 m6 R* y/ s/ A- v6 I6 d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 U4 Z0 o5 Z" M9 P6 w
% [$ S/ k/ E$ \) L0 g
* a* B9 Z `; f3 V( O
& b9 L [' X) M0 ~/ ]" X# A6 |
' O9 a! H+ q. H% R. y, m' J
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4