嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 m% s' ?: t6 n7 l: ^
2 G- m2 ?, c6 A8 C. ^0 Z3 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ r/ T- D. @0 M7 b* o! K; `
#include <unistd.h>
' w4 v& Q( b& I% H; i3 c
#include <sys/mman.h>
: a5 E3 H9 Q2 ^, v4 Z. `
#include <sys/types.h>
$ {7 I% c4 x1 h
#include <fcntl.h>
6 [! k: ]+ ]8 Z; h0 X" ~/ C
# [8 q m9 P4 H" @; o5 o
#define SHAER_RAM_BASE_ADDR (0x80000000)
& s1 |3 e) Q6 u- L5 e3 I; P# J
* p# I; G0 }/ i* L6 u
typedef struct
3 \" d+ B9 @+ K" H& k; O" x0 x# p
{
# W% a' Y! S0 w* N
unsigned int a;
5 Q* x" K: `1 c) y+ e: l4 E
unsigned int b;
. |7 o" P$ N1 o% A$ t
unsigned int packet_cout;
5 }) [1 E( G' Y. W# m; S! I l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 }) ~; r+ U4 {
) J- d9 p" F9 W( ?, l# x z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: d$ ^' S f3 q' U* c; O) i9 t4 _: j
unsigned int count_copy = 0;
3 j \4 Q0 M9 D$ u$ C4 S
0 B) b6 V) n! V0 c
, {/ B- B) N# N; f4 ]1 p4 c. s
int main()
5 {) d$ {- U3 T0 c* K
{
6 L# T. \# m" w, D( L
pRX_MSG_PROTOCOL pshreRAM = NULL;
" @% b; g8 R' W3 J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 `* Z2 M/ W- m/ J0 V
2 k6 v4 j0 ?; s- Q+ Y
while(1)
! [4 g) k" J; u/ w/ G! K
{
* Q) S* c: e+ r. H' Q s/ i
read_MSG_buffer(pshreRAM);
$ h' Y- c( _* O4 u
}
; ~* _8 _& e8 m4 b- e$ W0 d
}
$ c+ p$ n- t3 T8 b- K4 C* d
5 C3 a4 {- _& H! C: u8 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# Y1 o* j. W9 f- H ^ A
{
$ J& t. O" j! ?+ }* T
RX_MSG_PROTOCOL buf;
5 i1 ?% U7 F5 p2 ~( e- A# E7 U
+ O* H R! j: L F
buf.a = pshreRAM->a;
' G' k$ |. ]9 T9 i k5 h4 j
buf.b = pshreRAM->b;
8 X/ A# I6 Y2 B) a" y9 T% f
buf.packet_cout = pshreRAM->packet_cout;
1 d6 R! p% f) A. p5 q% u+ U' a$ V% H
+ [ O; ?3 @& R
if(buf.packet_cout != count_copy)
$ x* i- j1 U4 C# G% F2 t/ K0 ^
{
+ X0 N. q# S8 }* T2 M8 H* P
printf("a is %d\n", buf.a);
5 n4 l: O B/ A% x
printf("b is %d\n", buf.b);
* E& w% U) Q1 {7 f: ] z
printf("count is %d\n", buf.packet_cout);
, P8 c5 e; ~: y8 r o# b
count_copy = buf.packet_cout;
- i$ _6 V9 Z! z7 Y& m9 r
}
$ K+ J' h& g& L+ H
else
+ ]: T8 ?$ Q ^! v
{
1 ?! T/ `4 t9 K# S0 M
printf("No effective message!");
, n! Y( ?/ i" E+ A3 O( q
}
" V6 B7 w! z- h1 }( F7 a; _
}
4 k- R' n2 b1 {* E
. |5 T/ K) ]$ K' d: _
! r4 L, P* n/ e" p
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: G# a7 w2 d+ P4 H
使用下面代码,对内存使用了mmap函数后:
1 L; _8 ?# i' |
#include <stdio.h>
& Z/ S' m3 e* a3 l' ~* ~! c
#include <unistd.h>
2 _% t1 Q% G# \0 T, ], F8 ]
#include <sys/mman.h>
. q |; s9 P: w% N" f
#include <sys/types.h>
3 S0 z1 [$ n; `
#include <fcntl.h>
8 }- L; a* }2 S/ I( F; q( j
1 L( d. _$ C1 \, g" X
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ ?7 V$ Z; C, S: j* s: W
#define SHAER_RAM_SIZE (0x20000)
$ q' J: w J! O; y8 |+ U
' j' L" ?7 K/ ~1 c8 S( d; n- H
typedef struct
" M% w$ F" }/ I0 Y: P
{
: a3 Q# [ C9 T0 L3 U
unsigned int a;
; h8 j8 L4 T; A# G8 D% @5 z
unsigned int b;
# P3 w1 ]) C- p4 I3 {
unsigned int packet_cout;
* z0 I u9 @# V6 ~& f, v5 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 Q9 P7 \$ X+ {! {
: W& J- o- m! }" O4 v
void read_MSG_buffer(int *baseaddr);
/ U X3 m) E( R( Q+ A
unsigned int count_copy = 0;
0 l7 t$ c- i, O0 {- \
2 C2 G8 ?( T6 D5 [. J9 `
int main()
: c" ` i9 f, x- b
{
( V9 b3 i$ M2 ?* ^% ]5 \& k
int fd;
! u4 @" m% G X6 E% [5 J
int *mem = NULL;
* d" [/ `3 w3 O: S: U+ Y
4 s: j. U, _9 V; C. ]
if((fd = open("/dev/mem", O_RDWR)) <0)
- [3 C6 O" H+ S
{
; m! d2 Z. t# H
perror("open error");
; a |/ r7 P Q& z6 D. C* r
return -1;
& V) p8 V! _5 k4 y& N
}
+ z3 p9 t8 l% k- s" X u& x* f
1 J8 m. E8 y) E& |# G9 H
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# `2 R0 F h- x; `
, o1 J% d( e/ V
while(1)
: E' `' s& q1 M& J: L
{
) U' H, r; g: z. H3 X+ j/ z [* L
read_MSG_buffer(mem);
: H+ A- G8 ?* A, h9 C0 H
}
0 L6 Q$ P* T6 h! S
}
( }% X4 }0 M' a1 L6 J
( _/ z _2 b: T) D) m: x
void read_MSG_buffer(int *baseaddr)
9 o! m3 c" V* F
{
8 z" ]- H9 a+ k$ y1 w
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ y2 R. I% L! [0 S% V8 h( A4 x8 v
o- Y, H0 ?' y+ j6 r* _
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& ]$ i/ Y, L: M! w @$ z4 i/ i
: }8 W* r8 T- I+ ^1 @
if(pshreRAM->packet_cout != count_copy)
{% i4 D! Y; Z6 W
{
i* ?# w. ?& `4 m% z
printf("a is %d\n", pshreRAM->a);
2 ?& [/ I6 O" f! X$ x1 P m
printf("b is %d\n", pshreRAM->b);
; a6 W. ^' p% P |0 ?7 G5 R
printf("count is %d\n", pshreRAM->packet_cout);
7 i! S+ y4 F! j# g/ d
count_copy = pshreRAM->packet_cout;
4 |% t) b, a& T% M" z; }
}
* }% r" ?, Z# c& S2 W
else
. S0 g6 V5 n% |) A, ~ L# Y2 b0 C% x
{
; K3 q6 C5 i7 Q6 P
printf("No effective message!\n");
' r \+ F) X/ s. j/ z
}
6 ]- z) L, O3 W+ K" ~
}
. N- h- Z6 B8 m+ W! E3 K" |
$ a. V1 [4 G: j% e1 `4 L# V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ f) r. w! b$ q0 ?9 H% F
) w. ?! d4 q- \' Z2 j
: Q" v4 E* Q6 R4 h0 B
% Y3 D2 f5 y$ f* ^# \
& i8 ^7 T7 d6 v+ n; k
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4