Cortex-M4 处理器 内存模型

内存模型

处理器有一个固定的默认内存映射,提供最多4GB的可寻址内存。
Cortex-M4 处理器 内存模型_第1张图片
SRAM和外设的区域包括可选的位带区域。
位带提供了对位数据的原子操作

处理器为核心外设寄存器保留专用外设总线(PPB)地址范围的区域。

内存区域、类型和属性
内存映射和编程可选的MPU将内存映射划分为多个区域。
每个区域都有一个已定义的内存类型,有些区域还有额外的内存属性。
内存类型和属性决定了访问区域的行为。

内存类型有:

  • Normal:处理器可以重新排序事务以提高效率,或者执行推测读取。
  • Device:处理器保持相对于设备或强顺序内存的其它事务的事物顺序。
  • Strongly-ordered:处理器保持相对于所有其它事务的事务顺序。

Device和Strongly-ordered的不同顺序要求意味着内存系统可以缓冲写入Device内存,但不能缓冲写入Strongly-ordered的操作。

额外的内存属性包括:

  • 可共享的:对于已实现的可共享内存区域,内存系统将在具有多个总线主控器的系统中(例如带DMA控制器的处理器)提供总线主控器之间的数据同步。
    Strongly-ordered内存总是可共享的。

如果多个总线主机访问一个不可共享的内存区域,软件必须确保总线主机之间的数据一致性。

只有当设备可能在多个处理器之间共享内存的系统中使用时,此属性才相关。

Execute Never(XN):表示处理器阻止指令访问。只有在执行从XN区域执行的指令时才会产生故障异常。

内存系统对内存访问的排序

对于大多数由显示内存访问指令引起的内存访问,内存系统不保证访问完成的顺序与指令的程序顺序相匹配,只要这个不会影响指令序列的行为。

通常,如果正确的程序执行取决于两个内存访问按程序顺序完成,软件必须在内存访问指令之间插入一个内存屏障指令。

内存系统确实保证了对Device和Strongly-ordered memory的一些访问顺序。
对于两条内存访问指令A1和A2,如果在程序顺序中A1出现在A2之前,则两条指令对内存的访问顺序为:
Cortex-M4 处理器 内存模型_第2张图片

  • -:意味着内存系统不能保证访问的顺序。
  • <:意味着按照顺序观察访问,也就是说,A1总是在A2之前被观察到。

内存访问的行为

Cortex-M4 处理器 内存模型_第3张图片

  • Code:程序代码的可执行区域,也可以在这里放数据。
  • SRAM:数据的可执行区域。你也可以在这里写代码,该区域包括位带和位带混叠区。
  • Peripheral:该区域包括位带和位带混叠区。
  • External RAM:数据可执行区域。
  • External device:外部设备内存。
  • Private Peripheral Bus:该区域包括NVIC,系统定时器和系统控制块。
  • Device:

Code、SRAM和外部RAM区域可以保存程序代码。然而,ARM建议程序总是使用代码区域。这是因为处理器有独立的总线,使指令获取和数据访问能够同时发生。

内存访问的软件排序

程序流中的指令顺序并不总是保证相应内存事务的顺序。这是因为:

  • 处理器可以对一些内存访问重新排序以提高效率,前提是这不会影响指令序列的行为。
  • 处理器有多个总线接口
  • 内存映射中的内存或设备具有不同的等待状态
  • 一些内存访问是缓冲的或推测的

内存系统保证内存访问顺序的情况。否则,如果内存访问的顺序是关键的,软件必须包含内存屏障指令来强制该顺序。
处理器提供以下内存屏障指令:

  • DMB:Data Memory Barrier(DMB)数据内存屏蔽指令确保未完成的内存事务在后续内存事务之前完成。
  • DSB:数据同步屏障(DSB)指令确保未完成的内存事务在后续指令执行之前完成
  • ISB:指令同步屏障确保所有已完成的内存事务的效果可被后续指令识别。

MPU编程
使用DSB,然后是ISB或异常返回,以确保后续指令使用新的MPU配置。

可选位带

位带区域将位带区域混叠区域中的每个字映射到位带区域中的单个位。
位带区域占用SRAM和外设内存区域的最低1MB。

内存字节序

处理器将内存视为字节的线性集合,这些字节从零开始按升序编号。
例如,字节0-3保存第一个存储的字,字节4-7保存第二个存储的字。

字节不变的大端格式
在字节不变大端格式中,处理器将字的最高有效字节存储在编号最低的字节中,将最低有效字节存储在编号最高的字节中。

Cortex-M4 处理器 内存模型_第4张图片
小端格式
Cortex-M4 处理器 内存模型_第5张图片
Cortex-M4 处理器 内存模型_第6张图片

同步原语

Cortex-M4指令集包括同步原语对。
它们提供了一种非阻塞机制,线程或进程可以使用该机制获得对内存位置的独占访问。
软件可以使用它们来执行有保证的读——修改——写内存更新序列,或者用于信号量机制。

一对同步原语包括:
Load-Exclusive
用于读取内存位置的值,请求对该位置的独占访问。

Store-Exclusive
用于尝试写入相同的内存位置,并向寄存器返回一个状态位。
如果这一点是:

  • 0:它表示线程或进程获得了对内存的独占访问权,并且写操作成功。
  • 1:它表示线程或进程没有获得对内存的独占访问权,也没有执行写操作。

Load-Exclusive和Store-Exclusive指令对是:

  • LDREX STREX
  • LDREXH STREXH
  • LDREXB STREXB

软件必须使用Load-Exclusive指令和相应的Store-Exclusive指令。

  1. 使用Load-Exclusive指令读取位置的值
  2. 根据实际情况修改
  3. 使用Store-Exclusive指令尝试将新值写回内存位置
  4. 测试返回的状态位。如果这一点是:0:read-modify-write操作成功;1:未执行写操作。这表明步骤1返回的值可能已经过期。软件必须重试整个读-修改-写序列。

软件可以使用同步原语实现如下信号量:

  1. 使用Load-Exclusive指令从信号量地址读取,以检查信号量是否空闲。
  2. 如果信号量是空闲的,使用Store-Exclusive将声明值写入信号量地址。
  3. 如果从步骤2返回的状态位表明Store-Exclusive操作成功,则软件已经声明了该信号量。但是,如果Store-Exclusive失败,则可能在软件执行步骤1之后,另一个进程已经声明了信号量。

Cortex-M4包括一个独占访问监视器,它标记处理器已经执行了Load-Exclusive指令。如果处理器是多处理器系统的一部分,系统还全局标记由每个处理器独占访问寻址的内存位置。

你可能感兴趣的:(stm32,stm32,学习,嵌入式硬件,系统架构,单片机)