嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 R5 d/ k$ C+ Z. t" \( f
% J. z3 ` c/ o* Z" O5 V
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. B" j) m- G) N! x9 F3 C9 Q
#include <unistd.h>
% o$ ~0 H1 o: z5 S0 I' p: H
#include <sys/mman.h>
8 g, v1 l* I1 g) T+ @
#include <sys/types.h>
, O5 N A0 U* E% f! A2 q: ]
#include <fcntl.h>
, \3 H! V! w5 G" c
. l8 R( j) J) H7 N* C- |: ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
; a! o$ i8 H: A
' u6 j! x! H- f8 Q. g
typedef struct
/ u7 _4 T5 P9 f/ v& p6 w* m) I4 F
{
5 p2 q+ m% }% O' E. b: J
unsigned int a;
- }! k' K+ w6 \9 a, a* Q' l, E
unsigned int b;
; X3 e3 ?3 `0 S) t
unsigned int packet_cout;
D: M! o7 h- o- b! [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 P2 V. f6 s7 C& K9 \
0 D3 [1 U& Q* r O; I! M6 a4 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* ^6 H4 C* t( d0 P/ I8 K
unsigned int count_copy = 0;
2 B! P$ p' a. U. I+ z l: Z
3 x0 e1 Q" K W2 E. L: M
5 W2 v% o9 w1 w% {- h9 X* E# V
int main()
1 ^1 k' B% }( i. V. _6 X
{
h/ i# d7 d2 A
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 A* \: B& @8 Y( y: b1 t
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! x$ P9 y" M1 h, k7 [9 D7 }" i5 C, @
N. m- J9 C' f; B
while(1)
# V: y# |" J: i* g$ o3 o1 ^: z
{
3 u! \5 |' f6 H- h/ O$ d
read_MSG_buffer(pshreRAM);
$ a3 y/ T" S% y3 |0 h% H" a
}
/ a( Y8 H: N- _. n& S5 Y
}
! G% S4 X( C2 ]9 K# P6 x% W `* s
: j5 \9 U; N& Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# ]! s' A2 M' y: J# @6 m
{
% Y/ p7 G' S( n" K, {& C! ~0 s& Z- c
RX_MSG_PROTOCOL buf;
. l3 W5 G5 V2 @9 X9 `1 w- b/ c
0 j. o9 l5 N. C/ m- r
buf.a = pshreRAM->a;
% B3 j1 R6 y8 R1 X
buf.b = pshreRAM->b;
. o9 u) k( n r9 P/ W
buf.packet_cout = pshreRAM->packet_cout;
- I* y3 D/ r2 ~) _
1 i9 K+ w- x! ?, w5 H. G+ S: F
if(buf.packet_cout != count_copy)
1 ~5 A. k! {( ]$ D( P" Q8 c! ^
{
4 B5 Y0 r: F( l0 k, E s
printf("a is %d\n", buf.a);
2 t& j3 g9 {6 o" L' q+ M8 a
printf("b is %d\n", buf.b);
. _' W/ ~: N8 L0 O& p- L! A
printf("count is %d\n", buf.packet_cout);
/ T5 I. e& M; f8 K: ^* v. S4 ^" U: x
count_copy = buf.packet_cout;
$ G n; R& D, l( A. h
}
1 o3 X0 i0 \; z5 Q2 y: S5 B1 v
else
# X$ x6 l) Q0 ^
{
* |2 @- c. J ?3 G
printf("No effective message!");
5 i6 Q4 w2 R# n6 Q* f* b9 ]9 j* ^; v
}
6 B( r3 n" e4 ^) V: F, D8 w
}
* d& _2 O9 f( _( d, b0 K( b% c
# @* Y. X1 w# P* I0 n2 s, ~
/ l9 Y, H) I/ P4 u1 r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* j- [3 a7 b s8 K: C
使用下面代码,对内存使用了mmap函数后:
6 ?9 V; _8 P3 O9 a; V0 M/ l
#include <stdio.h>
" l3 |5 V) ?" j8 U& B' l7 n
#include <unistd.h>
0 I6 X2 D) R2 ]2 G0 q; A$ J9 O, q( k
#include <sys/mman.h>
4 a. P5 U4 ]( m* ?( d
#include <sys/types.h>
4 B$ h2 }) [# J9 O
#include <fcntl.h>
. ?; g+ j0 ^9 Y7 L# l5 _
8 g/ t7 B6 R' p* J
#define SHAER_RAM_BASE_ADDR (0x80000000)
K+ N- p7 c: M" C$ P
#define SHAER_RAM_SIZE (0x20000)
) f& P5 y7 j7 b! U5 u. G
/ q( J" h) v* ]# M! R' l4 g
typedef struct
+ Q) y0 W9 B" ]# i0 X/ a: d
{
/ _2 y! ^2 O; X1 V1 p
unsigned int a;
& [0 c# K+ ?- A+ q5 A" x0 Y3 ?
unsigned int b;
; q0 L; L( Z1 p. [
unsigned int packet_cout;
4 o: h3 y) ~/ v! b8 [: T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 |) A6 x1 x" r7 m' K7 B. f5 j
& d/ y3 i+ c, a/ q9 i; ]9 c
void read_MSG_buffer(int *baseaddr);
0 l& t4 L, s$ z: |( u, o
unsigned int count_copy = 0;
, @/ z; m8 n4 H! i; E. k S- a# E. d
' _9 n7 Q4 x6 ~+ P
int main()
* d/ ~" ~; r$ D! g
{
4 Y! ^9 z+ z% P* q) i4 g8 o2 U
int fd;
1 N6 e- }/ _7 K- Q2 K1 @
int *mem = NULL;
+ ?( \' S) Z1 l/ i. c% I
0 r7 U7 i. Z/ A( }, s: w9 s
if((fd = open("/dev/mem", O_RDWR)) <0)
2 I7 E2 s+ Q; T. K6 f( _2 e
{
6 C S: t; _' n$ G+ z
perror("open error");
: ^8 ^ c; p1 H- _/ \" i# b
return -1;
* I/ W/ L; t7 o+ f. b
}
+ [* ?( X) N( P9 Q7 Q& h
' c7 t' `' }% q! R8 Q- Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( P8 A2 }, _# d- [* _2 w
( f; f# q3 [- T2 R9 K! {( c4 J4 _
while(1)
8 Y7 r: D9 N5 X" G5 a, V- T5 T
{
9 a* `$ A* ~0 z1 }
read_MSG_buffer(mem);
: U! J* ^* g- ~5 b1 A
}
' O' k( t$ ?" w' L7 ~* ?
}
?2 S+ `8 Y6 C) q0 Z( y7 `4 ?. E
$ f# |8 b7 m* }/ Y; q
void read_MSG_buffer(int *baseaddr)
! _5 v! n1 G+ k" y1 G9 U9 s
{
5 e( o$ t) {1 }' D R; O. P* L: C
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 d/ R' j9 J3 h/ [5 l
/ z; B; p/ }' i4 x/ _- E2 ?% J: b
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 h0 r# ^! U6 s8 v: w
% u, w: r. r4 ~6 H) T9 X1 C* q2 ]
if(pshreRAM->packet_cout != count_copy)
! B8 U9 z3 E H5 D
{
+ H h" \ j! _4 r D
printf("a is %d\n", pshreRAM->a);
0 b: `- x) K* S) x' w
printf("b is %d\n", pshreRAM->b);
( e: U. o- I7 N: p1 n5 B. Y) H
printf("count is %d\n", pshreRAM->packet_cout);
/ f; L! o1 ]* Y* \- X$ e0 J0 t0 x5 Y
count_copy = pshreRAM->packet_cout;
}0 K% i& K2 @
}
* J) K4 Y/ ^( a/ b
else
/ g2 j3 c* f0 A' D; E, v9 F6 L
{
0 k* e# ^% O) D4 W$ e- H: ]
printf("No effective message!\n");
8 y: z8 O# n( z, l
}
u) \0 L! y7 g: _2 ~ M; [6 M- l" P
}
' \+ P- K/ K- I" @/ o @, N3 V
6 | V1 w. F- T4 ?$ Q# t, a3 L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! C! f# {6 y/ T' X# b" C
7 l7 P) o, Z- V
5 x) k$ q# Y, ~1 R# h
0 @; |# ~6 _0 v7 {
0 ]9 q: |. B4 A% n c7 \
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4