嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# A: S" o: ~/ v4 I9 G# |2 j7 ~: x$ \
! ~! {3 [, H" F; D/ B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' @, k( N5 i* t# a i
#include <unistd.h>
- K' d- R0 }; J& f1 x
#include <sys/mman.h>
~, O2 _& ^6 L
#include <sys/types.h>
" {8 n& d) V: R9 ]
#include <fcntl.h>
( x' F5 T) B( r, _8 o' I
9 B: S s6 X+ Y/ k# y" z
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 @" z9 e! i) v
9 e9 h( d# k- a0 t9 I
typedef struct
+ _1 Q# d% G8 g- ?- [: D* v
{
! Q7 P$ V* i! ^) E& ?
unsigned int a;
4 h! a# H+ @0 b
unsigned int b;
) |% _( t/ h6 {' X, K- J" ?( k% J" s
unsigned int packet_cout;
% d2 i" O. O& E) \% J$ y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( d8 n' o5 {0 ~% E% K I0 U
2 K! |7 V$ u5 W. ]- v9 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 y2 ?: I7 j& B W" o, _" w* D/ l: U
unsigned int count_copy = 0;
3 }+ q1 `. P7 d4 o' k
! ~- y* N- G; p$ l- L. r2 k$ U
$ ?5 y& F. e9 }
int main()
1 b& l! d2 c, j! A! Y% c6 W
{
7 C. O4 u* B$ U% z ~
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 G3 S0 m! l; j' i6 ^1 I
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 e8 s) @" v3 Y7 ]8 _
8 U7 a1 R, E* Z: K5 X) t- M
while(1)
1 |& F: j9 u' F* m& b$ F% h4 B
{
8 {( P) d8 M& j" I" M [* p6 L
read_MSG_buffer(pshreRAM);
0 ]: ]- f1 z8 J
}
2 F! M- Y+ H/ S9 a" {" w
}
( l' r: v/ F) }6 }5 W
" m( P6 D* {7 t) d5 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# M$ Q6 V6 H. q$ F2 N* _6 M
{
* a# m! N5 F9 }4 ^% g6 T% c
RX_MSG_PROTOCOL buf;
P. y! E9 G4 ]( ~; E _" O
: {( |7 c: e; E% _7 q3 b0 U
buf.a = pshreRAM->a;
( L* ^: D) ^/ c4 ?0 b) s& j7 y/ Z
buf.b = pshreRAM->b;
( O I' b' ?7 i9 y7 H
buf.packet_cout = pshreRAM->packet_cout;
9 T& ~* l) t' N
( Q+ D" l% `6 W( m; q1 j* B
if(buf.packet_cout != count_copy)
2 o d- c# ^* W% m3 ?3 N' ` o5 I6 c
{
$ r9 @ ?* T& h$ K: P9 R2 g* W! O
printf("a is %d\n", buf.a);
8 s1 R) m% X2 P2 G
printf("b is %d\n", buf.b);
; A6 [! s* y# \7 M3 s
printf("count is %d\n", buf.packet_cout);
1 [; a) J- x7 |! ]
count_copy = buf.packet_cout;
2 \; t8 B9 \$ h7 @. T' t
}
( a2 S' ?, Q1 K% s
else
k( z7 U* m/ k' ?) ]/ U5 }( ?
{
4 v7 k/ L0 F: {3 w. t+ s
printf("No effective message!");
. k% ?# E: c1 Y) B1 a" L
}
2 A* D+ L+ ~0 s& I/ W; b
}
0 l$ Y1 ~5 e7 l; @; u
6 x6 g+ \+ J0 x, _
3 u, c% f0 c6 L& [; F# L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ _5 r& ]% t: x; i3 O! x+ X
使用下面代码,对内存使用了mmap函数后:
& n" W) K# P" Q5 I4 K8 q: G
#include <stdio.h>
; O; x7 d: g1 a& G: L ~8 t4 d
#include <unistd.h>
/ N9 m% [2 ^3 a, J/ Q! ^8 U
#include <sys/mman.h>
. w! v, t% `+ I% T
#include <sys/types.h>
* G, t' V- u E7 B- W& }2 u$ |
#include <fcntl.h>
( I5 u% T9 d8 F3 o0 u
! }9 F1 g9 a0 k) H6 E! K
#define SHAER_RAM_BASE_ADDR (0x80000000)
, ] g K4 V: Z# A% m0 {
#define SHAER_RAM_SIZE (0x20000)
' j! O4 ^# _7 N1 C
5 X- p! [3 I& m
typedef struct
0 z9 a! z e" W0 [9 v, b$ g* Z/ z
{
5 O6 i" p6 j W/ d6 \! A0 I) P
unsigned int a;
- f1 ?9 j: K' [4 `3 i5 N
unsigned int b;
7 k# V# n& i+ `
unsigned int packet_cout;
; s6 z+ G. k+ Z/ t+ A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 T" {! v; H% T1 w* X
8 _5 n; ~3 r' V/ U2 R1 s0 ~
void read_MSG_buffer(int *baseaddr);
# I' l5 j' y4 X/ P) \( g
unsigned int count_copy = 0;
+ `7 {3 G% C* K7 p O w8 N4 W- [9 i
( m8 L$ w$ a( w1 |5 p# n6 S
int main()
9 U, ]) g9 ~$ g) L. \- m( {
{
1 K* t- n. o5 n" t$ N% Z
int fd;
. b5 ^5 i9 q# _( D+ _& P3 Y& ?: N
int *mem = NULL;
) l! Q' F) Y3 C" f2 G4 k
$ L/ ~4 Q2 B s+ h
if((fd = open("/dev/mem", O_RDWR)) <0)
: R* R0 D9 b* f8 I3 ?& {
{
* Z* l& p& ]# {+ ]8 r" M: }
perror("open error");
- `4 s. {" W5 e( o& Z
return -1;
7 o7 _- @; o) s6 E# U
}
8 f/ [1 e2 ?( m# [ H3 K+ K d( @
: u, M3 L' w- u+ X6 L) Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 S& x2 H) ~7 ] F# ]& f- k$ E
( y+ k, \8 r A5 y# ?
while(1)
: W' X V5 ^* [7 D2 Z
{
: P J% j' Y7 ^! m5 K
read_MSG_buffer(mem);
2 I: a' T2 ^* v& P
}
4 c1 j- K/ x- j( X: B) Y8 z
}
- r4 L& w. }4 J0 M' B' ^
: O4 w$ O* @5 F1 y" R
void read_MSG_buffer(int *baseaddr)
( ~* y1 S5 J! E4 Z+ Q8 t
{
3 r, i! I8 x: W+ M; B0 p
pRX_MSG_PROTOCOL pshreRAM = NULL;
, [* o* i* e9 F# e; u
& A l( l6 s# x! k2 R/ E$ ^$ T
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 L8 z6 E: \8 x. s/ G0 E+ ~
+ |' w, }; Y) N1 |+ l
if(pshreRAM->packet_cout != count_copy)
: h# m* ~9 o- z/ f9 C# }
{
2 h! j' S/ Y4 R D# s
printf("a is %d\n", pshreRAM->a);
7 |0 {2 |) G1 M' ], V% k+ ]
printf("b is %d\n", pshreRAM->b);
2 a4 Y% ~' u9 w: `# ^
printf("count is %d\n", pshreRAM->packet_cout);
1 R6 \. l* a/ u$ ]0 G) S. x
count_copy = pshreRAM->packet_cout;
* k* m( S7 j; x2 \7 m
}
$ }% `4 s6 ]' F/ v) i: |$ [
else
- z+ I2 U3 k; |, O# C
{
' i8 y$ J0 E* M' \# B! n6 r! y" [
printf("No effective message!\n");
$ _4 Q& ~1 o% q1 n5 ]/ f
}
, v' |, C( }$ `) C' R
}
. D, p4 l! \' q7 E! y" r6 W6 X- D
* ?& _- O" g" z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( l* a, |: ]! `% ]/ c
) r; a' g5 O8 w! h) K
4 ^2 l% M, L2 F5 T" e- l
x! R# z1 Q* q! Y( z' q/ I
4 v( Q4 o9 D; |- B) o
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4