嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' j ^+ K" y: c
3 Z3 Q3 n5 l9 R! ^0 A1 v1 \ T7 ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' h b8 _; k( s3 |& H, O
#include <unistd.h>
8 q( x* `5 V# y1 y4 y- T" `
#include <sys/mman.h>
4 V/ e) J" s' N# O: S/ f* X y& D
#include <sys/types.h>
# h! f* K& w0 F5 Q2 _7 Q" e
#include <fcntl.h>
, Q( V: U( a4 F e$ T
! |# R' b/ X' k
#define SHAER_RAM_BASE_ADDR (0x80000000)
# `: h* r- v1 k0 L
5 x. F( U. o! c6 k" a
typedef struct
- O9 G/ s" X* @* m2 Y
{
0 v; f% y8 o7 ]! S) d# N
unsigned int a;
X7 L3 I& t1 M' `: |- Q
unsigned int b;
# T* B4 r) N1 m0 ^& k" h7 l
unsigned int packet_cout;
: t% ?& {) T; b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
~% q8 R8 r8 i& s% u7 s
% \8 J9 p/ P/ [0 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; V7 _( m9 C! ^, \1 v1 D" q
unsigned int count_copy = 0;
u# Y' y* T4 Y+ F: Q% g: A6 p
/ p/ ?" I" d5 s: B
& V, k( A, e( J/ b* a. Z
int main()
3 g! X/ Y, M. X" [! K( t
{
, }: p: J8 Z! p& f- {9 l6 Q- g
pRX_MSG_PROTOCOL pshreRAM = NULL;
& f* P. v- c" S' V
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; c: H( N; S: ?6 [# k
% t; r9 F! R/ [6 Q/ K' L. C7 c
while(1)
) j( }, v, x4 I
{
2 N' ^: \- ^5 `# ^
read_MSG_buffer(pshreRAM);
! P" z% e7 Y# g& H
}
' ^) x/ }0 N& s' k6 ?9 @
}
; k# I1 b6 n3 k" q8 @/ M
2 I. G% w* J8 U3 l) c9 w' _3 f" I" x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( M9 }! q+ L, p; D
{
2 g/ d9 u9 `* ?, D
RX_MSG_PROTOCOL buf;
2 r# y3 X: G" p) n
7 U0 z3 p. x7 K+ F
buf.a = pshreRAM->a;
" [, g2 ]) Z" O; l
buf.b = pshreRAM->b;
6 J9 M/ v% e7 Q
buf.packet_cout = pshreRAM->packet_cout;
" g5 {5 C( n* H0 b
* |5 t4 a# \4 f8 c" y
if(buf.packet_cout != count_copy)
& {* ?) }# i# G9 H, T. i: ]
{
8 W2 c5 Z$ T/ y2 ~. I
printf("a is %d\n", buf.a);
% u- H' ]9 F4 t
printf("b is %d\n", buf.b);
3 M( V7 f% s Y* p- d: N
printf("count is %d\n", buf.packet_cout);
0 q. C. q: `5 K6 h
count_copy = buf.packet_cout;
8 p8 R3 o+ e! K8 n' ^/ @
}
5 R! |0 l: h) ]* C! d3 z% N0 J
else
8 U+ F2 a7 W# A: ?/ X7 S2 q
{
) l" B' o# _" S3 I# C4 S
printf("No effective message!");
5 B# q% E; N9 t9 Y
}
$ ?$ p7 o3 X! \9 O ]
}
8 e, w2 ` F9 G3 a2 X
7 X% u. M$ I: {; R# k' i- F
$ {6 F- D+ M3 a
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* I. m/ u1 Y1 Z( V; T& `: T9 M
使用下面代码,对内存使用了mmap函数后:
p) o3 u% |4 p
#include <stdio.h>
' ~! _0 X$ l3 C0 T! q
#include <unistd.h>
) |) `6 Z/ N! o9 S6 ~# I2 N
#include <sys/mman.h>
- y# i, Q( X( Q, S" H0 w
#include <sys/types.h>
; s$ X8 ?/ h; |( `+ q& O
#include <fcntl.h>
, |! z2 i6 H$ o1 Y6 O/ S4 Y/ ~" w
1 M7 A4 ?; e. }7 s# e
#define SHAER_RAM_BASE_ADDR (0x80000000)
# g6 i8 I8 _4 b9 }; L0 z, B y
#define SHAER_RAM_SIZE (0x20000)
+ ~* P; K1 Q& b- [( H3 i% J
( _8 \1 \8 I+ u8 {! C
typedef struct
. b4 c. i# x9 N; Q, E9 F$ p
{
- |3 q& J/ T( S6 ?! ^
unsigned int a;
; V _& I$ `! i$ L9 ]' G4 ^$ O4 o
unsigned int b;
6 Q. ~$ z+ B! e2 I9 C
unsigned int packet_cout;
& L; b" ~# D/ c/ r0 G# v) d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 o% B1 g! M& S' p: }) \8 D
/ d. m# n# j4 g' T
void read_MSG_buffer(int *baseaddr);
1 U; @" Z) w! Z& h- c( c
unsigned int count_copy = 0;
" [- t. r9 { Z4 @
" T, I# B" Y$ ^/ q$ H: E
int main()
+ i, l6 c6 y& O* Z4 d$ ?! v
{
3 j, E1 L2 `# w4 H/ e
int fd;
v/ o% W; I/ h! M+ }" W9 D5 K
int *mem = NULL;
( v+ k0 Z: E+ ]5 N" x1 r
' |' H- S: Q: R0 F
if((fd = open("/dev/mem", O_RDWR)) <0)
5 R; T/ {+ j$ {
{
: x% L+ D; Z2 _$ Q& ^7 K
perror("open error");
: `7 l$ l9 e# A4 Y) w
return -1;
7 e9 h4 r. H4 _/ y3 I" w
}
; D2 J$ ]' ~. Y4 M2 `1 ?
( ~' D. j. w. a% B
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 i( S! M6 _, P; o
7 L& r/ U8 Y) u2 L' P" g4 `
while(1)
# L( a* C1 E; f$ \
{
# U0 B* I0 j9 b& B0 ~: c4 \% F' ~6 Z
read_MSG_buffer(mem);
: t1 g" j& \" ]
}
& \$ W9 ^: v- p6 p! N% h# \
}
7 c6 r2 h' n5 a& A, S
( A: g( G" C3 c$ b1 b
void read_MSG_buffer(int *baseaddr)
+ {7 K- B, i$ m7 O5 d7 K$ ]
{
% H8 ^, z% m: `- j- ]6 V
pRX_MSG_PROTOCOL pshreRAM = NULL;
& `7 ~6 q6 q6 k/ s6 K$ Z
( @: [5 m# I# e0 y- m9 ?
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 e" o6 l8 e% Z' Q
! V8 s1 I% ]+ H1 F. H+ J
if(pshreRAM->packet_cout != count_copy)
5 c$ [4 h% Q3 ^' G
{
; t! e: t$ J+ [$ h6 D" T# a0 }6 \% O
printf("a is %d\n", pshreRAM->a);
9 d: p& I: a* ^+ M5 B. p _- u
printf("b is %d\n", pshreRAM->b);
1 a# L4 O3 g/ j+ N# V1 W. A* N
printf("count is %d\n", pshreRAM->packet_cout);
+ k1 N# f6 L! n, J* x' O; z
count_copy = pshreRAM->packet_cout;
2 d& p( o' g, M4 w0 f! ~1 N3 D
}
2 ]8 n @1 C$ E8 A% S c
else
) h5 o6 O$ {" V5 F
{
* r7 ~6 ]! u) d3 L1 B
printf("No effective message!\n");
5 L: A, w* p3 i+ @
}
8 E# B8 }0 x$ k$ n
}
0 w+ N3 f* |5 x a9 D/ L
7 r0 s0 @ v9 j% U! v" l R2 {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( q& N' i9 K" h3 N( u
& }% \& j% F* Z8 C' I
0 P# `/ x3 w2 A$ J
* p2 R1 y( z8 S! M( a
: n2 |" n. U: c4 V. \9 }
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4