嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 m! {1 N' p7 {5 T S- X/ w
3 S9 M# q: j% }$ P6 V, s8 d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" P8 j/ U$ X0 V. X
#include <unistd.h>
) ]8 l6 ]( k, K: b* i) ?$ J
#include <sys/mman.h>
# [7 n" q5 t* j2 F3 T
#include <sys/types.h>
( f+ y' D, v. l3 J+ E1 v0 l
#include <fcntl.h>
0 p& {3 S5 d! x2 l
- f- x, ^1 @0 E
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 V7 `* B; q" n1 m& K, h& [3 h" C
2 s1 l: H# @9 k4 k& {
typedef struct
# r3 \" v2 `, U4 w
{
, s' Z+ Q/ h. b; h' x$ Q
unsigned int a;
! R/ U. F6 f, S0 z- s
unsigned int b;
' o4 E* a( P/ k+ X& G' @& R
unsigned int packet_cout;
2 b7 N$ t ?) n! i: w, o7 `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& p- d6 l6 U: j' r2 d' A2 K
9 c, `0 X( ?7 l) _# S, n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 z) s4 r6 j' L, }
unsigned int count_copy = 0;
$ R' f) A. C7 `& ]5 p
q/ t& ^6 V' u2 A) H& g
* f! C: F6 M4 Z- F( X0 H8 B
int main()
- n: g7 ~% g, Z- j/ t1 j# D; B
{
+ W( t- b: q+ O7 S" W
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 t- O7 l* w9 K5 y6 h; Q- e3 C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ Q+ E( ?% X+ m6 k/ ?
8 h. @ r+ P; j; ~
while(1)
0 v5 e% ?$ ?! J
{
- W4 M% k* V% }2 O. `, x6 B
read_MSG_buffer(pshreRAM);
9 K* ?6 \3 a- o; p5 G# w; v
}
/ C9 ~" F4 |7 L1 |
}
9 F* A. [! E1 Z* {3 h' S
% ]/ _* z1 V5 C9 V% A: b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 O9 p3 m: [1 F2 z$ X0 e/ u
{
! P/ w8 _1 ~ D2 X$ S$ y
RX_MSG_PROTOCOL buf;
3 _) L% X5 x1 ?+ `4 N: _
% Q: N) x* t: g* X9 h
buf.a = pshreRAM->a;
1 a! L% \. h Z1 h8 d4 T
buf.b = pshreRAM->b;
2 ^0 U1 k+ N( r2 X! D
buf.packet_cout = pshreRAM->packet_cout;
5 P7 t2 u" F/ K
A) P6 V8 T1 @2 i
if(buf.packet_cout != count_copy)
- D: P" b) D2 j. A* `( B* h a- k8 f
{
. @; O$ I6 t; n$ H% E) X5 J3 B0 t
printf("a is %d\n", buf.a);
& d. u/ O3 ]; Q
printf("b is %d\n", buf.b);
. d. V9 J8 h$ j8 Z) Q: I3 X
printf("count is %d\n", buf.packet_cout);
) J% K: ^) I( Q. }
count_copy = buf.packet_cout;
1 z* d9 C3 W( _! x/ n1 y: y
}
' u- Z z2 k/ w7 Q- w& [4 f
else
7 _7 v! ~/ k6 k5 s6 B
{
/ ?7 ` Q" {2 Z; y$ I* @5 O8 J
printf("No effective message!");
& a; t- M' D* N8 C
}
* D2 O6 v: n' Z6 y. a+ V
}
" }, L5 T5 y: l( H, ?+ @/ j4 g
4 p/ { V% w' y
% C3 H- L4 o" A
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# `3 i! ?0 c# W g
使用下面代码,对内存使用了mmap函数后:
: I: m2 K: B8 [, g! M; h
#include <stdio.h>
3 i: C# ^- n4 l Z. n" }
#include <unistd.h>
1 T4 J, I0 f9 r9 S& H% {9 O
#include <sys/mman.h>
( s* z" E! l! K0 x+ A% x1 ?+ p" b
#include <sys/types.h>
1 x: S# `' C6 |1 H- Y% k! S
#include <fcntl.h>
4 A) T' D6 y4 l' Y) d. D" w" s+ C) q
. s% X% x l2 A* p
#define SHAER_RAM_BASE_ADDR (0x80000000)
- o0 m2 W; T& {) Q
#define SHAER_RAM_SIZE (0x20000)
5 [! E# k. H4 e8 [
6 B4 x$ P/ J0 x, c3 h5 g
typedef struct
* n& s* Y0 x9 ]/ e5 @3 [' Z
{
; m2 p4 ]& y) u# }& z" Y$ U' o
unsigned int a;
! y1 y. K: _- b8 i) p% K+ |
unsigned int b;
9 I; f4 R7 D' _, u: ~
unsigned int packet_cout;
# o0 p7 g f( U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: @" T) Y) \1 f2 y% U5 t2 x
; B' Z+ L; E/ a1 ]2 ]
void read_MSG_buffer(int *baseaddr);
2 L4 a# S, V8 H
unsigned int count_copy = 0;
6 b& r+ g: g0 M* w7 {
8 |2 r- d- k5 x% a0 h
int main()
1 I& k& |( g9 J, `* `& b
{
( Z+ g) x$ v1 D* G" W
int fd;
( S6 ?% [- p9 B1 M
int *mem = NULL;
1 t2 w3 @% Q- P9 ]8 `' H& F
9 u) ?8 M; P5 z) z2 G& p5 e& A% _
if((fd = open("/dev/mem", O_RDWR)) <0)
5 |, r2 ?3 x; k+ s0 U; U
{
* Y1 R3 x4 j' I( e1 I! w( W9 m( n
perror("open error");
1 z$ a& `4 N3 f5 i7 T+ S: E
return -1;
( s( m4 j1 l7 y: E& W0 |2 k
}
2 W% ?) s" F+ Q* E
& U: m" {& J. `# l4 K8 P
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
U e) L: ]; L. o' \: ^
% e$ |' F8 n" \3 p& V
while(1)
5 k+ p& t' T+ a+ p) L2 I2 q
{
" L. J0 L' n' ^7 ]
read_MSG_buffer(mem);
+ T, ?1 t* G% h+ G6 f8 y/ u0 j2 g, M
}
1 Y: O, n- @- X
}
9 a0 a$ ?/ q- O0 l1 t" b
5 W9 R8 @$ D/ y9 [3 m9 L0 L; j2 q
void read_MSG_buffer(int *baseaddr)
- I/ _! i3 O8 A8 p& g
{
5 F, F8 F7 d! O8 v- {$ F8 ?% b. ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
& `: B2 ~ I$ @( j3 |
2 I% t4 k: g5 [. h
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 |" J! t6 h7 N' F9 p3 ]3 V0 w; `
6 J8 |2 r9 Y; K6 k( n
if(pshreRAM->packet_cout != count_copy)
1 v* J) Z2 j/ h- _) Q
{
7 A, q, H8 v3 G- A! ]5 X
printf("a is %d\n", pshreRAM->a);
) T/ a5 w/ t' X: e
printf("b is %d\n", pshreRAM->b);
5 Z" d, q+ R/ X3 }/ x2 }! M
printf("count is %d\n", pshreRAM->packet_cout);
& v) Z0 D! w' @, O7 d
count_copy = pshreRAM->packet_cout;
s6 g* d" _$ j
}
6 P; o$ h" Q. \1 B
else
( C7 e: j5 V0 B' F+ B
{
, d! [( W9 Z% n* v% x5 B
printf("No effective message!\n");
' X+ [2 ~- W! O j4 d
}
. N" V4 y- q5 M. `" y0 ?+ b
}
6 M- R' [% P( S8 U; J3 m- O
1 w+ N7 [6 e& u. A2 p4 @+ J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. O' U5 J& u* ^" }
6 A' t( d2 A1 W
0 W! l6 q2 F) o4 u+ W( a. u
7 c7 I, ^8 `9 `# F: n9 g. @
4 t* F a4 w- ? {+ E( E# a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4