嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: [* i0 C+ s' w6 J- Z4 I- d
) p m- ?& H8 e& t& P6 |% @8 {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% K9 J2 R9 F/ z% ?0 L9 s
#include <unistd.h>
K8 G- I2 ]- Q2 f* S; p) d
#include <sys/mman.h>
Y; e5 X% {& z1 V' f3 ?3 H$ b
#include <sys/types.h>
1 p, w( v, ~! q/ x& `* @
#include <fcntl.h>
4 Z( A$ H4 e, v5 A1 z, V2 E( X: A
3 @ l; v, l& Y0 |
#define SHAER_RAM_BASE_ADDR (0x80000000)
# n1 n, D( t$ X% a/ [! E/ y: B
: E+ q) G+ j9 S! i* i, N f
typedef struct
/ x3 M% o% u' N& ~
{
0 [% Z( S, o. B) \$ P2 f3 s
unsigned int a;
" r% g7 d7 f) o( ]4 @% ?1 {9 O
unsigned int b;
g. I& d( A+ B. u
unsigned int packet_cout;
: q$ `* a6 p) f" o1 I( o& d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 X5 _* ~- ^/ l2 p2 D
- ?- V& d: s/ R, c- x$ Z2 N5 Z) L' I! D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 E4 O, a0 [$ H+ R3 q' n$ T! F
unsigned int count_copy = 0;
# {9 A! n6 i. ~
9 u+ P. o4 F4 y' n/ i# W* {
- {; H* a8 V! o
int main()
; `" i5 w( {0 y) P# s( L
{
$ [6 F$ W$ D1 G5 H: r0 c4 X
pRX_MSG_PROTOCOL pshreRAM = NULL;
& _: U" B& |. C/ U
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% L! A4 e! s5 ~
B+ l! _* M" T% k
while(1)
7 @3 }0 w- S1 B9 |3 V- K+ e7 w; b# r3 P6 w
{
0 K. ]& p6 k$ j
read_MSG_buffer(pshreRAM);
8 p* t1 \4 [% y3 u. [; M! m, j1 k/ \
}
* h; ^7 A+ h- A- C" y: ~0 M$ X) g( D
}
) W: u" T+ `' v
* V+ C; o6 M0 D6 B- b" f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' I5 E, ~# O' ^( N' C! l
{
+ [4 _/ p+ m8 l4 {$ ~
RX_MSG_PROTOCOL buf;
6 D/ ^3 ~9 K; j4 x$ `* U, h2 v R
. I' ]$ I7 l# }; l6 J
buf.a = pshreRAM->a;
5 X9 m# P) D: `: }/ u& m
buf.b = pshreRAM->b;
/ k0 D: @1 k: \) `! i) ]# \2 z: N
buf.packet_cout = pshreRAM->packet_cout;
: F- R+ z n" v |
1 J: O( Z+ S$ g- K
if(buf.packet_cout != count_copy)
E, A L; E" E" h I$ Q
{
2 m- P4 m" Q5 e
printf("a is %d\n", buf.a);
9 e# Z: p% K: @
printf("b is %d\n", buf.b);
1 B: s3 \; ~# w! e0 x0 k" N1 L G
printf("count is %d\n", buf.packet_cout);
9 c$ ^ r- Y; j7 F" R- p7 G' }
count_copy = buf.packet_cout;
; `2 ?7 \" I: i! H
}
/ N9 Y1 q# T& l# A6 K F
else
4 F) g2 d4 w" f+ E( f$ v# O/ _, Y
{
2 e! E. R% [ L" s) n8 a
printf("No effective message!");
! X1 i$ r G* h7 Q* k5 B8 B
}
( Q2 \7 V Z* S
}
2 c5 i9 o0 R& g5 ?% W
* a! M5 S. G1 ?2 @
$ ]& e2 t5 d) j0 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, n( {& z. i' k1 s
使用下面代码,对内存使用了mmap函数后:
8 ]: p1 i% H C4 k2 v$ E
#include <stdio.h>
* R6 I$ Z7 y2 S' g8 U' Q6 d; L9 F
#include <unistd.h>
+ p e/ U$ o( c- w$ v) i" }
#include <sys/mman.h>
: G2 k- O3 U& m) U; E
#include <sys/types.h>
6 n" b! b% _# i; |+ D
#include <fcntl.h>
( H& g0 B' H8 [+ n4 N
% Q, g+ v' n3 I" _3 K% q$ L. D
#define SHAER_RAM_BASE_ADDR (0x80000000)
, g) B% X6 Y6 @+ G5 \1 e
#define SHAER_RAM_SIZE (0x20000)
4 r4 }0 {1 z( K' s# N; h
, J2 L, I& A6 c
typedef struct
: K% e. @+ ?- ]$ ~
{
9 s' M" j4 g/ `0 V- p) b! v
unsigned int a;
" x" J; Q* ~7 r. U2 C* x
unsigned int b;
! v- G! B- D: \# n. y8 U
unsigned int packet_cout;
5 v6 F3 l; i- c9 Q: v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; t. @( ]. f1 i
/ c4 C# o& {- @& f" P& p
void read_MSG_buffer(int *baseaddr);
% i5 r: K# d0 y5 i* w
unsigned int count_copy = 0;
. o% _# w1 ^( q* B3 R4 `" N; l
9 V0 \# B3 M+ s/ B/ Q$ E
int main()
9 J+ n5 G' V& p7 k) D. S
{
& } i8 q& H# g5 T
int fd;
Y6 Q. h6 X2 F s1 b
int *mem = NULL;
8 ^# x6 U, E7 x4 X
7 k" q! e+ }0 U0 A
if((fd = open("/dev/mem", O_RDWR)) <0)
: W* o: R7 @4 ]6 p5 O2 Z( m
{
g3 k7 u3 |; m) G f- f
perror("open error");
# u- u; @3 ~* v& X _& g
return -1;
/ B# ?0 q2 R: @& V) x8 B# q; K
}
. x: W# A3 Z; o" c/ H& L* R
# a! g/ F6 o, S' \% A$ ^/ I$ Q% O
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ S4 y7 g; f8 }# Y% l
6 K S a+ Q) N k9 L" O
while(1)
& Z: q3 j7 A/ C9 j4 m, E, D
{
) k7 q, X7 D7 A$ }) @' r
read_MSG_buffer(mem);
/ Q) ~/ K1 n0 r! a3 \1 T, r
}
! F8 Y0 c' r; P5 c- h
}
% y. G; _" u. V" l, k! R
' G. B5 F, {) Y/ @2 f5 l0 f$ l" x
void read_MSG_buffer(int *baseaddr)
2 S. b( Z ~9 Q+ h3 T
{
% s$ b. M* o: T" K! g3 ]7 x
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 P/ j2 U, e7 q3 Z: S& d0 H
- O* I) P$ i% W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 W! x- h F/ S
b$ D& F' J& ^' b) a
if(pshreRAM->packet_cout != count_copy)
2 ` I- W3 _3 [7 E1 T
{
; A) f- L! w/ |+ M- {" f
printf("a is %d\n", pshreRAM->a);
* B; o+ J$ B, R$ I# g. d
printf("b is %d\n", pshreRAM->b);
5 p* }1 B& Q; r
printf("count is %d\n", pshreRAM->packet_cout);
- H9 O9 o+ {" |4 Y8 i5 ?
count_copy = pshreRAM->packet_cout;
Y+ W/ d/ s+ A1 K% d3 d
}
9 }0 E: V O4 ?
else
" J& a5 r& K7 _9 G+ `% S
{
( w' e$ S3 L5 O! i. q
printf("No effective message!\n");
" h1 E$ J' M1 k* M8 ?
}
7 V3 K( f+ N" C( }1 X9 D9 i
}
7 b, R& Q) z7 \, E
% z; I6 }5 ` |8 g2 h, h$ D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 w& x( W) G8 j# b Y3 f
* O# v. p% c- Q4 {7 v% }
3 o& Y t7 ]4 E* S5 q% [
' Y0 ~9 {# o5 U6 G2 C
" j7 b# ]7 P$ _" @8 g
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4