嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, w2 ^- \' P3 W+ R4 `7 Q, Y
: g o4 N. L) {1 ?5 b" y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ i& b) n$ g t; V( S
#include <unistd.h>
3 H; k- O# x& d' D- a* h$ v
#include <sys/mman.h>
$ E4 i9 T$ v7 ~; Q* f4 C4 H% L/ v
#include <sys/types.h>
2 q( D% C: v% D1 I |; i
#include <fcntl.h>
" h2 S8 A. a/ `
# `6 J" P" k" B3 R0 V2 |7 F( G* W
#define SHAER_RAM_BASE_ADDR (0x80000000)
# M& Y3 a _4 q4 J7 G. U- S0 L, ^
z+ K$ G: n: D; `! [4 T
typedef struct
" X! b5 t; Q; ?1 R; I
{
3 X- M4 ^: k( f2 Q, R2 g
unsigned int a;
% Z! o2 S3 s1 A4 a% t; t2 _
unsigned int b;
& o# Y0 F5 s7 U1 Z/ R
unsigned int packet_cout;
8 F7 z9 c. S9 R( a% P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! s! D- p& f" C' z
) {+ ~* F- r1 V: w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- ^7 w! v' R; R6 e
unsigned int count_copy = 0;
7 e9 {& Q( a, f; U, a" h& E
2 o' d `0 M" _3 n8 H
( a' k: T; M0 D T% I
int main()
' `5 ?% I/ i4 o4 \ Z% e
{
% ^, A) M5 _$ G) \8 S2 Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
( d6 l( \( K; \* t3 C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 L( z$ C5 s1 |6 C
* _$ C0 _* p/ k0 ^ S g. s! e! }' x: a
while(1)
, ^1 q E* U! a& L6 r/ J
{
7 n/ I$ y1 J" \+ V
read_MSG_buffer(pshreRAM);
2 h& O) W7 j1 _0 ]
}
, V& K: O' V1 I" u
}
2 R% t2 P/ e2 x
7 A1 l- g' D: a4 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ o# q% C# U! h! x7 U! |1 h5 R m
{
1 B/ l( G% i( `$ l9 |& |# G
RX_MSG_PROTOCOL buf;
% R2 L. _, I5 c
: H9 Y! [ h0 P& q6 G8 E' G
buf.a = pshreRAM->a;
, o8 Q8 ?! ?5 d0 F4 j' [% J/ T
buf.b = pshreRAM->b;
6 o0 K9 t/ ^$ h$ l# s
buf.packet_cout = pshreRAM->packet_cout;
" d/ o ?) U, \+ |
2 }$ W1 U2 d4 l. K
if(buf.packet_cout != count_copy)
: [1 P/ d3 e+ Y6 Z+ h
{
$ K- d% b: Q5 M7 ^- D7 L5 g
printf("a is %d\n", buf.a);
) F, O/ H& ~; A" M$ x7 k( O
printf("b is %d\n", buf.b);
% T1 G0 Y3 {6 F
printf("count is %d\n", buf.packet_cout);
% N) I; F5 L+ v( q! d! L+ q# z5 h% A$ O
count_copy = buf.packet_cout;
7 C: G8 Q9 T M3 ~" }, o# v
}
) S f& Z, B9 _! ^
else
& D: ~3 i4 a1 E) @
{
. o9 v1 G' ^# K
printf("No effective message!");
+ R+ m. @, k* n9 w- }( D
}
6 S: f2 R7 ~7 {, X0 }
}
) \4 _0 U+ Y, Y' g: A
X; K9 \/ ?9 F" u
8 j% q' \ ?+ p5 s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
C; q5 T" K5 g* I6 t, ?- @
使用下面代码,对内存使用了mmap函数后:
6 w; }7 \4 L: v
#include <stdio.h>
- S' V' v& t. N& V- c
#include <unistd.h>
/ w2 W' d$ W9 d' d+ \8 l
#include <sys/mman.h>
" Z- c& x% [3 U" v
#include <sys/types.h>
1 J7 }* [* s7 H; o' | S
#include <fcntl.h>
9 l1 z o/ ?* y' @& o
5 |8 F M& c. x* |+ X; }9 I5 M8 X; c$ P
#define SHAER_RAM_BASE_ADDR (0x80000000)
' t3 |% j! }& p% ~1 t5 r" t
#define SHAER_RAM_SIZE (0x20000)
$ p$ Z3 O9 l! d5 l c
q1 q* A2 S a% B) Y: X# U
typedef struct
|3 L: D% P) `' Y3 N8 m7 ^
{
: ^( I( S m6 [7 J. O4 g+ V( T; b
unsigned int a;
& u/ f L3 k" q, C4 E$ Z
unsigned int b;
3 e7 o) z7 _% `% h: N* I e& N
unsigned int packet_cout;
L, Q3 H, F) ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A T; T3 o% p; e7 g1 T8 H+ L% g
) u4 \4 H$ U& l- R/ c- u. V& v
void read_MSG_buffer(int *baseaddr);
' b# Y2 k1 c7 {9 F
unsigned int count_copy = 0;
8 A1 r! R1 c G( V# j- m
6 v" s; s- m' F' I: a" [# \
int main()
# C6 S9 }1 l1 T* v# g) m
{
7 j2 B6 r ~7 X* W2 E% H. C
int fd;
( c7 C a( f8 }: u! R. N1 `8 i( k. D
int *mem = NULL;
' k! S9 G! l( a9 p
4 f8 d% P _! V" c, p4 }
if((fd = open("/dev/mem", O_RDWR)) <0)
0 n* G% Z1 c0 f6 r$ d6 M9 c
{
( ^* G, M* |- O/ \# w: {' h! _, w/ i
perror("open error");
$ d) f! m0 v# z0 C' J2 y- E! }
return -1;
. d# v' u/ H* m; ^ K2 _2 S. A" ?! r
}
# \% @! x* P0 B& ~( I( P( T
+ f; }0 d: o1 s. |+ Z9 U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 u% q8 A: s8 o
. s$ Q" U) d( c, @
while(1)
! o3 U* Q- O! t# y6 T4 d L0 D
{
- x2 E5 Q$ j* A8 i' q# @; a6 A
read_MSG_buffer(mem);
: ` K& n, D+ K( f" B6 x
}
. a2 \6 e( K) [+ J4 [
}
! k0 X j* @9 u
( p0 i: n4 f( D
void read_MSG_buffer(int *baseaddr)
" h# Y- i8 L* }
{
$ k$ j; ]3 A D" i* P
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 j/ @7 Q9 T; K4 U. N$ i: R2 i$ q
8 N2 ~8 p0 R+ B2 w; t- E# ~! i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. F: @- ~" j4 M; Y7 h" X
5 [5 q: H8 i* G
if(pshreRAM->packet_cout != count_copy)
& v$ `6 m% o- f+ D
{
+ T1 E4 |3 p7 ~ `
printf("a is %d\n", pshreRAM->a);
( D \& Q% p1 E4 d$ W0 g
printf("b is %d\n", pshreRAM->b);
% a) n) S% q! z7 a5 D: j
printf("count is %d\n", pshreRAM->packet_cout);
2 u: Q& R9 J$ G1 ]4 {- x
count_copy = pshreRAM->packet_cout;
" L* _5 g, d f# j( o8 d
}
( P# V. b) [, f% U, h' F
else
6 \ ^: N2 X" w/ z- m4 Q
{
+ g0 x; B8 n# n" a. q1 M3 n: v2 ^
printf("No effective message!\n");
% e) y1 e7 b/ n3 z* v4 _( O
}
; ? V, }2 `8 s
}
8 o/ o# u; o2 d" q* X; B7 ^
& z! Q5 S& |( O( F; e0 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' v3 l! P" I. J6 T _, L7 {6 a
8 h0 N# V# | i9 M+ r
/ @5 x+ D/ R( r1 {
0 C/ B! [- F( `; v# g9 j
' l" ?( S4 a }
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4