嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# E6 Y2 J( |1 l2 `
7 K! h, ?7 a( m0 `/ ] g. P3 z9 `. F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( m$ q- L( X* G+ o( B# O
#include <unistd.h>
, X3 b4 I! `- A) `& ?
#include <sys/mman.h>
% k+ ]; y8 f" B% G( ]3 I
#include <sys/types.h>
6 ]/ p2 E( T' ]8 N2 W. `) M+ a
#include <fcntl.h>
6 }: l9 w$ N3 D0 E
. _& y, I7 d( C
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ z+ y, w7 P# T6 ]. P8 m) L4 @: r
5 ?8 R) y. d# W: o* L, l$ |& i
typedef struct
& ^, Y4 R4 Q$ C5 @
{
2 G# H, [/ R) ~; Y# b4 L
unsigned int a;
- v/ f7 h5 |1 M6 H$ M. c
unsigned int b;
0 }! D4 W& Q6 N9 ~
unsigned int packet_cout;
4 I' G7 f; b; {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' j3 ]9 }. t3 U3 W
1 p; }- F' m! N7 p) S- a6 S: v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ [/ O" L$ o+ f" c3 |0 f
unsigned int count_copy = 0;
; n& n5 }1 B# M; ]4 I2 I
' ~ Y& r) {0 ]- U. z8 P9 D: p$ u
' s4 k3 ? k+ V3 m1 z
int main()
, V8 d/ q' U4 n2 A$ v3 Z Y4 r5 d1 I
{
+ [1 X' X2 c: o( f+ ^; E
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 S9 Z! s0 B3 q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' P9 t9 M2 |; p, }( ^; g) }
6 S" _" K2 ~3 q2 I. G
while(1)
1 w7 X5 K+ ^9 l. d+ X2 W+ {+ J- u; U
{
# j& D4 f. k/ }
read_MSG_buffer(pshreRAM);
. w: S4 u2 q+ _" ]( |
}
; j2 {* ]3 a8 V) B7 x2 Z
}
- ~) K0 h" D" g0 B5 M
- G6 w5 Y( J% u5 ?. j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) W& |, l9 N/ J# Q' C
{
* _8 Z' n, ~8 r7 q5 H) [8 p
RX_MSG_PROTOCOL buf;
) U0 z2 [& C* H5 f) A/ s
1 }9 _4 X1 {9 i% C# R# `& L
buf.a = pshreRAM->a;
* w3 B* {3 T: ?
buf.b = pshreRAM->b;
4 ~7 |& `# a4 [( g- C' Y
buf.packet_cout = pshreRAM->packet_cout;
% v# `0 j1 } [/ L. K
4 f( p% L2 i! x! q' ?' n' l- Z* J$ S3 U/ p
if(buf.packet_cout != count_copy)
9 `/ m; Q; k& {8 C
{
' L) `2 A+ V! M! y9 ~0 q$ V
printf("a is %d\n", buf.a);
# @) F, Q4 D4 y) Z$ l G8 k
printf("b is %d\n", buf.b);
: R* T S" ^" M) ]% v1 W* V1 F
printf("count is %d\n", buf.packet_cout);
1 i& S+ B, ^! V* u' ~( z8 G
count_copy = buf.packet_cout;
* y, o! T# V. J N
}
" f) ~* G/ _: d3 S( N6 [
else
: V- n% H7 H7 R' k0 b, y0 X
{
7 d$ ?! }' ~6 i5 H- ?
printf("No effective message!");
! Z k* x; c/ f( y, M( h% G
}
; _, M- e) X- n. h
}
9 A# U+ r5 s9 [% P. x( l
/ r, F3 `& }6 u1 ]1 r& Y1 z/ \% ?
; J$ w8 V# `4 L- f' a( R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ V0 b7 c8 \# m) Q- l
使用下面代码,对内存使用了mmap函数后:
4 n6 l7 n9 k% J( c
#include <stdio.h>
1 B3 }" g$ G( X" ^2 |
#include <unistd.h>
A6 E9 t) V$ j# c
#include <sys/mman.h>
T5 ^# W m5 l, D& l! Q
#include <sys/types.h>
* @$ w$ y6 q+ Z6 m2 J" a- E. E- }
#include <fcntl.h>
+ c7 `6 I$ F4 R% H# C. B
. I" e+ A) Q' P( b7 D+ y
#define SHAER_RAM_BASE_ADDR (0x80000000)
" w) B% P8 {' f. ~
#define SHAER_RAM_SIZE (0x20000)
! M: r- n& O7 r7 ]/ @
1 j$ s' }0 E+ O
typedef struct
! Y% f) r/ M7 y$ X4 f
{
' U3 O; W& |- Z. B
unsigned int a;
2 I% S/ [" A$ s
unsigned int b;
" W+ k/ e' n; c! {9 o: D
unsigned int packet_cout;
5 L$ d% b0 y) Y5 D- r: N0 ]# E% e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& g7 d) c" N3 A
8 ~* w `9 u- [% @0 {7 X. T
void read_MSG_buffer(int *baseaddr);
+ q9 U2 }5 T( @# s% h) X
unsigned int count_copy = 0;
; ?( f; q" o, J8 M5 d1 i
_ d* ^# b$ |- |
int main()
& A! c$ c6 B3 ^& T7 i
{
/ T* h S' x/ }1 r. M, s
int fd;
8 l2 W7 |8 t, C' M6 d/ l* [/ r6 q
int *mem = NULL;
0 y- h9 T2 E5 Q, h! D0 k% B
: F4 U; v J" X4 H3 i4 q
if((fd = open("/dev/mem", O_RDWR)) <0)
* z9 X4 `3 z. D- J, {6 v! P% N
{
; Z* `# s+ \& f
perror("open error");
' N i8 `3 w7 I/ J9 t* q* C8 O/ a6 X
return -1;
; b6 {( \8 s3 z
}
6 C4 @4 V* c0 ~ i1 _! }
! f$ h' j% o; B( [, c
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; l: x1 I9 F1 N* A- N C- m3 K
) f8 F, D2 j8 V" o) A. p" w1 U
while(1)
; U% v# M+ ^: K0 p. n0 [- z
{
! l+ a: J3 h C- a- u
read_MSG_buffer(mem);
; t# h! ]% Y$ f6 u9 m2 M6 y; {
}
X( I1 _: i+ s7 J# [8 ~
}
4 I% Z8 X* {+ @$ B* T
, B& _2 G/ f7 w6 u5 o: Y
void read_MSG_buffer(int *baseaddr)
: S( m" |0 L- s( V& ?
{
% ^: Y6 h: U; @, k/ ~+ x% h
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 N2 N8 X, h1 E, @' t6 c
: V9 d! k: G- v5 L- W; B6 q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! E% l) h' y# g2 K ?. [
, v3 c2 U0 N# {6 X7 i( C8 b
if(pshreRAM->packet_cout != count_copy)
% g3 |. O, s9 Z
{
0 W _! q" H2 V$ j8 E' Y$ R6 r* _* M
printf("a is %d\n", pshreRAM->a);
4 x$ _' r) J& t2 q* o( m3 d7 c
printf("b is %d\n", pshreRAM->b);
5 v! U5 E- h1 G' G* i4 E
printf("count is %d\n", pshreRAM->packet_cout);
% K2 g4 Z0 V& Q2 T$ Z
count_copy = pshreRAM->packet_cout;
# `8 \. h7 ~9 L
}
( N3 D- O3 M1 b- x, G B
else
7 R3 Y3 v* T/ k: m
{
' Q& h4 `' F8 l- }- N5 P
printf("No effective message!\n");
5 U5 K8 h- T. E% o& F
}
( O3 W( V3 I& f, i* j
}
$ H7 f9 N) d" b% C
! h* k: U/ \ ]3 z6 t9 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' \/ I& t3 q% d ?" t* _
$ w( T) Z1 C# M) C% w L; ?1 v8 @# x) n
4 }+ L7 r8 D' _! Y
- o/ n: F' ~+ U, B% p& G
( ?' b6 H$ w, s2 l% ?1 k- n# E
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4