嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 p+ c7 W' F8 d2 a/ j" ]3 K
$ p% [2 h7 w+ Z$ @- E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' ?9 ?2 ?; s" q) A \9 D5 S" Y
#include <unistd.h>
9 t( y# u8 y2 b C. C6 y* {2 _' j
#include <sys/mman.h>
3 t- G; h$ E2 c/ n a; U) v4 i* y9 r
#include <sys/types.h>
}- b& q U- j) r
#include <fcntl.h>
4 [* j4 ^0 ]0 {" ~7 I
) K) u, J( l% K& ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
% ]& j9 H3 l4 A: e0 J, Y
! S; p, S8 |' j! d1 r
typedef struct
) U! r u) b- S R) [
{
' P, t- ~: s% j: C
unsigned int a;
f) g0 P( J. M# ?# L- ]7 c
unsigned int b;
0 w0 ~6 V) z% S3 b4 E) }$ f7 x& x; c
unsigned int packet_cout;
1 J+ x9 `! ~% I% r9 R/ J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 h* ~+ V# O$ \
& d" Q( t% |% T" J) g( c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& p( n% B9 M9 F
unsigned int count_copy = 0;
* Y2 O; s, C5 y( U! b) O8 J m! V/ m
) f/ K5 S. x: x0 z4 Z" }
( v. ~8 r6 ?/ u* M
int main()
0 } y4 ?+ b9 P( L1 V
{
/ u# ?4 O( y# x- l# y c8 z7 U
pRX_MSG_PROTOCOL pshreRAM = NULL;
. Q& x- A0 F- N+ x$ M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 F" N! Q+ \7 E# d$ ~+ j" b
; E6 Z6 W' C s3 Z0 P
while(1)
' _2 T6 x: }$ Q" G+ H, i
{
2 D' L* H4 S$ b6 W* n4 R
read_MSG_buffer(pshreRAM);
% d7 f, C2 i: s9 t
}
6 r8 | r% j: m9 M
}
4 z1 U# Z+ m6 s& L" X
" i7 @( P# `" J# C }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 J9 I3 a- Q' C8 ]5 @5 s) n5 T
{
! I: C4 [6 x$ W* X h
RX_MSG_PROTOCOL buf;
9 s9 J4 Y7 T0 }8 w
, c$ o4 B4 d( q6 C
buf.a = pshreRAM->a;
( \& C3 z m9 A$ D+ b0 o' {
buf.b = pshreRAM->b;
+ f( J) S5 ^% Q
buf.packet_cout = pshreRAM->packet_cout;
% r; t( z+ A" J
$ L, z- W( M; k9 n% H0 \
if(buf.packet_cout != count_copy)
+ V5 ]* q& H: J
{
% Y& D/ ~5 L# V7 C* ~
printf("a is %d\n", buf.a);
' [/ v: B* A W( _
printf("b is %d\n", buf.b);
8 A- C3 L" m0 d3 k2 |
printf("count is %d\n", buf.packet_cout);
8 {, `. G$ ]' S
count_copy = buf.packet_cout;
* }1 ?! Q/ ^+ q7 b) R& N1 J1 d- t
}
. ~$ m2 G5 W9 h8 f: p
else
' m8 \/ U5 O" p# {9 ~5 t" L3 ~
{
' E; m( D2 t& |- p' M
printf("No effective message!");
1 a. C8 I+ ?4 M; |4 {$ V+ ?
}
5 g% U7 ~9 z( K% t2 y$ {- y- G
}
* ^+ O! v( s" o0 ~+ l5 o {
* O9 x$ H0 L7 J4 V9 f
5 X8 T8 |/ c9 E- R' Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, ~1 U: C; _, F* Q5 c5 z3 `7 ?
使用下面代码,对内存使用了mmap函数后:
+ r; P$ J& j2 D0 n7 b
#include <stdio.h>
4 B' N- [" w# \ [/ y( a
#include <unistd.h>
; B3 B( W1 I/ M6 C
#include <sys/mman.h>
& J( `1 V* W8 F Q. O/ l
#include <sys/types.h>
7 M/ Y- ?" a2 y2 e* D
#include <fcntl.h>
8 J: _9 a7 L, k {1 d' O
" h" r9 `+ P4 x+ ? a+ X9 m+ O
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 g, r! ~/ R* {" ~+ h- p
#define SHAER_RAM_SIZE (0x20000)
0 ]& |; u/ R4 C0 Q: j/ C- i, v% s
( y& E( y: |8 q( `9 y2 k* s0 K
typedef struct
Y& ~' T: ?# B. D
{
$ M7 ?( k. z/ Y* b5 P0 G
unsigned int a;
& J' J% M) G* ? X
unsigned int b;
1 ~. q2 a( b. W s* q. z, S8 |
unsigned int packet_cout;
- N! c& b9 D2 i: N' _- v; ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' b1 L) k3 p' a; z6 o% T
; z9 y$ T, H4 i
void read_MSG_buffer(int *baseaddr);
- @9 g( R! e3 j2 T. X
unsigned int count_copy = 0;
) z& V; m6 _2 f9 h% k
8 a2 D% p! g" {7 ?
int main()
( N2 g! {0 X0 D
{
! K3 V9 N3 U3 q( v5 M5 w
int fd;
& ~/ J8 e9 \: ?9 V" z0 l' j) n) a
int *mem = NULL;
1 c& j; \2 R' n; K+ W1 U
1 F- F% x- F: T, k# W4 z7 l
if((fd = open("/dev/mem", O_RDWR)) <0)
$ k6 s6 r; ~) B( L R1 ~2 q& T5 a
{
2 u$ X3 E4 l$ u7 u8 R
perror("open error");
3 e0 _( m% r( e' I
return -1;
; c; A. Y5 F5 L6 B
}
6 E. J. P: i3 ]% ^% X
, t9 j& }3 ?+ N% F- N" D) t/ T* `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. e8 N0 Q9 ~# t2 G2 ]+ [1 D0 k
6 q% P' o6 Z8 s" |3 c2 v6 {* ?
while(1)
# A T: n) O6 t+ s
{
3 f) j9 ~ h9 k7 y
read_MSG_buffer(mem);
2 G9 M4 @% j: i8 W# z" n. s: }
}
# y! H" D( ]9 Y
}
! V' i/ f' S3 |$ {$ u
; j/ |; j5 w- C! S
void read_MSG_buffer(int *baseaddr)
6 H1 s! {# z4 c" W4 X D6 s
{
& N) j1 Z5 m w0 e8 }
pRX_MSG_PROTOCOL pshreRAM = NULL;
( m4 e' {1 {; P e+ Y& S
* I) Q( p4 T ^1 v5 U
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 O' u: j. Y* k/ n) d, Y7 M
K v* I5 V4 N& S9 a5 A$ {
if(pshreRAM->packet_cout != count_copy)
# U8 V0 H- B1 `1 x
{
h- t' [2 l9 P8 z1 M
printf("a is %d\n", pshreRAM->a);
/ N4 M6 T( I- b' s+ G5 F- g
printf("b is %d\n", pshreRAM->b);
4 M" t1 b, z/ Y1 R5 C: V0 J1 o
printf("count is %d\n", pshreRAM->packet_cout);
8 G2 n7 q1 e) B
count_copy = pshreRAM->packet_cout;
5 R- q5 ?1 a+ o
}
) H9 A. t8 f) }" i! G2 W: e5 K& ?
else
2 d: Z2 Y! _7 `, h L- b0 ~& p
{
# Y# C! g8 D7 T' }" \9 p
printf("No effective message!\n");
2 J: T) v1 F# G2 E( K! v
}
) I4 G/ K5 Z3 b' }: W; z5 v1 W& H& C
}
* K& \5 u! X! z2 i
2 e; s0 m; k0 w- S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 K: r+ d* o* a3 f5 ^
+ B+ ?3 z j. q& U
$ C0 v9 e3 d( h) I/ N% D
8 S0 T2 w4 \" J) g
6 P" t( w# r3 d
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4