嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 }/ r9 |; X) }
( F+ T2 o+ u) h3 F7 P* j9 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! I1 b: U) i- z
#include <unistd.h>
5 I; K% `; i8 o/ }. j, v/ q
#include <sys/mman.h>
; O) X5 K* p5 \. {% {
#include <sys/types.h>
4 ^% k* x9 S* q' A
#include <fcntl.h>
2 E" F% L1 x* K1 _
8 y) E0 j1 }1 ~4 s
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 m3 C7 i3 L8 }3 ^8 L
. T( y: S+ u: H
typedef struct
: c/ R8 z& Z7 J, R6 K: V8 }! |; l
{
' Z! t' z+ M4 @7 w- [( O/ \3 }
unsigned int a;
/ ]4 H# H- E* Z
unsigned int b;
# V _! U4 q6 c" v9 f
unsigned int packet_cout;
" P" U% p( X7 t9 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. G! J+ E) J' i+ O
. B/ D* ^4 n6 K- p8 I7 t* u/ f: {& L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) P# c8 C5 S+ t9 ^/ a& Z3 U
unsigned int count_copy = 0;
A% g' h, `6 }; A
/ u2 n0 ]* l9 x
; {" k. i1 Y7 B! ?* P5 f. i
int main()
. t+ q) v4 v$ H$ G3 [2 ~
{
) |7 d) X9 @6 t0 a+ k' a
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 S0 D- F/ B) {
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 w" J4 d5 s) ]4 k
8 l$ s9 g; R1 z
while(1)
* [* {) V4 l( `& H+ j7 D9 [$ D( f
{
0 G; ^2 c8 z( @- O$ p1 Q" b
read_MSG_buffer(pshreRAM);
5 X6 W2 M$ ^ e; ?9 ?
}
0 m3 g( W4 H, N$ t+ F3 w$ Q
}
$ V' c, ^- R p0 s
* }4 N0 [8 ^0 x# S6 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* J7 x6 h' {, u4 x3 z
{
4 R0 b2 i1 C& E7 R& i
RX_MSG_PROTOCOL buf;
5 [* p2 n/ ~$ C# t
" |# E1 l% J. U( q. Z
buf.a = pshreRAM->a;
3 r$ v+ h' p. Q, i+ F' `
buf.b = pshreRAM->b;
3 U6 v: s, b( d* S
buf.packet_cout = pshreRAM->packet_cout;
4 p- |; a! N' ~ z0 J1 n9 ^# {
9 T) l) c9 z# I4 E3 t4 I3 s
if(buf.packet_cout != count_copy)
+ S- Y" F) s. z% ^4 C8 ]* q H' @1 ~
{
+ d2 I+ Q- W2 T1 \" R7 _; J
printf("a is %d\n", buf.a);
. s, |+ z9 b, J8 M5 i, D
printf("b is %d\n", buf.b);
, f: c3 [& J6 a) K
printf("count is %d\n", buf.packet_cout);
3 [" \$ V5 b) R/ X3 x- f6 q& ~
count_copy = buf.packet_cout;
. R4 `% `* r# P6 D6 W+ ~4 _
}
: U" e# f5 O3 a4 r
else
, u* S% _! O M; c( T* A& r! U# D: @
{
( j4 B( u: N9 ?: r
printf("No effective message!");
D' H8 s$ b, r
}
+ B6 r) _' q( T2 Z% F5 l0 D0 ^
}
+ e9 s1 D P) M1 a A# X7 s5 x0 L
$ D; Q- ~- P; U$ G, T
! X+ @7 W; w$ c9 \. ^9 m5 U2 \* N. W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 E: W4 y' ^0 K/ H- F
使用下面代码,对内存使用了mmap函数后:
. P% b4 s5 O3 l3 D
#include <stdio.h>
0 ` z* Z; A8 ^; A% ?
#include <unistd.h>
& L* _; }! c4 X7 q, B
#include <sys/mman.h>
' q& s. u7 t2 w: H4 n1 c1 Y
#include <sys/types.h>
, _ H! F' d6 X; o* I
#include <fcntl.h>
9 `- w+ m! t" {3 J( c( ]+ @) ?
. J6 ~5 h2 H! f7 u, R9 u' u' y6 T- z. u
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 F4 p# B+ m* z
#define SHAER_RAM_SIZE (0x20000)
& M, `: O; D# M- P
5 s1 S: q& \; M% |2 m" s& P
typedef struct
' o$ ?$ }$ A+ O2 v
{
( M T) K+ C& x# C
unsigned int a;
& o9 ?/ O# o# u% t( }$ N+ r6 O
unsigned int b;
% A8 a0 `8 W9 f- t3 g
unsigned int packet_cout;
! y; M+ ?! B6 d+ s! h+ Q, f) v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 C9 V1 z8 N2 {8 @6 P
@8 h: G t5 ?' d& \. M
void read_MSG_buffer(int *baseaddr);
7 L, g5 W) Z; y; E
unsigned int count_copy = 0;
2 x6 ^+ O5 u4 F( Z
7 t8 ?0 O- t! o! _
int main()
2 }: O. r6 w5 I' W$ \2 f" S8 B
{
, G5 w; G& P- t; @' s4 g
int fd;
6 l9 O& b# m+ u }" k
int *mem = NULL;
2 T9 { F* u" s) W% b
9 v9 r- {, }: p& k- ^
if((fd = open("/dev/mem", O_RDWR)) <0)
' m8 L) v4 D' W; R+ V
{
4 w8 D0 }! i* f% W
perror("open error");
! r4 t, f. p* s0 d1 X
return -1;
; R P( C& Y: l! H: P7 }+ o
}
& i. N: J8 q1 O5 V: [; v k0 j( Q% a( U
# H) g& p, B' n3 ^' }) E) l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( n1 {' m, H# i& K
8 [& y7 g1 \# x6 o" _
while(1)
" |. d1 N: S. [
{
* e; M" y1 y# s6 y7 }% }
read_MSG_buffer(mem);
( Q" `" }8 c3 Z, F1 T. Q, ~1 d# ^
}
$ N( v( [+ @9 L/ ]$ B
}
* Q0 s6 W! @# z3 Q/ B
M+ I: T6 q6 L V5 D- J6 c- L4 _
void read_MSG_buffer(int *baseaddr)
( C7 }. R9 I$ Y$ V* j
{
! m4 o7 }* p% }2 N3 p, u
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 a* ]0 b7 n. ^( `. ?
4 W) }: N6 Q1 W! D: r* B$ L# {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; V& k8 \8 e& r" L' U3 N
' Q3 P7 p5 X% G' k
if(pshreRAM->packet_cout != count_copy)
3 @7 ]4 r0 E. l9 k: n) m7 U0 n
{
: U' n5 y& d& [: S1 B" T
printf("a is %d\n", pshreRAM->a);
7 ~ S8 E. H4 H( y! G8 W
printf("b is %d\n", pshreRAM->b);
( o+ i4 Q \3 d3 U* X9 i0 F
printf("count is %d\n", pshreRAM->packet_cout);
2 E$ I/ [; f8 d, Z5 r/ K& X2 w+ w
count_copy = pshreRAM->packet_cout;
4 b& \/ O; s$ D- Q. U
}
- r0 ?) W3 j/ k
else
! l# o g/ ~ Q5 @/ R; w
{
: S+ G1 x# U& M# R3 l7 k
printf("No effective message!\n");
1 A- b7 C. M. }
}
E% w& d. h8 u* k
}
2 G+ l0 s: x) c- Z$ y
( r4 j6 e1 M; d# V# {( Q8 |8 z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 ^; o v& M" Z" x; X0 F
5 T8 y; I/ K6 S$ o# C7 v7 w5 S
" l$ P; C5 O6 ~" S" B) B' M
8 l8 `6 X, n* L) o- N% X
# } E) a( p( v
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4