基于ARM内核的嵌入式系统可能包含Flash、ROM、SRAM、SDRAM等多种类型的存储器,不同类型的存储器存取速度和数据宽度等都不尽相同。下面主要从地址空间、存储器格式和存储器对齐访问3个方面来描述。
1.地址空间
ARM体系结构将存储器看作是从零地址开始的字节的线性组合。作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB(22字节)。当程序正常执行时,每执行一条ARM指令,当前指令计数器的值加4;每执行一条Thumb指令,当前指令计数器的值加2。
2.存储器格式
ARM体系结构可以用两种方法存储字数据,称之为大端格式和小端格式。大端格式中字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。小端格式与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
举个例子说明,比如十六进制数字0x12345678在内存中的表示形式为:
(1)大端模式:
A3 | A2 | A1 | A0 |
78 | 56 | 34 | 12 |
(2)小端模式:
A3 | A2 | A1 | A0 |
12 | 23 | 56 | 78 |
在ARM体系中默认的存储格式为小端对齐,但ARM处理器也可以由硬件来选择是大端模式还是小端模式。
3. 存储器对齐访问
ARM系统中无论取指还是内存访问都应根据指令以字、 半字或字节对齐访问,如果出现非对齐的情况,将发生错误。
1.非对齐指令的预取操作
当处理器处于ARM状态时,如果写入到寄存器PC中的值是非字对齐的(低两位不为0b00,0b00指的二进制的表示的00),要么指令执行的结果不可预知,要么地址值中最低两位被忽略;
当处理器处于Thumb状态时,如果写入到寄存器PC中的值是非半字对齐的(最低位不为0b0),要么指令执行的结果不可预知,要么的重地值中最低位被忽略.
如果系统中指定,当发生非对齐的指令预取操作时,忽略地址值中相应的位,则有存储系统实现这种”忽略”.也就是说,这时该地址值原封不动的送到存储系统.
2.非对齐的数据访问操作
对于Load/Store操作,如果是非对齐的数据访问操作,系统定义了下面3种可能的结果.
(1)执行的结果不可预知.
(2)忽略字单元地址的低两位,即访问地址为(address _and 0xffffffc)的字单元;忽略半字单元地址的最低位的值,即访问地址位(address _and 0xffffffe)的半字单元.
(3)忽略字单元地址值种的低两位的值;忽略半字单元地址的最低位的值.有存储体统实现这种”忽略”.也就是说,这时该地址值原封不动的送到存储系统.
当发生非对齐的数据访问时,到底采用上述3种处理方法种的哪一种,是由各指令系统指定的。