嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 ]3 F2 l% ]/ t
8 F' S2 c2 ~( ^4 K4 M7 ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% r$ P, ~. r, ^' d
#include <unistd.h>
C3 P2 z" E+ C' \6 Z$ c
#include <sys/mman.h>
0 I& [+ `3 ?8 z9 G+ p4 f& Z
#include <sys/types.h>
. K# V) f8 ^! Q' |$ P
#include <fcntl.h>
3 q: ~- c6 _% Z X" s
; \( l* x F' g# e' G, |8 H+ T
#define SHAER_RAM_BASE_ADDR (0x80000000)
j b* D( {$ x5 q8 p" R7 W4 f; q
( O( b: N% i) L1 O$ R
typedef struct
0 }& V) x* }0 F0 e9 ]
{
0 @4 v. {* V# V
unsigned int a;
5 u! L2 A: o8 v
unsigned int b;
6 E& K4 D8 F3 T
unsigned int packet_cout;
# I0 _/ ~( q* p* {- ]& ]. L/ D5 O% d0 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ ^3 ] X8 R: ?' M, `' d) G2 m
) z1 F) u+ ~2 I- B2 e( s$ q4 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 V/ {5 g/ L& O- @. X
unsigned int count_copy = 0;
3 C& F, E9 v, b7 [1 H1 @% S
5 T. G" r6 C5 e' V* M6 N. s1 @
* V% a! {: R7 G7 s
int main()
1 I/ X& V7 L6 t$ S; _# O8 _
{
1 V# o1 c5 P, N
pRX_MSG_PROTOCOL pshreRAM = NULL;
" N3 T2 H3 R; k
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' y; H! P4 E1 _6 [9 B
$ ?* b) b3 j4 O. x
while(1)
1 Q1 G# m/ s# Q' `7 v- t t1 h3 ]7 {
{
' K8 q- I! Q+ e7 j; q* t' D: }& S2 C
read_MSG_buffer(pshreRAM);
; j, V) l- I9 E& U2 a @
}
0 e `: ~( g& @) b
}
) Z6 S+ c+ S" B; O3 X& k; A. L
# J* ?5 }5 }$ l3 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% m9 H! E4 P" g q# S0 S% V, W
{
8 x& t8 g+ {2 J: u2 k! T
RX_MSG_PROTOCOL buf;
8 V( E+ k+ {- C: J: K |
3 P2 P, I/ J! l4 w( }5 S
buf.a = pshreRAM->a;
1 ^; z5 k1 Y+ g
buf.b = pshreRAM->b;
2 D" j; d0 ~+ @! u( I
buf.packet_cout = pshreRAM->packet_cout;
+ _4 l) e# u8 M8 n/ ]# U
6 J# m! R7 V; o4 n; X# L
if(buf.packet_cout != count_copy)
9 M! k" J' K* j/ {, ^, N5 ^9 M
{
( G4 p8 I! y* o& W$ Z, W$ j
printf("a is %d\n", buf.a);
; h- t! a" n& R& L$ k& w0 O
printf("b is %d\n", buf.b);
! A/ j' g+ b4 T$ u" G; l
printf("count is %d\n", buf.packet_cout);
! N7 E6 G/ L% m. O
count_copy = buf.packet_cout;
" |+ F8 D; K0 M9 k
}
+ \6 [$ I$ u" T7 g1 V4 `
else
2 W3 l( I) X z% @6 D
{
9 o, m! t }3 t7 `* [) d
printf("No effective message!");
- g6 K! I( [! `& R6 c) K
}
) z. _0 P$ s/ Y9 O
}
; [# P8 r6 @' }7 S! O& k
% Z/ l% b6 t3 I5 \4 b9 f1 S
; u: n# `9 r& Y: W6 w1 |' y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ O" f2 k( _) l$ N0 p
使用下面代码,对内存使用了mmap函数后:
7 o5 F5 {* X9 h" S6 X
#include <stdio.h>
( I! I1 F- z5 B7 N4 D* n* p% D* q
#include <unistd.h>
6 i" K1 ^* H) ]. ]3 j
#include <sys/mman.h>
: X/ n( N' l5 W' i- e
#include <sys/types.h>
4 Y3 k% t: v8 ^& d! K' }( r
#include <fcntl.h>
A8 w3 A5 o2 Y6 M4 M9 E
% J2 ~- X9 e+ v) Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 c& d3 M& T- E9 H; b
#define SHAER_RAM_SIZE (0x20000)
# T0 }. U: J {6 o% Q" R
1 R5 N( s4 D6 l: b- u
typedef struct
. x( X! W; f1 T% e2 H2 L1 l. b* ? a
{
! w8 ], `3 v. y0 S& S- K
unsigned int a;
. U( W) r9 f3 f' j- E# u* X. ^
unsigned int b;
7 i& j3 X! W$ o$ S( s ]9 s4 O" Z
unsigned int packet_cout;
/ i5 }' P: O$ G- F% E* v( C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! P, r/ I7 M* e
) o* q: L- _% E7 }! X; T
void read_MSG_buffer(int *baseaddr);
- e$ }0 U- l: z2 a
unsigned int count_copy = 0;
2 L' R% [+ e8 Z* Z# U8 M B: ]
B% Y8 \4 X5 x6 ]* _* Y
int main()
4 _9 I1 }8 Z1 x. G5 T' ^
{
3 f8 I& p. F& S4 T- B
int fd;
4 e' [, Z0 \& {! Y$ v) _8 `
int *mem = NULL;
5 i, |+ |: a6 f7 }- }+ J! u
2 A( N! m$ M* `, O2 e" W
if((fd = open("/dev/mem", O_RDWR)) <0)
# ~) m6 N4 y6 {( }/ i
{
! }( f- j8 w. E& ^4 j6 H/ V
perror("open error");
0 I/ E+ S# c* E3 N
return -1;
) I/ j+ ~% a# _3 j' j
}
9 \ k o' L3 X$ [2 d" n) R: K* t
* _$ r) G/ _# N- [* N4 L
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 `2 w1 O0 f$ I
- W- R/ e/ k9 ^# v. ]6 \
while(1)
: f" b G( a/ f4 ]8 H
{
7 D) K( ~* N3 b4 H2 [5 y
read_MSG_buffer(mem);
, A1 x6 w4 B+ s$ |: F3 u4 } e
}
5 V2 S' ?4 W: @4 t* K6 d! B
}
, s! |% c* X' l* ~
1 v, q3 I# F0 Z( Z. j
void read_MSG_buffer(int *baseaddr)
1 X9 W1 T$ R3 v' ^5 ^" A9 j& f C
{
0 f3 C9 b) O4 g* W
pRX_MSG_PROTOCOL pshreRAM = NULL;
. r0 O+ S5 R- i
' j* Z: M, t) B" W5 b/ N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" h0 z9 z& n3 ~2 }, U5 J' z
/ r$ L% ?4 Q c0 u9 J
if(pshreRAM->packet_cout != count_copy)
# R' z; C- W$ Y; Y/ ~
{
& y1 h1 o0 E) B; v- w3 _
printf("a is %d\n", pshreRAM->a);
- P+ F/ U7 U( v5 |
printf("b is %d\n", pshreRAM->b);
1 @& }/ F8 y; h8 [' z* M
printf("count is %d\n", pshreRAM->packet_cout);
& i2 x, i+ l' n" z9 B4 }
count_copy = pshreRAM->packet_cout;
7 z: l4 Q# K, \! K& F
}
2 _2 b: Y$ z1 _: o0 M o! I
else
: H: h$ i+ |! c' ]
{
- |" ?$ l1 c3 N
printf("No effective message!\n");
% N c3 J) D! \. A* E1 ~. ?2 ]6 D
}
* [$ p2 f/ [8 c) C3 Y1 n6 z. S# R
}
/ I- s" t3 n, Y$ F9 N3 w& q1 ^
& ~& a: z$ |' O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ T) w( x. k9 ? \" A: ~) @
6 j' r. `( F/ t6 K
; t7 X# ]% R [, q" W. ]* P2 q5 }
( T4 ]$ z2 g- _; q' Y% b3 t
; b( G3 `, ]. c: A4 D
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4