嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 I/ X' D& H! _. F1 B0 _' c' D# n
8 K0 Z( T6 N/ r* H, K: q* n! P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; ?6 ?4 N( U) [/ u+ e+ m1 Q
#include <unistd.h>
+ W4 S: } H) r; w! ]5 s/ z, M7 i
#include <sys/mman.h>
; C) x# o( w8 S5 _/ P/ ~
#include <sys/types.h>
" j& ^! w; P1 F; j; Y% _3 {$ R
#include <fcntl.h>
: ?0 u3 c: k% w
/ C9 p+ L" y9 R! J2 v
#define SHAER_RAM_BASE_ADDR (0x80000000)
% } C( x% |6 m2 B& R6 V1 n
, V; g8 V: N; v, w3 y
typedef struct
5 i& w% t6 M6 A+ a) Z
{
; t& y) I& v6 m2 g6 Q2 \ U
unsigned int a;
* }# e9 n; N! e6 Y
unsigned int b;
- c8 v! W5 ^; D+ ~2 _4 y
unsigned int packet_cout;
& H# r; i: |* A0 B$ z1 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ B, }; S6 y" ^% @2 O
! h& B% K0 q+ \' B4 `: A6 \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 W5 U v x% L: ~1 L) M! o
unsigned int count_copy = 0;
, s- `9 Y% u2 R* N
! X2 @# z5 t) s9 `$ Q
; u* X0 N4 B/ c
int main()
4 @3 u8 _* Y9 w$ [2 I
{
4 ^/ W7 Y# v% P/ I3 P
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ _( P0 F7 l9 a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 W4 c7 g0 r3 h3 S4 a1 c
+ ~4 x9 b$ x, Y" z/ Z* V
while(1)
g7 a, m1 ]8 K5 I: j) i
{
1 F$ p( P, J) ?+ M7 j4 u: R
read_MSG_buffer(pshreRAM);
! J1 I$ g e0 R3 u" Z
}
7 V. ]" V1 F: H% l2 Q8 H3 Q
}
h ?$ G) F, |; d2 N( s; ^- ~
) K% ^5 U; m$ D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& }. d; f3 e/ q3 W" O; {( b2 ]
{
$ m" x/ x+ [6 o! f2 q4 k y- D
RX_MSG_PROTOCOL buf;
: g8 i# O9 N' ]; i9 c
' F2 f! C5 H' E9 ~* o6 o
buf.a = pshreRAM->a;
" R; i" O! t, O& S
buf.b = pshreRAM->b;
$ I3 w/ ^% \+ T3 F9 U; ]) V3 o$ k
buf.packet_cout = pshreRAM->packet_cout;
# m7 h3 e8 L7 S8 x; U* y# |+ Y7 o
' ` m. o- E+ {. Z. `8 g1 }
if(buf.packet_cout != count_copy)
' `& V5 ? L. n
{
' S- Y' p0 m. Y% c
printf("a is %d\n", buf.a);
! Y( J# p! ^2 ]7 n7 F6 q% l
printf("b is %d\n", buf.b);
! F; p6 g% t) T) p/ T5 s
printf("count is %d\n", buf.packet_cout);
* s9 `' o4 u6 b1 i/ H9 `1 C
count_copy = buf.packet_cout;
+ ?9 J. @1 b/ Y& n0 l
}
7 p+ V" {: R1 h& G4 Z
else
8 A( v4 m9 g, \ O) L9 j2 t P
{
% V1 u) b9 }/ z1 U: u: Z
printf("No effective message!");
+ R8 o. m, R% ?/ x) F' }$ t8 P4 M& n L% Z
}
1 R- w/ G! g' L% N
}
' k/ l! |# ^# [) Q- [0 X
: L! M7 E# T" {$ Z. [ f4 C2 H8 U% }' {4 g
! i. I# w/ ?: v& Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ B7 x; `* Q8 \% }; s, d
使用下面代码,对内存使用了mmap函数后:
! H6 q# b+ D$ h: ^: T: [8 E
#include <stdio.h>
! O D9 f+ t" r- y+ M
#include <unistd.h>
7 z! y! m; B2 g* q O! a X
#include <sys/mman.h>
1 S- A+ t& P4 a; D7 x
#include <sys/types.h>
c& @4 Q6 F: d/ {5 Y8 X
#include <fcntl.h>
" A' p$ w* T" x9 O9 S2 {
0 f9 g7 i* g# k
#define SHAER_RAM_BASE_ADDR (0x80000000)
! e- Q- o. y0 ]$ d* i4 @
#define SHAER_RAM_SIZE (0x20000)
1 x1 W8 @+ M# t( a# g5 k. e
7 u6 D! M( S) E" I
typedef struct
& Q9 e$ I! |! F; v
{
6 O# X( k# z& U5 i( F( r
unsigned int a;
! k6 l; q4 `. G! [" T
unsigned int b;
b, I" ~$ t9 m3 v- o6 M8 H- O
unsigned int packet_cout;
2 M" b* _* Y3 h- x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 Y' G% n! m. ?- S9 h u: ]$ O
4 g0 f* P7 ]( N! w
void read_MSG_buffer(int *baseaddr);
4 \) ?2 V2 b: [9 A; w
unsigned int count_copy = 0;
9 H: L* f( a6 {8 H$ U
- L! C5 Z/ L; G7 x& g- t
int main()
& @' c# e" `& q& M/ [1 N5 _) A
{
" Q9 _4 `. b6 j; w+ k9 ^# n; b* i
int fd;
, Y. p* m3 i3 a0 N$ {) h
int *mem = NULL;
5 {" {9 x% W" ]# k5 {9 ?; {
! M$ y. Z- I5 ?) H
if((fd = open("/dev/mem", O_RDWR)) <0)
& _6 _& M4 ^8 V T5 U$ O# V% B" h4 P5 m
{
6 a' ]: o7 y( n% e }, ]
perror("open error");
, I. N( }3 P/ k1 N8 ~# h+ t; ]
return -1;
; `7 f6 C f" {! L7 v7 e! j+ z8 X( ~
}
- x. C! W& X( }8 s
8 m% |% ^& x& d6 B9 L! F* {& q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- P5 |+ i; X- U- P
, O; z, ]5 f: X) ~, f( O
while(1)
: g' L2 X: H3 f; {& @
{
+ l9 {9 r1 t; X5 @9 t" n
read_MSG_buffer(mem);
3 l5 l$ M- p/ H5 v3 C4 n
}
+ g& H, b; _0 N6 W" A0 E
}
- I8 ?0 N r4 G1 {! N5 N
$ n( l9 C2 F. s$ [3 o2 z
void read_MSG_buffer(int *baseaddr)
z0 R" l. c% H: Z) p8 X4 f5 O: B6 v4 R
{
& t3 F# c2 c2 v4 N, ?5 Z, J
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 h7 [9 V! i9 O( @3 {* e. f' B
. [' l' C# z) v7 z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 l: }: R# r. F' u5 v6 [. e
+ y4 B9 D4 g5 B& u& B/ ^
if(pshreRAM->packet_cout != count_copy)
; r4 g/ a. _2 k3 B
{
' ~0 d+ ~0 y" d1 \1 C7 Q
printf("a is %d\n", pshreRAM->a);
7 g; Q$ D$ U o, v' }: W0 y4 t
printf("b is %d\n", pshreRAM->b);
* i& L, p/ x; {; a6 A) } h' {# M
printf("count is %d\n", pshreRAM->packet_cout);
& l+ Y$ Z/ G' {9 N& X. j
count_copy = pshreRAM->packet_cout;
7 L& i: P% |) F; m
}
' U/ Q' U' _8 ^5 ]5 q" X
else
. {+ K; A% ?) I
{
% l" @! F/ a: T5 M: Y% D* Z
printf("No effective message!\n");
3 W- R0 } a7 a p) V- k- M1 b. R7 i
}
; Q4 A! P$ `2 V0 w3 S/ B
}
& T' M; }- Z& A) E9 p
# N; Z' b! Z+ p8 i( c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- f6 h& i: |2 s$ n' H7 w
. H5 b$ L: R' o" J" Z
" Z9 I9 O, n. a& i' b8 W
' h8 [) k, M( p! W6 `# z" J
+ l5 V* C. O* ]/ [! N( _% A7 {
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4