嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 [$ E/ f% B/ o+ H* l8 j" D; V
2 a& R0 i6 b, g$ B# R/ Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 @+ A' a0 ?! @4 ~2 e& h9 T
#include <unistd.h>
7 O- b* ^) b6 o0 Z+ q, s
#include <sys/mman.h>
: _2 h+ S/ b/ a b( i
#include <sys/types.h>
. E+ A& f$ B9 ^. Q( N2 M9 U0 ^
#include <fcntl.h>
5 b1 J. z; d. F4 U
Q5 v# U2 |1 Y4 \$ w2 J
#define SHAER_RAM_BASE_ADDR (0x80000000)
* m/ ?) d. [' K* H1 o" n
9 `+ O* P$ ]9 v, R Z9 x+ \1 L
typedef struct
& K; l: u" J5 Y# c
{
1 Q3 Y& x6 g' \! ^5 s6 Y
unsigned int a;
& }, ~0 Z' y6 i3 H5 U
unsigned int b;
9 {. y, w! O3 V" i
unsigned int packet_cout;
( S4 v+ W6 h3 Q9 f, |8 m: x& X) [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% Y0 p) }0 A% e% T
. F6 k: g+ u; M1 R( x- A1 V( H" w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 u1 W% Q% b; y
unsigned int count_copy = 0;
2 w' t# ^' d8 M, h3 f
5 T1 e( d8 L# z9 K" L
9 V/ d; ?5 R, i
int main()
# D% ^, T7 k# T! X
{
3 C5 B3 K. B; {" f
pRX_MSG_PROTOCOL pshreRAM = NULL;
# I( ? W+ k4 ~! c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% x4 V- ^4 O7 x" l4 N
$ x! Z( P2 U! a$ S9 M# i) w
while(1)
7 {6 h5 r, o- Y5 X5 H5 x
{
- l. J1 h+ Z+ ]/ x
read_MSG_buffer(pshreRAM);
9 y" {! F3 \. \# L6 I. u1 ?7 [) q
}
0 g/ h0 v, q2 p& L/ { Q
}
. G# k$ O3 O% f# _
9 A+ m& a: O }* D& n; s' `, x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
U1 z0 \: j% r0 W* }4 \" L
{
7 e" R9 k) d* w( i
RX_MSG_PROTOCOL buf;
8 K. S3 q q" f
) m( A0 T# |9 _% Q
buf.a = pshreRAM->a;
3 F$ o% Q5 d, g3 N, D$ `
buf.b = pshreRAM->b;
5 L+ u" x& J# [ o. }
buf.packet_cout = pshreRAM->packet_cout;
) E+ t. V, j% R
t* L: Z2 F @& u( t5 m
if(buf.packet_cout != count_copy)
) ]6 D3 b4 }6 ]* ^& d7 }
{
7 H( _2 s( b* H5 ?7 s0 o+ L
printf("a is %d\n", buf.a);
$ Q2 M m5 k- h ?; `; m' R. K- [$ E
printf("b is %d\n", buf.b);
5 s/ o. ?( O: k
printf("count is %d\n", buf.packet_cout);
0 |; S0 G( B' D/ n. d+ p' M
count_copy = buf.packet_cout;
! D$ X0 p2 w: J# Y6 M0 J; r. M$ O
}
3 _# Y; z3 w- s2 n, c1 z) R
else
% {) U2 w( C0 o5 p) r0 C$ m, D' O
{
* v( p- S6 n. z, f6 z$ k
printf("No effective message!");
8 ]! @" P$ d" G. W, r# I, h3 c
}
4 v A! L; E. t; M; j
}
' t9 c8 r$ `4 ]( ` }
* \& [; B2 w) x& b6 x$ ~; S# l, K
) k$ r# S j2 w% u' D6 R: n; q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 P2 _' K) I# Z1 V2 j
使用下面代码,对内存使用了mmap函数后:
x8 T* Z* i* g X6 C" i9 M0 g
#include <stdio.h>
. e+ [4 k7 U) F
#include <unistd.h>
, O" `) z0 `- g+ b) c$ k. g3 Y
#include <sys/mman.h>
% p/ r7 K( s7 w& ~! t) a5 S# C( O
#include <sys/types.h>
+ s5 }) w0 k. b
#include <fcntl.h>
; u) C2 m6 t/ G& y, g% W
" C; {& r7 V) X' b5 X. \! M) K
#define SHAER_RAM_BASE_ADDR (0x80000000)
# w0 n( S+ _7 W+ J4 Y' E
#define SHAER_RAM_SIZE (0x20000)
! G1 |2 u; a+ A. c
$ ~; j2 w0 I% y5 z" R, f: T
typedef struct
! X, ^: J. U) H/ m4 b
{
t5 M; Z8 E. {5 V6 \
unsigned int a;
: @8 J) R2 p. ]( f5 p' N4 }
unsigned int b;
( c' Q, N* Q0 n5 z% m
unsigned int packet_cout;
# X( `& H: J9 f1 @) }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 n! I& O( B) v. C; t- D$ ^
$ ?+ e% I0 Q5 ~' a Y+ l& B2 c$ O
void read_MSG_buffer(int *baseaddr);
' ?* t o j4 I: z& U. ?1 q2 P
unsigned int count_copy = 0;
- O9 W; N r, g* \! @" r8 g
/ E# P% C% u$ n) s
int main()
4 c3 F% R$ e* ?0 W% J$ _, V4 q6 S
{
% g5 T+ H: g' D3 w! V/ S
int fd;
) t" R0 j) X9 d7 {( G
int *mem = NULL;
4 q# a, {# G N8 F$ C/ V
4 e3 W0 X- X7 ^: J: D
if((fd = open("/dev/mem", O_RDWR)) <0)
" ]# [/ a) ^8 ^* _% I2 |9 o h4 U
{
8 Y! ?0 S6 B$ ^, f
perror("open error");
' x9 e( U" Z, K& H2 ?- w
return -1;
; |6 Q& \4 Y3 Z6 A- I0 Q9 u( v
}
+ n. U$ v5 F& [3 E5 D4 h
3 j9 p7 l' Q t0 z2 A3 q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 C s! G0 K1 q& O" O3 W$ u
& l- h3 k6 O- x# V% Y' o+ S& e. h
while(1)
, e3 @! ^3 ]. `6 `8 c- Q& ?
{
) ^% F$ T" K, x$ Y+ H
read_MSG_buffer(mem);
+ o7 M/ k% g# Q" K4 p8 c' ?
}
. _5 e% M" k: {* {% r
}
3 w4 B' m0 \/ K9 J# T
j: a1 M5 _2 u9 h5 _6 L8 ?6 p
void read_MSG_buffer(int *baseaddr)
/ F, ]" K: R& }
{
) F: F" |' l! v
pRX_MSG_PROTOCOL pshreRAM = NULL;
% ]2 X' M* L' _8 S
( W+ v0 l$ N, l4 y; m
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) F0 t4 ` H& \) C( r8 S
) R7 P) I0 O6 d4 G# @1 p- `4 l
if(pshreRAM->packet_cout != count_copy)
# M3 `" I6 b! B! K3 |
{
% {. u( e. L: O( W# [2 t: ]
printf("a is %d\n", pshreRAM->a);
0 m. c6 G& e! G1 F- K
printf("b is %d\n", pshreRAM->b);
8 I. J( d1 c) ?# g. a6 w
printf("count is %d\n", pshreRAM->packet_cout);
4 s1 A8 |# V- B8 P' {2 b
count_copy = pshreRAM->packet_cout;
/ x7 b: `: b0 `
}
- W8 k* X/ s' L, ~& h9 [0 O. y
else
2 s! K A' F: N
{
) \2 j; z" N0 |2 @
printf("No effective message!\n");
) o6 n" z6 e: B; S t" [
}
* ?( c- @8 o d$ n
}
/ T, b0 _' X9 t& t
4 P. M U0 d4 y9 i" q" r+ j- F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; G# M% z8 R C: B
9 }6 N. g4 u! }/ F9 B# ^* x
$ J8 y! u% [/ Y9 n, C3 c5 e
7 k0 S# z" ]+ i* h/ K1 X2 p4 P6 w
/ I1 q w( {/ j2 n
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4