ARM存储系统的架构差异很大,可以满足不同嵌入式应用系统的需求。最简单的存储系统使用平面服务地址映射机制,就像在一些简单的弹片系统中,地址空间的分配是固定的,系统的各个部分都使用物理地址。而一些复杂的系统可能包括以下一种或多种技术,以提供更强大的存储系统。
**系统可能包含多种类型的内存,如FLASH、ROM、RAM等,不同类型内存的速度和宽度不同。
** 通过使用 CACHE 和 WRITE 技术减少处理器和存储系统之间的速度差异,提高整体系统性能。
**内存管理组件通过内存映射技术实现虚拟空间到物理空间的映射。系统上电时,将ROM/FLASH映射到地址0,这样就可以进行一些初始化处理;初始化完成后,将RAM地址映射为0,将系统程序加载到RAM中运行,这是一个很好的解决方案。嵌入式系统的需求。
**引入存储保护机制,增强系统的安全性。
**引入一些机制,保证I/O操作设置为内存操作后,各种I/O操作都能得到正确的结果。
**与存储系统相关的编程指南**
本节从外部看ARM存储系统和ARM存储系统提供的外部接口。本节介绍用户通过这些接口访问ARM存储系统时需要遵循的规则。
1.地址空间
ARM 体系结构使用单一且平坦的地址空间。地址空间大小为 2^32 个 8 位字节,这些字节的单元地址是一个无符号的 32 位值,取值范围为 0~2^32-1。ARM 地址空间也可以看作 2^30 个 32 位字单元。这些字单元的地址可以被4整除,也就是说地址的低两位是0b00。地址为A的字数据包括地址为A的4字节单元的内容,A+1、A+3、A+3。
每个存储单元的地址是一个无符号数,如32,可以进行正常的整数运算。这些操作的结果是模 2^32。
程序正常执行时,每执行一条ARM指令,当前指令计数器加4字节;每次执行 Thumb 指令时,当前指令计数器增加 2 个字节。但是,当某个地址发生溢出时,执行结果将是不可预知的。
2.内存格式
在 ARM 中,如果地址 A 是字对齐的,则有以下几种:
**地址为 A 的字单元包括字节单元 A、A+1、A+2、A+3。
**地址为A的组单元包括字节单元A、A+1。
**地址为A+2的半字单元包括字节单元A+2,A=3.
**地址 A 处的字单元包括半字节单元 A、A+2。
大格式中,地址为a的字单元,字节单元从高到低字节顺序为A,A+1,A=2,A+3;这种内存格式如下:
31 24 23 16 15 8 7 0
————————————————– ——————
单词单元A |
————————————————– ——————
半字单元 A | 半字单元 A+2 |
————————————————– ——————
字节单位 A | 字节单位 A+1 | 字节单位 A+2 | 字节单位 A+3|
————————————————– ——————
在-格式中,对于地址为A的字单元,从高字节到低字节的字节顺序是A+3、A+2、A+1、A,这种存储格式如下
31 24 23 16 15 8 7 0
————————————————– ——————
单词单元A |
————————————————– ——————
半字单元 A+2 | 半字单元A |
————————————————– ——————
字节单位 A+3 | 字节单位 A+2 | 字节单位 A+1 | 字节单位 A |
————————————————– ——————
ARM 系统中没有提供选择内存格式的指令。如果系统中包含标准的ARM控制协处理器CP15,CP15的寄存器C1的bit[7]决定了系统内存的格式。系统复位时,寄存器C1的[7]值为零,此时系统中的内存格式为-。如果系统是大格式,复位异常处理程序必须设置 c1 寄存器的位 [7]。
3.未对齐的存储访问
:在arm状态时,低两位不是0b00;在 Thumb 状态期间,最低位不是 0b0。
3.1 未对齐指令预取操作
如果在系统中指定在发生未对齐指令预取操作时忽略地址中的相应位,则存储器系统实现该省略。
3.2 未对齐的数据访问操作
对于 LOAD/STORE 操作,系统定义了以下 3 种可能的结果:
***执行结果不可预测
***忽略字单元地址低两位的值,即访问地址为一个字单元;忽略半字单元的最低位的值,即访问地址是一个半字单元。
***字单元地址的低两位值和半字单元地址的最低位值被存储系统忽略。
4.指令预取和自修改代码
当用户读取 PC 计数器的值时,它返回当前指令下面的第二条指令的地址。对于ARM指令,当前指令地址的返回值加8字节;对于 Thumb 指令,返回值是当前指令地址值加上 4 个字节。
自修改代码是指在执行过程中修改自身的代码。应尽可能避免。
5.内存映射的 I/O 空间
在 ARM 中,I/O 操作通常映射到内存操作。通常需要将内存映射的 I/O 空间设置为无缓冲。
****************************************************** ** ************
ARM 编译器支持的数据类型
****************************************************** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *日期
数据类型长度(位)对齐特性
字符 8 1(字节对齐)
short 16 2(百字对齐)
Int 32 4(字对齐)
Long 32 4(字对齐)
64 4(字对齐)
浮点数 32 4(字对齐)
64 4(字对齐)
Long 64 4(字对齐)
全部 32 4(字对齐)
Bool(仅限 C++)32 4(字对齐)
1.整数类型
在 ARM 体系结构中,整数类型以 2 的补码形式存储。对于long long类型,在内存模式下,低32位以低地址的字为单位存储pc可以看成程序存储器的地址指针,高32位以高地址的字为单位存储;在 big 模式下,低 32 位存储在高地址中。在 的字单元中pc可以看成程序存储器的地址指针,高位 32 存储在低地址的字单元中。对整数数据的操作遵循以下规则:
**所有有符号整数簿操作均以二进制补码执行。
**对有符号整数的运算没有符号扩展。
**有符号整数的右移操作是算术移位。
**指定的移位位数是一个 8 位无符号数。
**要移位的数字被视为 32 位数字。
**超过 31 位的逻辑左移结果为 0。
**对于无符号和有符号正数,超过32位的右移运算结果为0;对于有符号负数,超过 32 位的右移运算结果为 -1。
**整数除法与余数和除数的符号相同。
**当将整数截断为位数较短的整数类型时,不能保证结果的最高有效位的符号位是正确的。
**整数数据之间的类型转换不会产生中止。
**整数数据溢出不会产生中止。
**整数数据除以 0 将产生中止。
2.浮点数
在 ARM 系统中,浮点数是按照 IEEE 标准存储的。
** float 类型的数字由 IEEE 单精度数字表示。
** 和 long 由 IEEE 双精度表示。
以下规则适用于浮点数运算:
**遵循正常规则。
**默认情况下禁用浮点算术异常时。
**发生缠绕时,以最近的数据表示。
3.指针类型数据
以下规则适用于指向数据成员的指针以外的指针:
**NULL 定义为 0。
**两个相邻存储单元的地址相差一个。
**编译器在转换函数指针和数据指针时会产生警告。
**类型定义为 int。
**类型定义为 int。
**当两种指针类型的数据相减时,可以根据以下公式得到结果。
((int)a-(int)b)/(int)(键入到)
这时,只要指针指向的对象不是pack,它的对齐特性就可以满足可分性的要求
文章来源:http://www.eepw.com.cn/article/201611/319287.htm