嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' F/ ?4 @ V3 _" }2 X% s
7 j1 s( t* W% B# W' G8 k! G. }- B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( n/ h8 H; T% v5 f. m
#include <unistd.h>
- y3 H' U' [% ?* J4 E, c
#include <sys/mman.h>
5 A7 b. @ N5 d7 A
#include <sys/types.h>
1 r5 b$ O. C4 P r' o0 k0 r
#include <fcntl.h>
4 z% v4 w! Z2 l! f5 T3 r% l; L
2 X, N ^4 k, \- H8 r$ s* q: W
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 Q: i4 |7 h8 i
% J# i( W& ]5 @% O
typedef struct
, L0 n' M" t+ u7 r
{
6 i) C7 _9 i( h; [# C" b( G
unsigned int a;
7 W9 l/ \+ Q( \9 {
unsigned int b;
7 k4 k& {; a& y8 m t% y
unsigned int packet_cout;
* O+ I3 ~- P4 _1 U& O4 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, \2 {: w9 ]2 t; Q& ?
% G7 R: a4 G5 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) X7 X5 y" [; s A! o/ {
unsigned int count_copy = 0;
) ?2 D7 m5 Q" m# t0 j
5 Q1 X4 k2 I0 C) U0 y5 K* B: L
: q5 D* H: ~. P2 n7 }3 o
int main()
) Q5 q% R9 Y8 ]
{
5 s- g" e! ^1 o3 f0 r5 V! h7 ~' h9 }
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 f0 x! I6 v, _: T! C, X- [
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 g& Z, d9 j' U* T5 W
" }8 Z" J& }& \$ v Z3 Z
while(1)
. O3 ~" a) [. W- b7 Y2 F0 N% j# }6 [
{
- L6 t% z3 k/ A; C6 D- D
read_MSG_buffer(pshreRAM);
" A5 t! e! z% K1 X
}
O* e7 _( k. u# M3 Y
}
# r+ x4 y( k' B. a) ?! ~# f2 g
7 m* s; _0 _) o3 E4 o3 z5 y6 d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% b: H. `; z; _0 ]6 M( ^* k: U7 y
{
6 f W/ k; h V
RX_MSG_PROTOCOL buf;
# L9 }2 [0 V2 M0 M
6 f y4 p/ m& M6 p4 c0 u
buf.a = pshreRAM->a;
9 E! @0 F, {* i: a& T9 \
buf.b = pshreRAM->b;
9 p# c K# o$ N V
buf.packet_cout = pshreRAM->packet_cout;
: _% t0 t7 z N/ P& m2 e
& p4 l. H: Q6 h, C) y
if(buf.packet_cout != count_copy)
5 l8 J* r% ?* s+ P1 V' x. C* w0 u% z
{
6 \% I+ P3 I& w% Q: O3 c
printf("a is %d\n", buf.a);
5 d* [4 |7 j; J, Y& ~ e
printf("b is %d\n", buf.b);
# @' B9 O; i% N: s+ T( g% l
printf("count is %d\n", buf.packet_cout);
* ]% Y, k( J! T+ j( M
count_copy = buf.packet_cout;
, M( M: S- {4 x# ^
}
9 ~* a% D( S* r$ K6 `$ l
else
' m8 @8 c9 e. G& m8 C3 O5 I; R% B
{
, v1 H8 U4 w: C/ x! y- H
printf("No effective message!");
- l5 K. o# w; k# }% C
}
( @: Q: D# i9 G$ L- L; Q
}
7 I; _8 A; T7 y9 J1 y, B+ K
9 p! V$ b* P: b p9 Z9 o" Z8 m
" a+ M+ v# H$ |% Z9 u) K( D+ v# k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, _4 R2 ^+ G, b; ^! S
使用下面代码,对内存使用了mmap函数后:
( P) e( Y7 f+ ~# m @: u
#include <stdio.h>
! X4 e( y8 v: r3 I8 w% ^
#include <unistd.h>
" Z6 B x0 m/ y8 W3 ^7 p! l7 g
#include <sys/mman.h>
# ~& B4 w3 }. P. n! e+ ^2 H
#include <sys/types.h>
4 O, z7 i9 U4 n3 ~) E/ b! X- z. W3 s
#include <fcntl.h>
2 i- y* m, s! [4 Y o2 O, m2 {9 U
- q$ v# ~& e _' P6 h) K0 t
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ e- F9 ?" e/ @+ s5 U: z
#define SHAER_RAM_SIZE (0x20000)
' B' U* A4 F4 Z% `- N# g
; F3 n2 U1 J: ^: B8 m1 k
typedef struct
( H' [* L/ s7 t7 z% }! o
{
3 F8 ^+ b6 _! A8 M
unsigned int a;
" d) D1 F. q$ {& W' p8 d
unsigned int b;
& K% |0 \( u" K1 c& z
unsigned int packet_cout;
7 F9 V, e! F g' h: D& s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% h, i! X- `) a, b" q6 D( F
: h8 y$ P7 H; G7 N& k; A8 g. M' h* |4 S/ n
void read_MSG_buffer(int *baseaddr);
+ x* ^3 I/ x3 [ ]
unsigned int count_copy = 0;
, |0 j; n( y# N$ d1 r6 ~% Q
- |/ n. }" q3 w+ M4 n( N4 v
int main()
; Q( B2 ]7 I7 W
{
3 \2 e7 B% j/ [& G4 ]+ n$ k
int fd;
1 }+ B- o& X5 F' F; O8 X
int *mem = NULL;
( W) i: F/ B4 Z* O0 ]8 s
, s3 q5 i- F1 K; A. R1 j" t& W' q
if((fd = open("/dev/mem", O_RDWR)) <0)
0 z8 u/ u. q' j$ X
{
* N, F1 u4 a* }
perror("open error");
, o* J6 g( p3 V8 S/ Q, d
return -1;
# a' g: z: }9 H8 l6 k
}
9 w$ F3 E; u, P I8 Y4 @
w) I) t5 K+ Y/ O
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, E$ Q: q- a7 d: _; F0 r
. r/ r( P( C! V1 X+ M
while(1)
. A6 g) o$ A* Y
{
# S) o6 h- C9 e5 Y
read_MSG_buffer(mem);
- l9 F; L, g2 t- V
}
?8 s, f3 T& O! l( j) O" h
}
' c3 [, D. g7 Z1 \* o( Y
$ g% m! _& z2 d8 j- n% l7 S) `% f- D
void read_MSG_buffer(int *baseaddr)
% b$ d1 O9 m) a7 {2 m
{
+ P' d% D2 V$ @8 s- Q. g7 |% O
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 p' }- z1 r" s( K# k8 T( x
0 b9 P* D1 E, f. u7 S" ]$ @3 s# {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" K A5 |/ V$ {' y" @6 y
8 a' ^/ @; N. P" i
if(pshreRAM->packet_cout != count_copy)
' k$ A% J9 y: l% t! _+ a
{
5 B; _& C' p5 V# _% J% d% t
printf("a is %d\n", pshreRAM->a);
/ ~% \( c* K4 o' l2 r3 p
printf("b is %d\n", pshreRAM->b);
( z) J3 }# h' y+ x5 ~
printf("count is %d\n", pshreRAM->packet_cout);
4 K: B1 N: c0 W
count_copy = pshreRAM->packet_cout;
6 r$ \& d0 K, g! k/ ?4 E
}
+ q/ C1 M: z. |% R u: ]
else
( q0 M) }: @# V( T+ @" Y
{
7 e U$ h4 }+ ^) T. u/ Z
printf("No effective message!\n");
4 y1 j7 Q/ B/ z/ u: n$ B5 U+ E
}
9 M3 ^# j* @3 ~; C; S
}
8 E' u& L5 O' {& z! [" J! y
/ v" s- `3 K, v1 k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. s' V* U& D3 ]; W. r
( O- _: z. u" B0 g: f, C; T7 o) Y7 ]0 x, ]
2 N! I7 c6 Q$ ?) Q
" a! E+ K, b# E$ ^6 B
' M/ {, U0 F6 i" ~/ j& `, a+ u
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4