嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% C9 `+ _* z# }2 o
9 _0 i/ ^) F9 F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 a! B& y- a3 r# `" M/ Y' _; i% L6 e
#include <unistd.h>
$ t/ [$ G6 b0 K ]! f$ V; F3 W
#include <sys/mman.h>
4 B9 P. N; c# I9 J
#include <sys/types.h>
6 \% L3 X$ m' f- _/ `5 r
#include <fcntl.h>
. M8 F/ M, N2 Y- m4 M: E' d8 W
/ F+ _5 S% H& j3 L+ n
#define SHAER_RAM_BASE_ADDR (0x80000000)
. ^, \7 j& Y' u( @0 P* \. W2 A l1 m" P
9 P1 Q/ x: o$ s6 b! O% d6 w) D( q
typedef struct
) J; f r% A: r/ n- X8 O
{
5 l$ ]; V# X" G( L! Z E. ]5 B" U& w
unsigned int a;
0 m+ j( h0 X, u
unsigned int b;
. q+ r! r# W/ }2 S
unsigned int packet_cout;
: n+ Y6 j0 @% Z0 s* c2 d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
x3 Q3 g; p& [' _$ z
, v9 Y2 s* k4 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 E6 a2 X5 J- s' ~/ P* M0 K- r
unsigned int count_copy = 0;
/ w7 b- U: F% u+ u: }2 J
: Z% u) e- Q* `& z
! k5 }& i- x, j1 j
int main()
9 L: b3 g) W0 i# \1 O1 w4 ^
{
) }6 U' f4 e3 l7 {" ^( N" r6 M
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 h" E! i: f8 K# C5 q0 X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- Q, Y) S$ F1 x2 L1 s
# N6 v+ q" R* d# |# X" R
while(1)
* H9 s" ] O& N( e$ s3 [0 W
{
; x& C1 [( M1 r/ F8 M' N
read_MSG_buffer(pshreRAM);
% [, t( W. R, w5 [1 H0 ^
}
$ s5 ^& s: N% ]/ W. T; T, C$ K
}
/ d7 z+ n4 k' W. S2 |
, ]& E% U4 p; U: d# g# ~$ r2 i1 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( |. p: u+ m- B6 p" S J, K8 T. p
{
7 Y) h3 G6 V6 q n! u
RX_MSG_PROTOCOL buf;
y) P, K+ w& S
: r3 M$ g! k* B$ {' R4 q
buf.a = pshreRAM->a;
. ]5 B! t% g0 E& L/ n# n. \
buf.b = pshreRAM->b;
" W c9 N1 }! |1 c+ T1 t8 a* l
buf.packet_cout = pshreRAM->packet_cout;
3 U# t. z, |1 p+ y
; f7 o2 S& T9 T7 f( s
if(buf.packet_cout != count_copy)
1 x) `3 ?' u- ~ g
{
- |6 x' q0 l* V8 b2 L
printf("a is %d\n", buf.a);
* J. d, Z; ^4 l* W) U& e
printf("b is %d\n", buf.b);
; u- l; W* z) g$ g
printf("count is %d\n", buf.packet_cout);
+ p& R3 v0 q7 G1 ~" a8 f
count_copy = buf.packet_cout;
& Z* j( g3 `+ a& V# ~
}
1 l3 Z& Z# v) b# _8 A1 w0 i
else
0 Z9 y! z9 Y; F8 C$ q$ L: H; f2 V
{
$ F/ f6 K5 q" ]/ q7 r1 z3 s
printf("No effective message!");
& H) j* F: H% M8 T- @# Z* H
}
. b) O l' d. H' `1 `; f3 N* a& W
}
- ~; H9 g1 Q, u. @5 H7 T5 b* @
! T; {5 k2 @( [) n# O3 q; s/ ~+ e, q
9 N1 j7 L3 O# F x0 ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& K6 G9 ?( h: A- B) c1 B
使用下面代码,对内存使用了mmap函数后:
* U. D# `% U4 w# _; K3 C
#include <stdio.h>
2 e3 U3 t0 A* D+ P8 O2 H: L
#include <unistd.h>
! g0 B. x r2 q/ E! T% U. H2 i
#include <sys/mman.h>
( ~5 c1 d/ Z( u% @; M; B- n
#include <sys/types.h>
1 p' I0 v+ W+ I/ D7 {
#include <fcntl.h>
/ \1 }8 R5 y4 _4 j, g3 `$ a; a
K- Z2 c3 n$ ]( ^" ~+ q8 z! l
#define SHAER_RAM_BASE_ADDR (0x80000000)
% S; `: I% r7 Q$ L& R
#define SHAER_RAM_SIZE (0x20000)
+ H2 z$ `; u' [/ O" S* |
# a4 W0 n. l2 V# h* U, }
typedef struct
! K) T! C7 w& O$ m4 o
{
- G7 N6 w& N& g7 P8 }1 t
unsigned int a;
8 z! R* H1 `) W' U0 k
unsigned int b;
9 v) h% e: @* H, S( L* ^
unsigned int packet_cout;
, D9 S( w! y9 x# K3 T4 `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( \0 i2 y8 a; N3 s3 c
" O m2 U$ x, T9 s$ z5 z- J
void read_MSG_buffer(int *baseaddr);
. V) L* G0 L- M2 ~ W( n6 t( C* V
unsigned int count_copy = 0;
& X8 Y$ f6 \, X1 J; t
& P i6 U4 T' n' W ^+ R
int main()
& W! L+ E3 m: ?& I! T+ i: p& P
{
# Q k" {$ p C2 Z2 c) L; e
int fd;
0 o0 n: S- D) _- V9 y4 Z+ d4 H
int *mem = NULL;
& ]+ K/ m% j0 D1 Q0 }
* ] [( y. U1 |4 b; P* k' P
if((fd = open("/dev/mem", O_RDWR)) <0)
$ M/ ` m; A* X6 {5 V0 s
{
: X' `1 W4 [4 j1 Q
perror("open error");
9 V& Z' w$ ~& H, j$ [
return -1;
( |3 @1 s2 i3 F2 H$ w& @
}
# c% Q7 U. s O& o$ {5 [9 C
( I" b* ?) l) y) }
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, |/ `; k! E+ F& G, O* X" m$ m( c
' H) o) |" a* t6 e* n* j
while(1)
; y2 F) C' L# _
{
+ E/ I8 q3 g% O) q5 e3 V
read_MSG_buffer(mem);
2 F' O! Q; ]. W% L6 M) a* H, @
}
2 n/ g1 {; L7 c3 p, n
}
& q. u2 u5 l0 C4 q% [
& u! n% o% r% h# J
void read_MSG_buffer(int *baseaddr)
2 z+ `' B s& w! s3 h
{
& Z' s6 l, W, t
pRX_MSG_PROTOCOL pshreRAM = NULL;
; T6 q+ a$ k* o( }' l. e" W* h
: X. Y# v$ f1 F% `+ |: j
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& Z2 _5 t0 H! ~0 z
( q9 L4 I2 L# C. ]' r5 c8 X2 `
if(pshreRAM->packet_cout != count_copy)
. {1 z, }* F9 T+ n% z* [) }
{
2 n6 \+ {1 l5 H, S
printf("a is %d\n", pshreRAM->a);
" \! i( j7 h K+ E; D! H: g/ E2 p
printf("b is %d\n", pshreRAM->b);
, B" N4 g/ c% Z6 N! G, i
printf("count is %d\n", pshreRAM->packet_cout);
& r1 x% o8 w2 e5 D% U8 s* f! {
count_copy = pshreRAM->packet_cout;
8 M; S9 X% K3 k2 y
}
2 T$ t5 B# O2 m% J! P1 S7 ~' t% Y
else
; Q6 f, z/ p4 d
{
5 A1 R% g6 S% w- ?0 e% ~$ Q2 a7 h# M
printf("No effective message!\n");
6 o/ U: Y! x) Y( ^% L! g/ p
}
S3 b- t" D; `3 F8 _& z
}
2 Q; T3 z3 u& t6 c4 G: ]9 z
' I9 E$ {4 z0 L' h5 C/ T) E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* N4 S9 U8 D( W" u: y' D
) c. N6 P" O8 y& _
8 j2 z) n6 Q; l: s* D
& J3 B! k4 _8 E
- C# K7 e. P+ d! `
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4