嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 D# n, B: W9 ?; T0 \, F( a/ B
# {+ M: x3 e* X) N2 h8 c+ u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, I2 ^5 w6 B+ P" b0 A. n: a. v
#include <unistd.h>
4 X+ p! a6 K0 l- O. o- p9 W
#include <sys/mman.h>
7 b0 N- X3 ?) g7 J- Z
#include <sys/types.h>
2 U; ]7 ?5 }9 L j3 \2 i
#include <fcntl.h>
7 ]7 w5 h$ Y) a* @" \4 @
2 A# S' b- {: u. q" V7 g( B2 [7 V
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 X# v! _, Z% f7 m7 a
3 v M: S6 A5 P; G+ W' C8 o
typedef struct
. \, Y! A" n! ^& a# v0 c
{
9 `9 _6 n$ \1 s
unsigned int a;
* p8 c, O0 h o9 J8 z2 b, N: j
unsigned int b;
, a, j2 I# i6 Z' \: v( S* Z
unsigned int packet_cout;
, ]" d6 R2 z* r8 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 \# g1 p* }! }- d
1 R- Y/ J3 o& U9 d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 \+ Z: k7 b# t5 V, m
unsigned int count_copy = 0;
' I) x' l( ]0 z5 r8 D. P( X: c
5 ]9 f1 a+ R+ N8 n: _
6 s, ] e2 r6 d$ H! M1 F5 l
int main()
6 Y( x5 Z7 @: O& a5 }, o% d
{
( a& c" \$ i7 R- t
pRX_MSG_PROTOCOL pshreRAM = NULL;
; x' [& F' f( v- z4 N4 A6 |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 T9 l: s/ z P, ^
) ?1 f: C! F6 z$ z R
while(1)
) p6 P& ~0 ^6 { N. I1 U
{
, o$ K& `# i& M7 u. Z6 V: J
read_MSG_buffer(pshreRAM);
; w0 Y9 F5 k( P7 v- g* @
}
p7 k7 B4 R1 q8 J. k
}
$ e+ k: s: C5 @: d; s% n
3 X8 X4 {. I( w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 H. T. E# f' T) n* Z( ]
{
# [1 r: r/ t. ^7 c0 D7 W
RX_MSG_PROTOCOL buf;
7 ]5 f7 u, ~ {8 @! j3 S
& N6 Y* ]9 r% Z. W0 P" ?
buf.a = pshreRAM->a;
, |9 K) n- a) D
buf.b = pshreRAM->b;
" a8 {( U, V @1 K1 g3 @
buf.packet_cout = pshreRAM->packet_cout;
7 V: x7 H- _. M$ u$ k& n
8 _! [, P% y% z3 l
if(buf.packet_cout != count_copy)
2 w: u; I. A; W h `4 y! A% v
{
# T$ \. e6 e! K. J
printf("a is %d\n", buf.a);
* V- `6 q# U/ t# H, @
printf("b is %d\n", buf.b);
, c- F$ P8 w. q& W2 U5 Q6 T3 U0 t( |" Z
printf("count is %d\n", buf.packet_cout);
4 W, U' ~8 ^# W5 h6 W
count_copy = buf.packet_cout;
4 K( J# v- B5 j+ N& C) M
}
1 P* l$ C y, B; \
else
1 B, w V6 l) l& o
{
* ?- E+ O; m% Z4 g+ ?+ a1 s4 l% T
printf("No effective message!");
- t* o! @4 l K9 Q+ I9 ]8 n
}
) V/ W3 e9 c7 q6 m
}
h" w+ @8 w D* u! o
8 C$ ^! b7 P& o1 _) l6 r3 [- ]6 Q
, U0 [8 h9 E1 O7 Q1 q9 m) Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* u6 _' M# t! @! D- e
使用下面代码,对内存使用了mmap函数后:
9 V! ^/ c! T0 Y# w. {5 _9 d
#include <stdio.h>
% T) q, d) u) g/ t; X4 }- Q+ |
#include <unistd.h>
& c/ z) A @% l( P7 q
#include <sys/mman.h>
5 m$ h5 v) V; X
#include <sys/types.h>
! b% {& `9 f. g
#include <fcntl.h>
4 h4 }5 ~3 ]$ k9 s; f& F+ [
3 q5 \1 i9 S8 `( _: d+ q
#define SHAER_RAM_BASE_ADDR (0x80000000)
: e& I0 C1 J( r: h5 `1 f& g
#define SHAER_RAM_SIZE (0x20000)
; p( a& ~6 w! G' G+ U
* j* [3 j" A) I! \6 u
typedef struct
& s, S: `2 s2 w# Y
{
# M1 m# k$ E$ \+ ?* T
unsigned int a;
0 P" K9 h$ f* h3 C2 k# R q. L
unsigned int b;
/ `6 L+ ~) O/ [8 O- [: l( Z2 J
unsigned int packet_cout;
* w! a3 W. C( @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 {3 D' @4 _1 q
! A4 C( R3 u) ]/ D/ U4 L6 ]! r
void read_MSG_buffer(int *baseaddr);
) y5 }: L4 n$ T! o- `5 z8 b
unsigned int count_copy = 0;
3 D' ], s( Y! }9 q. |2 y8 g% i
5 Z: K' i/ P3 M& L( M+ l5 |
int main()
- G* C: d; Y4 ?* N
{
' X4 _, z. x6 b5 \5 s
int fd;
' G3 R, o. p% V) L; m
int *mem = NULL;
* I( ? K3 J: W. M6 b, R
) u; u9 p8 }' d3 K, g3 F7 K
if((fd = open("/dev/mem", O_RDWR)) <0)
/ @* \; q, @- L$ Z+ s$ P; z
{
0 T9 ^; e+ c, F9 Q0 q. U
perror("open error");
( r q9 w; _) }# p
return -1;
$ Q5 a+ X1 w% N% f! Y
}
3 M) C. |) W+ A, G3 v j! f. _
/ h t! C. A5 {$ U2 T4 n- N9 |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 q3 H2 G+ m* ^
2 r/ J: G) n6 d) A
while(1)
. e7 P0 w$ w A
{
) z' O* ] C4 w0 l5 ~% m( p; j Z
read_MSG_buffer(mem);
" q& P8 ~- |! @8 n$ U
}
x' x8 G; ]: ?" S* N
}
; I5 z$ }* C! d7 N7 }
. S. t* y; U {3 a
void read_MSG_buffer(int *baseaddr)
7 u: l: E/ K/ k! c
{
0 Z: u$ p4 Z$ n" f
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ o) ~# x O) u+ l$ e1 W
% I$ R7 }# Z' r5 Z* \# A
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- ~8 n A+ Z% e# L5 g# g* l3 Z9 b
j$ P1 A, o! c8 p, f; E* C# W
if(pshreRAM->packet_cout != count_copy)
! s# D0 W3 M* y* y9 O$ N1 L9 G
{
3 F+ D% d. z2 g% Y& \& }
printf("a is %d\n", pshreRAM->a);
9 ^" [$ Q, ?4 J5 y, ?$ D2 D* W3 B
printf("b is %d\n", pshreRAM->b);
/ [2 v+ p% q; I' i. w1 z, `
printf("count is %d\n", pshreRAM->packet_cout);
6 H) Y; \1 q4 a/ t" J+ F' b# n
count_copy = pshreRAM->packet_cout;
# Q ~6 r9 R2 W6 n
}
) K3 y' u' D# v! g6 t; F' X4 ]
else
2 E( m* i1 ]4 Y: `* C) W! V/ s
{
0 X1 c+ ]; I6 z* v3 j) b p/ c
printf("No effective message!\n");
. h% m% u0 @4 m @3 T
}
3 i' z, ]: u% T% q1 n/ U& Y7 }
}
% {( i8 U: I1 C5 E7 [# V) R
! N) ^7 H8 z+ X( w+ e) i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 V) m! T# O# h# N
/ i$ N& N5 ]5 |/ l3 q) I4 y: }7 I' Z
3 M/ q, F3 M9 P2 G+ K2 ?4 Z
2 K. }0 c3 h4 \- S* x8 }
; @1 t$ c' e- H8 p" ^+ C& ?
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4