嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& [: a4 E1 `5 l0 I3 c
# l6 q4 [: W7 ?8 q2 H1 S4 C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) A* @7 E% C" h' A3 `' {
#include <unistd.h>
b; ^0 t+ v5 g6 z) m' j; i2 J9 C
#include <sys/mman.h>
$ P! G! \3 M0 s& L% N- I
#include <sys/types.h>
! E' \) a" ^3 W4 H, m
#include <fcntl.h>
$ N7 |7 G# j6 ]8 u* L
5 z: n+ }# J7 [! [6 b
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 \' L2 r2 S+ V1 ?6 d! D/ k
9 U. F% `9 G, f/ l- p
typedef struct
6 ~& b& r: M, i9 ~7 M/ O( I3 f
{
+ W1 }2 H8 P6 k' ?# J1 F
unsigned int a;
. _ P; a# n% A
unsigned int b;
) t7 E3 w: w6 b" B5 {7 p7 l! F
unsigned int packet_cout;
: b" h V% x/ u/ t/ \6 J6 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
E7 z- S, } Q1 O1 `8 q) p
1 k B. N9 p5 g" |2 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ A3 F% k0 l; [" a+ p" N
unsigned int count_copy = 0;
5 m) o6 H# K- P5 o! M
6 o, W% K6 \9 A' P8 E; T1 H* J
3 A4 ]5 W( \: d% h( R
int main()
" ^. q& |9 e3 P, D
{
9 v$ N |0 _- K) X
pRX_MSG_PROTOCOL pshreRAM = NULL;
, q1 c; O5 N3 `+ E) T
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
i& A. Y. i$ o6 f L6 {; ^# d
- Z. }' l/ t. a0 A) V0 _
while(1)
' z U2 P% ^6 H( ~# }+ c
{
( O; o+ g1 L5 _, E" S7 \
read_MSG_buffer(pshreRAM);
( Z/ f9 Y) `$ U# T9 B% E! Z
}
3 @$ B( l2 H- }) V% A# ?) ?" g
}
5 h/ [, e1 ~: }& N0 B: G e
, f, L, }5 F# d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
L; z+ l& p$ c1 d1 i) p
{
2 A4 S; }9 _+ u) y9 T$ O
RX_MSG_PROTOCOL buf;
& I& u( y6 b% X* l% a5 u
) o4 K; l* L, t
buf.a = pshreRAM->a;
; P# x, J& i0 d
buf.b = pshreRAM->b;
" r4 `6 L9 }; y
buf.packet_cout = pshreRAM->packet_cout;
; x( M) d5 d9 Q" w
2 O W3 B( |' F) U
if(buf.packet_cout != count_copy)
5 N% F0 p2 ]1 _1 Y) C
{
8 {4 X5 i- G$ a8 k+ n
printf("a is %d\n", buf.a);
" d! }& ?! c! q, a9 q
printf("b is %d\n", buf.b);
4 q, s$ i" m, E4 l# U$ A6 s
printf("count is %d\n", buf.packet_cout);
& a2 C! N* @+ |0 u
count_copy = buf.packet_cout;
2 E, n1 F5 G" a- J6 m
}
% r5 y/ F) U. Z$ u
else
) ~1 x2 V/ c$ [3 t: W
{
. \6 U! u$ a- C8 z R
printf("No effective message!");
! u) c1 k- p& I& m# m
}
^7 B7 ~, G* Y6 {, c
}
/ r+ {8 A, I6 U
$ C% ~, c# u" A3 q/ ^/ l( k8 k
5 Q; r; c4 c o a
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# c. x/ y! y) F8 j2 K0 l
使用下面代码,对内存使用了mmap函数后:
% T9 t; O4 }0 M9 e4 V# G5 ~7 j
#include <stdio.h>
, S( {% r4 X$ @: C+ ?, P
#include <unistd.h>
, Q0 G: ?" ` u; n" U) K
#include <sys/mman.h>
$ C4 g7 Y' i% o: w% H& u
#include <sys/types.h>
! f! ?' n1 M$ ?) g/ H
#include <fcntl.h>
5 C6 d" l& Q& U: w4 H
+ l: `! a- |& N
#define SHAER_RAM_BASE_ADDR (0x80000000)
, O4 c* |& S' X, Z
#define SHAER_RAM_SIZE (0x20000)
! Y; X* G/ y2 b( z$ n
0 c3 P! N' X$ q; ]! H
typedef struct
9 U/ \% m# o8 ?* B' S. v2 F9 \' t
{
( @7 |. b. A* E( m4 J! a2 c! ?
unsigned int a;
$ l7 P3 _) h; u& B& u* E t8 F) c
unsigned int b;
- H" o# I+ j A$ s- A, B
unsigned int packet_cout;
5 k2 f# V6 H& ?9 m4 R5 v8 s9 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# ], ]' u4 t& }* U5 s0 m* C
, S+ e" j) A% @% d* c
void read_MSG_buffer(int *baseaddr);
9 e: [8 x# d0 O
unsigned int count_copy = 0;
0 u) m3 F+ X3 ?) f/ X3 x8 n
5 k9 l4 v" I* h
int main()
+ g3 S/ I$ U `+ @0 I* E. |
{
& R: f8 G/ j" y0 q% X
int fd;
; Y6 q A B: Y1 U2 w: d9 m
int *mem = NULL;
- s" b4 e$ W( L) ]
8 j1 U+ B7 z5 F; B) G
if((fd = open("/dev/mem", O_RDWR)) <0)
! w& ^) u0 }( q9 l% d. X6 o7 S
{
9 {, ^7 z, C7 ~5 w6 v$ N4 u
perror("open error");
0 N2 G' h0 y" \! e' y
return -1;
, W) q- s3 t* {) e, j4 s
}
" C) Z# u% z; [# f8 ~
" F1 r: m# F5 C( h
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' I; P: L0 Y! k5 B1 [, D9 ?/ N
# r- _9 @5 P, U8 \# s; ^
while(1)
! k; y& f; I0 B, x1 p
{
" H. a; K6 D9 M+ W7 N9 h" n/ e' y: Z8 {
read_MSG_buffer(mem);
% C' v0 h1 t& _4 N0 S/ w* J
}
. ]$ |. s! f" V: }
}
2 u6 g5 \0 j l+ o9 l! w3 x8 ~% v
7 }% s4 s* Y N3 ^
void read_MSG_buffer(int *baseaddr)
) ^: t( \! X4 j+ [- Z& C2 ^
{
9 U) T' D% D/ \- w/ F" Z8 X
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 w* E# W0 d( ^8 N7 W: |% p' G
t# n; Y k& c- v4 i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( [# `( P2 P% j1 {6 f# k( B
: t$ V: B: G) F0 Z& n( @- R, s
if(pshreRAM->packet_cout != count_copy)
! B% c) `/ O$ _' a7 }! K" [1 f
{
& N4 m( ^& Y- c9 k; L2 T) Q- }
printf("a is %d\n", pshreRAM->a);
: p# V2 W1 I. g: w3 E( D. z2 j- G
printf("b is %d\n", pshreRAM->b);
9 [8 y% Y- k' l h- N- p
printf("count is %d\n", pshreRAM->packet_cout);
7 Q: `1 Y) B+ Z) N! [5 [
count_copy = pshreRAM->packet_cout;
R. t3 s, G$ r% Y) o! T* O) o
}
" g: G" X- V% @! R3 N. t
else
/ }+ Y5 j, J) D1 _
{
& L% D2 O ^9 Q0 e7 c
printf("No effective message!\n");
* J6 w) O4 }( G' E" v) i
}
E. S& w/ t& s! B2 _" W% [
}
0 k" T4 u6 N5 Y4 {- I( l
4 Q# o# L- l# f f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
U8 E$ i- W9 p2 T1 V
" ?" r2 P+ U) p# \2 H' K
w* c. {. t$ u5 w. B
& `* J2 a0 v2 R
4 G$ e2 P. Y2 M4 j) K$ y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4