找回密码
 注册
关于网站域名变更的通知
查看: 332|回复: 1
打印 上一主题 下一主题

ARM存储系统概述

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-11-9 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
0 }, n4 m/ ^# h5 K8 `
ARM存储系统的体系结构适应不同的嵌入式应用系统的需要差别很大。最简单的存储系统使用平办事的地址映射机制,就像一些简单的弹片机系统中一样,地址空间的分配方式是固定的,系统各部分都使用物理地址。而一些复杂系统可能包括下面的一种或几种技术,从而提供更为强大的存储系统。
" H; I" p  t! w2 d
8 I! S, N6 l* D2 B  b8 q**系统中可能包含多种类型的存储器,如FLASH,ROM,RAM,EEPROM等,不同类型的存储器的速度和宽度等各不相同。
- k6 _8 R" z' q# J5 R; E**通过使用CACHE及WRITE BUFFER技术缩小处理器和存储系统速度差别,从而提高系统的整体性能。
# |( u; b# y3 J**内存管理部件通过内存映射技术实现虚拟空间到物理空间的映射。在系统加电时,将ROM/FLASH影射为地址0,这样可以进行一些初始化处理;当这些初始化完成后将RAM地址影射为0,并把系统程序加载到RAM中运行,这样很好地解决了嵌入式系统的需要。9 }8 @2 m3 `: ]* Z! i3 n
**引入存储保护机制,增强系统的安全性。" c0 l" o' Y# D+ U6 K4 a/ T
**引入一些机制保证I/O操作应设成内存操作后,各种I/O操作能够得到正确的结果。* ~: n  A8 X) {3 X( R
  l4 b0 z' E" `  S/ L7 n
**与存储系统相关的程序设计指南**9 p/ q# y% J, O/ C8 [3 f
本节从外部来看ARM存储系统,及ARM存储系统提供的对外接口。本节介绍用户通过这些接口来访问ARM存储系统时需要遵守的规则。
' C6 b( a( Z7 R. w0 r9 {2 q1 U4 z# o: n" k" [: J( C
1.地址空间' `. H( W: K+ f: T
ARM体系使用单一的和平板地址空间。该地址空间大小为2^32个8位字节,这些字节的单元地址是一个无符号的32位数值,其取值范围为0~2^32-1。ARM地址空间也可以看作是2^30个32位的字单元。这些字单元的地址可以被4整除,也就是说该地址低两位为0b00。地址为A的字数据包括地址为A、A+1、A+3、A+3 4个字节单元的内容。
. U! Y8 j$ y6 r! ]+ V. B各存储单元的地址作为32为无符号数,可以进行常规的整数运算。这些运算的结果进行2^32取模。
! ^. g7 M2 Y3 ]6 X程序正常执行时,每执行一条ARM指令,当前指令计数器加4个字节;每执行一条Thumb指令,当前指令计数器加2个字节。但是,当地址上发生溢出时,执行结果将是不可预知的。
& L- L, }6 m( B% Q. \8 g2.存储器格式
& k1 W. S6 i$ Q1 x; B+ f( U! X在ARM中,如果地址A是字对齐的,有下面几种:1 l: F" O5 h6 A& u
**地址为A的字单元包括字节单元A,A+1,A+2,A+3。
! f+ w2 d4 r9 M* i- |**地址为A的班子单元包括字节单元A,A+1。; M/ e6 t' N( {1 t" Y
**地址为A+2的半字单元包括字节单元A+2,A=3.
: ?- {+ ~3 g/ I# `- h1 s/ A# G**地址为A的字单元包括半字节单元A,A+2。
* S6 J2 x. T' Z6 i) S- J在big-endian格式中,对于地址为a的字单元其中字节单元由高位到低位字节顺序为A,A+1,A=2,A+3;这种存储器格式如下所示:
4 ?( Y* g6 @" S* `* L# \9 r1 l. J$ T! G* g
31 24 23 16 15 8 7 0
/ S+ H2 j# s9 A7 c5 a% V4 P--------------------------------------------------------------------$ g# [9 b3 i5 `9 \( {- L
字单元A |8 x4 y* ^( c0 u# z5 r* m
--------------------------------------------------------------------
9 E  F. a6 B' W! {+ t& U半字单元A | 半字单元A+2 |
; Y+ [$ t* H0 c3 R--------------------------------------------------------------------
" U0 z" A1 _6 P% Q6 w- Y7 T字节单元A | 字节单元A+1 | 字节单元A+2 | 字节单元A+3|
; Z1 w4 B) [4 T/ F" g+ W--------------------------------------------------------------------
# N: L; F  q% i( t% Y
0 g2 J! {2 z* }7 \8 i在little-endian格式中,对于地址为A的字单元由高位到低位字节顺序为A+3,A+2,A+1,A,这种存储格式如下所示) A& v' X; B9 a9 ?8 G

. @. V0 s% [) L1 J31 24 23 16 15 8 7 0 6 X4 j( `8 ^; x0 E
--------------------------------------------------------------------% X! K5 n6 [* ]
字单元A |
# k, B- J8 Y  q4 \--------------------------------------------------------------------
1 s; [/ X$ T) t* A3 \! a( K7 k半字单元A+2 | 半字单元A |
0 l! U0 b% W! O( V1 V$ Z! a--------------------------------------------------------------------1 ^8 H7 ]& r7 G' w# T5 Z$ m
字节单元A+3 |字节单元A+2 | 字节单元A+1 | 字节单元A |5 E0 ^0 u: J' I& r4 b4 U# w$ R! e
--------------------------------------------------------------------
! }8 M6 P" N5 h' D2 J( X: x1 K5 w7 y) Y8 g+ f% t  k
在ARM系统中没有提供指令来选择存储器格式。如果系统中包含标准的ARM控制协处理器CP15,则CP15的寄存器C1的位[7]决定系统中存储器的格式。当系统复位时,寄存器C1的[7]值为零,这时系统中存储器格式为little-endian格式。如果系统中采用的是big-endian格式,则复位异常中断处理程序中必须设置c1寄存器的[7]位。
! |' ]" q& i6 J
  s) x& T4 E8 r5 C; u; J9 \3.非对齐的存储访问操作+ t3 i5 M8 X; X" E& T
非对齐:位于arm状态期间,低二位不为0b00;位于Thumb状态期间,最低位不为0b0。: z0 n6 a' w* y7 Q# a2 ^6 p
3.1非对齐的指令预取操作: I" E8 }" ?# t% E: b# o
如果系统中指定当发生非对齐的指令预取操作时,忽略地址中相应的位,则由存储系统实现这种忽略。
* ]$ }+ f% F& J6 D3.2非对齐的数据访问操作2 d% O5 V0 d. a) F# A% }* O( [" ?
对于LOAD/STORE操作,系统定义了下面3中可能的结果:
% Y9 [' k7 B% o0 y. Z  w1 }- B1 O***执行结果不可预知0 R$ B/ J  V( x* a+ s2 B( ?# i
***忽略字单元地址低两位的值,即访问地址为字单元;忽略半字单元最低位的值,即访问地址为半字单元。
1 o, H( N, {+ H0 P0 n# N# m***由存储系统忽略字单元地址中低两位的值,半字单元地址最低位的值。4 R$ l! B9 ?& ?% P
& _; g) }: I; M. ]/ P7 a
4.指令预取和自修改代码' K' K5 n& u9 B' M; F
当用户读取PC计数器的值时,返回的是当前指令下面的第二条指令的地址。对于ARM指令来说,返回当前指令地址值加8个字节;对于Thumb指令来说,返回值为当前指令地址值加4个字节。
+ j0 H6 o. Q5 W  U! A' ?. N6 d自修改代码指的是代码在执行过程中修改自身。应尽量避免使用。" W+ N: `) \  V) D- z: {0 D" A9 X
5.存储器映射的I/O空间5 E) k' p; p3 U9 u- m: n5 `9 _) ^
在ARM中,I/O操作通常被影射为存储器操作。通常需要将存储器映射的I/O空间设置成非缓冲的。" i( {( M9 y! M* x5 R

1 _3 B5 o$ ^6 _" P1 x*************************************************************, i% D3 ~2 Q$ [: M1 L

+ a! y2 S3 ~; J# RARM编译器支持的数据类型1 L; s: c/ F$ n

0 j5 r" Y0 ?, M4 `************************************************************
" k( |* `! Y5 j9 H! X5 a数据类型长度(位)对齐特性! _1 R5 Z3 m2 x9 [0 S' d+ ~
Char 8 1(字节对齐)
4 `' |" P3 G4 z  k+ gshort 16 2(百字对齐)6 c. \, G8 G+ a! h# E0 k
Int 32 4(字对齐)
$ K4 ^& T; Y$ L: W% GLong 32 4(字对齐)
$ f1 V7 t+ C" sLonglong 64 4(字对齐)+ P9 C0 {5 \* Q6 z( K
Float 32 4(字对齐)
4 W- I/ _; J# `, z* tDouble 64 4(字对齐)
% f* i7 \5 ^; ^! `Long double 64 4(字对齐)+ w, @; h7 z4 H5 M0 Q! I6 U2 C
All pointers 32 4(字对齐)
3 O2 d# y0 E, e0 R' H+ Z' ?/ l3 \Bool(C++ only) 32 4(字对齐)
5 ?2 q1 w9 {  W* }0 x4 h. U# v+ p/ J
0 M, U. n% o/ E5 q5 ~1.整数类型2 Z! j; s4 _! r: v% ~, s% A
在ARM体系中,整数类型是以2的补码形式存储的。对于long long类型来说,在little endian内存模式下,其低32位保存在低地址的字单元中,高32为保存在高地址的字单元中;在big endian模式下,其低32位保存在高地址的字单元中,高32为保存在低地址的字单元中。对于整型数据的操作遵守下面的规则:, K- U7 C: q+ `! E: `
**所有带符号的整型书的运算是按照二进制的补码进行的。8 L7 _& b+ o# e; ^3 n3 b' G
**带符号的整型数的运算不进行符号的扩展。4 W3 v: O: K( L. S, g6 p& P8 t
**带符号的整型数的右移操作是算数移位。
& j- m' ?. x8 r; X% L**制定的移位位数的数是8位的无符号数。; W" C1 e7 T, G
**进行移位操作的数被作为32位数。
4 A# Z9 S. R+ O( W  {**超过31位的逻辑左移的结果为0。5 ?2 k9 W8 c; X+ c$ E8 Q
**对于无符号数和有符号的正数来说,超过32位的右移操作结果为0;对于有符号的负数来说,超过32位的右移操作结果为-1。
+ g9 c% k; M6 b1 _" o& b1 |. {! p5 j**整数除法运算的余数和除数有相同的符号。
4 r; V, J# t$ g. U& f9 W**当把一个整数截断成位数更短的整数类型的数时,并不能保证所得到的结果的最高位的符号位的正确性。
0 m0 M. |/ \+ r6 t4 a**整型数据之间的类型转换不会产生异常中断。+ h( R9 m1 |3 q% ^
**整型数据的溢出不会产生异常中断。
1 l% E' @+ C3 {# g! E) O**整型数据除以0将会产生异常中断。
: v9 X1 n* K0 w3 T2.浮点数  Q1 R/ ^$ [7 v1 o
在ARM体系中,浮点数是按照IEEE标准存储的。
; _; ^5 u( t# }* Y**float类型的数是按照IEEE的单精度数表示的。3 \6 B( t; I0 }# E, P- h, ^- w( t
**double和long double 是用IEEE的双精度数表示的。
6 Z; |& Q: V  u+ G3 L. G对于浮点数的操作遵守下面的规则:6 n3 U% `/ @% e
**遵守正常的IEEE754规则。
/ ~6 c* C& G% B  u( S! C/ g8 K* j3 u**当默认情况下禁止浮点数运算异常中断。
0 ?, y8 J, V: ~* P/ H# e/ [**当发生卷绕时,用最接近的数据来表示。
2 `) C0 f% M5 ]3.指针类型的数据. M# S8 o3 i! N4 ?( e" N
下面的规则适用于处数据成员指针以外的其他指针:
9 d( x  W7 i! h) H/ w( C! d+ y0 m**NULL被定义为0。$ G+ H% L1 y# h+ H/ E$ Z
**相邻的两个存储单元地址相差一。
  ?/ L. _' \. }2 f**在指向函数的指针和指向数据的指针进行数据转换时,编译器将会产生警告信息。* p$ c7 s1 @# Q
**类型size_t被定义为unsigned int.
% I& f8 S/ p+ N. P  Z**类型ptrdiff_t被定义为signed int。
/ R' q" R  A7 i! x1 r  W9 `: `0 V**两个指针类型的数据相减时,结果可以按照下面的公式得到。( m3 h* c8 {: F$ k
((int)a-(int)b)/(int)sizeof(type pointed to)
$ t7 w2 _+ }. c4 g- h2 V0 K# l% p这时,只要指针所指的对象不是pack的,其对齐特性能够满足整除的要求
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-11-9 13:09 | 只看该作者
    ARM存储系统概述
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-25 00:39 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表