处理器有一个固定的默认内存映射,提供最多4GB的可寻址内存。
SRAM和外设的区域包括可选的位带区域。
位带提供了对位数据的原子操作
处理器为核心外设寄存器保留专用外设总线(PPB)地址范围的区域。
内存区域、类型和属性
内存映射和编程可选的MPU将内存映射划分为多个区域。
每个区域都有一个已定义的内存类型,有些区域还有额外的内存属性。
内存类型和属性决定了访问区域的行为。
内存类型有:
Device和Strongly-ordered的不同顺序要求意味着内存系统可以缓冲写入Device内存,但不能缓冲写入Strongly-ordered的操作。
额外的内存属性包括:
如果多个总线主机访问一个不可共享的内存区域,软件必须确保总线主机之间的数据一致性。
只有当设备可能在多个处理器之间共享内存的系统中使用时,此属性才相关。
Execute Never(XN):表示处理器阻止指令访问。只有在执行从XN区域执行的指令时才会产生故障异常。
对于大多数由显示内存访问指令引起的内存访问,内存系统不保证访问完成的顺序与指令的程序顺序相匹配,只要这个不会影响指令序列的行为。
通常,如果正确的程序执行取决于两个内存访问按程序顺序完成,软件必须在内存访问指令之间插入一个内存屏障指令。
内存系统确实保证了对Device和Strongly-ordered memory的一些访问顺序。
对于两条内存访问指令A1和A2,如果在程序顺序中A1出现在A2之前,则两条指令对内存的访问顺序为:
Code、SRAM和外部RAM区域可以保存程序代码。然而,ARM建议程序总是使用代码区域。这是因为处理器有独立的总线,使指令获取和数据访问能够同时发生。
程序流中的指令顺序并不总是保证相应内存事务的顺序。这是因为:
内存系统保证内存访问顺序的情况。否则,如果内存访问的顺序是关键的,软件必须包含内存屏障指令来强制该顺序。
处理器提供以下内存屏障指令:
MPU编程
使用DSB,然后是ISB或异常返回,以确保后续指令使用新的MPU配置。
位带区域将位带区域混叠区域中的每个字映射到位带区域中的单个位。
位带区域占用SRAM和外设内存区域的最低1MB。
处理器将内存视为字节的线性集合,这些字节从零开始按升序编号。
例如,字节0-3保存第一个存储的字,字节4-7保存第二个存储的字。
字节不变的大端格式
在字节不变大端格式中,处理器将字的最高有效字节存储在编号最低的字节中,将最低有效字节存储在编号最高的字节中。
Cortex-M4指令集包括同步原语对。
它们提供了一种非阻塞机制,线程或进程可以使用该机制获得对内存位置的独占访问。
软件可以使用它们来执行有保证的读——修改——写内存更新序列,或者用于信号量机制。
一对同步原语包括:
Load-Exclusive
用于读取内存位置的值,请求对该位置的独占访问。
Store-Exclusive
用于尝试写入相同的内存位置,并向寄存器返回一个状态位。
如果这一点是:
Load-Exclusive和Store-Exclusive指令对是:
软件必须使用Load-Exclusive指令和相应的Store-Exclusive指令。
软件可以使用同步原语实现如下信号量:
Cortex-M4包括一个独占访问监视器,它标记处理器已经执行了Load-Exclusive指令。如果处理器是多处理器系统的一部分,系统还全局标记由每个处理器独占访问寻址的内存位置。