嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 c4 t2 {- _! N) v" e8 f( u
" n& p4 g: Z+ Y2 U$ h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( t7 e0 e& [; z0 F
#include <unistd.h>
- J, s+ z4 c% Q) K% h# J
#include <sys/mman.h>
- H( `0 J8 B, q" O( O+ U7 E0 n
#include <sys/types.h>
2 j' U% }% {& O _# l# \2 m
#include <fcntl.h>
! V& X2 c5 j& o/ h
' A" x* j+ J; B5 G+ K; X
#define SHAER_RAM_BASE_ADDR (0x80000000)
: e6 {: F5 R t
9 k- A1 R- G* H! H
typedef struct
& `0 g5 ]3 p; J' N" m
{
% A$ L4 m5 X B
unsigned int a;
" w, C6 y( A3 i F& f+ @
unsigned int b;
+ M5 X& k7 v0 O x: r" m
unsigned int packet_cout;
% v5 y3 x# B5 ~; R. P+ ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; ^8 C R/ S5 `6 i( J; K5 j3 }
]2 L" K7 P+ ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. o3 }9 K, X' Q
unsigned int count_copy = 0;
2 k' w3 t; O V" s4 b, J* f7 ^! T# ?
: y' ~3 V2 z' _5 p" p
- Y5 }$ s3 X2 O$ c C, M
int main()
! s6 U9 J/ o0 |6 Q
{
7 @# a- @! O2 n4 D. K/ y& c! p. T
pRX_MSG_PROTOCOL pshreRAM = NULL;
u1 z9 j# }0 |. ?' A" R
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 c+ _* j+ @6 x9 d
6 T& V9 x$ v5 L" j7 y! [ C7 g
while(1)
+ D* J: m. {+ G1 Z
{
; I( z% a0 v3 N; Z/ ?4 U! S3 L3 M
read_MSG_buffer(pshreRAM);
8 f$ n4 ^) K! Q; M4 h# n/ m
}
* ^# |& q5 v+ s, ?! C/ B& g; p5 F8 `
}
3 V! z l" O$ | P5 a0 y. Z
# [6 S) S5 o/ t: L( k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" ^% D$ H5 V" R# `+ F
{
8 M3 m: j$ Z V8 Q. B6 h* Q2 h
RX_MSG_PROTOCOL buf;
2 Y" B* Y% P' I, J. A
% |7 L1 z3 M V' g" e
buf.a = pshreRAM->a;
5 j& P. E$ L7 O8 T1 W
buf.b = pshreRAM->b;
1 d- y' F. w* @2 S" k! l$ `8 a
buf.packet_cout = pshreRAM->packet_cout;
7 d1 e; r9 s- g7 r' r+ F7 T
. I( ]6 G, j; ^' u0 }
if(buf.packet_cout != count_copy)
& |+ N8 x& k2 H, W6 s( K
{
]8 O: ~8 A- B8 d
printf("a is %d\n", buf.a);
0 ` }' K9 w8 M; g
printf("b is %d\n", buf.b);
0 v; x+ y. } E- s) {- r+ d
printf("count is %d\n", buf.packet_cout);
- ], D8 P* n, u: m" ~* q
count_copy = buf.packet_cout;
( m$ F. e# a6 k2 R
}
1 ?6 ?" A0 J. A0 i7 @
else
/ v8 H8 I( `8 X1 W, ?9 a
{
6 E" u2 Y3 U) A
printf("No effective message!");
3 I: V. S9 S1 t$ X$ @, k
}
# v7 n, L9 L) H$ @; P- f) I
}
( h9 E/ P, ~' s, l
9 G4 M; T3 U2 A3 m2 `/ a
& H1 O2 s4 j! q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 M3 B" k1 H0 [; R
使用下面代码,对内存使用了mmap函数后:
" O% E) v' N1 o! g% i. B9 ~
#include <stdio.h>
, Z4 a& v, M% B; c9 u8 c
#include <unistd.h>
0 t! |6 O4 C& o* z2 g
#include <sys/mman.h>
" F) k0 A; c" K% U
#include <sys/types.h>
0 v5 ?: i9 V& F# L; |+ F+ u* f
#include <fcntl.h>
; Q8 n1 v ^( ]) l& x
$ L2 u( ]! u2 s. v1 n, o
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 R; B. `4 H# i+ D
#define SHAER_RAM_SIZE (0x20000)
; Q( n1 ?3 ?/ \
2 d$ l' @+ x p4 K
typedef struct
( ?% n ~! Z) h* f
{
! @6 S1 `0 U ` C
unsigned int a;
. k3 y* t& o: _$ C
unsigned int b;
0 U* U9 \2 k, _8 v9 W
unsigned int packet_cout;
8 L0 o5 r3 Z; Z$ B [, @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& L% v2 ?7 {' T2 f8 \$ F
- K: R9 |' x% h3 Y# v4 c
void read_MSG_buffer(int *baseaddr);
7 [' P5 m. g/ W. p; L4 B& Z0 p' y' g
unsigned int count_copy = 0;
3 E4 x4 c- Z) h* p
( |3 S7 k# k! x0 l) w+ J9 u
int main()
' o0 }) ^# [. S( ~& U
{
# w" {; C- ]9 T4 D
int fd;
/ }( I6 L4 Z1 l$ E+ W- P7 V7 r7 Y& @
int *mem = NULL;
! M" N# i! y/ v1 f2 C1 w4 @
7 z" ^+ p; D' U3 E1 @0 o
if((fd = open("/dev/mem", O_RDWR)) <0)
$ Y$ q# D6 z$ m, p' n% I* y1 m( [2 B
{
; w m% r e2 x2 O& X$ u, J$ y
perror("open error");
, i; u! k. C! f$ D, k4 n! |& L
return -1;
) C, @4 q0 o- Q6 g
}
U3 g" O' a/ b# h: Y
9 N' l0 z: i8 T5 z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& F' Z; v7 h% ^& x2 a
: t& ]$ P1 R: g* _3 e7 B
while(1)
; c# `! f$ M% J. W/ h5 J9 O
{
5 i4 B5 A+ x6 T3 x
read_MSG_buffer(mem);
# U" [+ @! l& W3 T+ V+ B6 E: i
}
+ o V8 W/ Z6 A7 u4 f# `" W1 ?8 Z
}
; p: q" x! a3 _( h2 l" `
0 Z% U( Z# c( M$ ~2 m- s/ ]4 z8 j
void read_MSG_buffer(int *baseaddr)
1 m. x1 X' f* z* k# ]" `
{
( c1 X! X" B: O$ J$ d0 [, e; d
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 R( Z \2 n/ ~& }8 v
7 i% y1 L1 }) H$ z; ~9 j( [' j. |
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 Y( `9 U" Y0 u0 V* l
2 F0 q+ U }7 \3 u% U: n' o
if(pshreRAM->packet_cout != count_copy)
: ~/ x1 r; N8 a
{
$ V3 c% y) a) F" r
printf("a is %d\n", pshreRAM->a);
5 R( Q; z( }0 V4 c
printf("b is %d\n", pshreRAM->b);
% X }2 Z, W$ N. _
printf("count is %d\n", pshreRAM->packet_cout);
, h" b. k* P' o
count_copy = pshreRAM->packet_cout;
2 m4 L. R% J& B& |
}
6 q$ k* I; |. J4 S3 H, L" Z
else
. X7 ?6 w l: A; J8 R1 V: w
{
; |8 K" ?. K; N! c3 E2 P
printf("No effective message!\n");
' D5 C& G1 Y) j# q
}
( _ m7 N1 @+ i6 H$ r- d0 Z( _
}
* S, c5 m& L1 }8 x: v6 s' z) C
6 x: s8 v/ m' ~$ A6 b U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 v6 r* |* Z% I& \/ C0 C1 v
. g- j7 o0 N5 e e
# V: d6 Y8 T9 |! N
* m. C+ ~+ b. e8 m. M9 l
: `# K) M) r/ o% c" R
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4