嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 o& v/ n7 Y) w; I1 z# w% S
/ F* W: A# `) b8 f/ {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 P7 ]8 y4 n7 E1 {' @2 b4 d
#include <unistd.h>
2 \5 d. Z: A7 b7 f
#include <sys/mman.h>
+ a% ` ?. {/ }9 d4 R/ C8 g$ f" y: K
#include <sys/types.h>
8 _; b8 Y# _$ m& L
#include <fcntl.h>
d4 y) z; M5 I2 @( ~
$ z( D* ?2 _+ T& F
#define SHAER_RAM_BASE_ADDR (0x80000000)
' x+ e( I" A+ E
7 ~5 r5 z( [# Y6 d3 \
typedef struct
4 a2 X8 l: S* X* J3 ^6 V& M: E
{
$ _% v& |0 i: y8 |. k$ Q" d
unsigned int a;
7 z/ g$ c5 v* h3 |
unsigned int b;
' N) y {/ V, `4 T/ r
unsigned int packet_cout;
+ F6 a K+ B2 v* R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 m2 b& A4 Z5 j
/ c, g$ x9 F7 U( o6 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! J o+ m2 ?6 H* z
unsigned int count_copy = 0;
4 ?0 l5 L$ ?; j5 E1 m% E
+ r9 c- [4 K I- K$ B5 Y
5 p5 Z! v8 i% Y
int main()
' F" r. f7 @2 m4 R2 M- ~
{
* p# \4 M0 y, t h! V; h# q
pRX_MSG_PROTOCOL pshreRAM = NULL;
& B, c: \% Z$ _( C0 S) w6 ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 [6 e8 V! M) Q
% E1 i+ ~$ K' ]7 S7 U( b
while(1)
% B3 K) S) @& ]8 H5 A$ b
{
) h6 r1 _1 n; K6 l- u
read_MSG_buffer(pshreRAM);
3 P' p2 i( [. W! O3 ^
}
# K, e5 N4 w. \% K5 T
}
8 L+ r! i& {" H( l2 R, d
2 R4 {5 G4 C& P7 q# ~, j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" L7 ~+ B% v. z( [
{
0 k% M6 |/ \3 h7 x& m# k$ T& h
RX_MSG_PROTOCOL buf;
$ B" ?, G C! @6 j& d2 A- w8 Z
. r4 ^, S, D9 i% A
buf.a = pshreRAM->a;
" T5 u8 ^7 m0 a# E n
buf.b = pshreRAM->b;
: M* E) n& P5 e4 l( f" S4 k
buf.packet_cout = pshreRAM->packet_cout;
V* R/ h: i' Q- i( C5 t1 }8 W
. g9 M' U. u' S" \9 x* ^
if(buf.packet_cout != count_copy)
8 x: C3 P) [8 n7 H8 \) ?' x) ]% S
{
1 K/ w1 ]2 r, V x5 Z3 b- Q) o& O! v
printf("a is %d\n", buf.a);
0 [8 H8 C( M2 z3 n. a" j% L- @ Q
printf("b is %d\n", buf.b);
# t8 P% T' v/ z8 }0 M* d4 v+ B
printf("count is %d\n", buf.packet_cout);
R# \8 o- s$ d& j
count_copy = buf.packet_cout;
+ G( }8 `# s. h) U: R; K
}
+ h- I) O& u/ R/ N- A8 u
else
% f P( p5 ]' ^ U* K
{
# M7 X3 \6 e. j3 d6 P! m
printf("No effective message!");
9 W- L( P2 H! c( G. s& m4 E
}
/ G: H3 D) i* |% [0 A/ ?
}
2 P# `; C" w% m H! h
9 w- Z# T& w R/ V2 B. j( H% c
' R' G/ [! G$ S" m/ P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 ^5 h1 h# \8 A7 q7 G" r p( j
使用下面代码,对内存使用了mmap函数后:
2 |; C, l1 O) s: T; n% t2 r
#include <stdio.h>
4 X0 a: I. N3 C
#include <unistd.h>
) F- e" I, D5 \6 E9 Q
#include <sys/mman.h>
7 k; L3 K8 {3 |- e- s* x6 t
#include <sys/types.h>
" [. d6 O! |" H% w. r: G
#include <fcntl.h>
- |5 T7 E: ~5 k/ {
V# i3 v k5 t$ V5 ]! q7 V
#define SHAER_RAM_BASE_ADDR (0x80000000)
" }% p ? V& p% c6 a
#define SHAER_RAM_SIZE (0x20000)
" ]) U! [( p( m0 w6 n
% D0 |+ ?; ~8 d* g3 [7 U1 ^
typedef struct
1 }( k5 I Y3 l4 v1 K6 d! t
{
. P' m( ` I- t+ }/ D: x8 S3 V: T) G
unsigned int a;
8 d, ^1 \# _; l4 D
unsigned int b;
8 P3 C, U$ @( a- }7 x8 |2 d0 H
unsigned int packet_cout;
2 {% I! K6 Z6 V, Q }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. Y8 V+ w0 L! V- M0 g
2 ` [3 }0 T* ~, E7 b
void read_MSG_buffer(int *baseaddr);
7 z" l; h1 L: j5 [' V( N
unsigned int count_copy = 0;
) e1 ~! v2 U4 A5 o
, ], y) L& @4 i3 q, x7 s
int main()
3 r6 q# ^- w/ a6 J+ ?" z
{
. F- ^* V) z# D8 @5 O( k- l9 f
int fd;
' T! z3 u+ M5 K, U" y/ J% e" d
int *mem = NULL;
8 g! t# N( i2 `4 u
d9 \! \% p2 i% ?, @
if((fd = open("/dev/mem", O_RDWR)) <0)
& H3 o x* m: F# z
{
3 b/ B0 u# ^; m+ c" D
perror("open error");
7 [4 g4 B2 r( U6 z3 M; u/ s, M. J
return -1;
8 n. @- r7 s. y, A9 P8 G# Z7 B+ z! C. M
}
0 [9 a) i) ^3 V7 h/ t. F, A
5 M f2 A$ D4 y: `7 U7 H
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 Z' E: N8 f1 ~- B
" R& D8 j) U& D" f
while(1)
( k: d: m( k) H+ }2 d5 G5 X' f
{
3 [1 X- I: o+ o$ a+ }
read_MSG_buffer(mem);
* J" W4 @6 e6 O4 j n
}
4 t- _! `0 ?3 Z! K1 D
}
D! D- B; {, L0 d6 b0 P. Z6 u
9 f. K% Y5 k4 L. G+ G) F
void read_MSG_buffer(int *baseaddr)
+ x" u7 T7 C# S
{
8 _- V# X) R( D4 n. o0 {( ] w
pRX_MSG_PROTOCOL pshreRAM = NULL;
& F0 U) l, d/ O5 r! {" W
0 y1 g7 C0 u- @" @1 w% S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 q6 h c- d, W1 C! n* D
* ]9 J5 w3 h0 A9 P' t
if(pshreRAM->packet_cout != count_copy)
2 |5 f5 |5 ^: V- F
{
$ R3 ]" o# R7 c- q
printf("a is %d\n", pshreRAM->a);
' X, K4 ^+ u. c; N! |& \
printf("b is %d\n", pshreRAM->b);
/ f( v0 b# R8 U2 E
printf("count is %d\n", pshreRAM->packet_cout);
1 k) [& r m( e! A3 ?
count_copy = pshreRAM->packet_cout;
3 N4 W! z; T2 S+ g
}
+ K1 r% @$ c# H# e! G' _
else
p9 y2 L- H8 ? S# x/ H3 c
{
; ~% ?% F. ^! v$ ]3 u
printf("No effective message!\n");
/ W4 c" e) W# U, h2 c$ V3 w. b7 B, j
}
2 ]1 B" A& f) N, ]3 B5 |* Q
}
7 Z5 l; @! n$ w
' x: n/ D/ k p7 t3 M) H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 C& ~; S5 l1 w" t+ ^& m7 ^) i; }
+ C4 y# ?1 j) ^ O
8 e$ \" }1 X7 @! b
) P% H) M& h! S- Q; W
/ ~! w: X0 K0 i$ j+ @1 K
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4