跳转至

内存系统

本章介绍 Cortex-M7 处理器的内存系统。

1. 关于内存系统

本节概述 Cortex-M7 处理器的内存系统。

Cortex-M7 处理器的内存系统可以在实现和集成时配置。它由以下部分组成:

  • 可选的独立指令缓存和数据缓存。
  • 可选的指令和数据紧密耦合存储器(TCM)区域。
  • 一个 AHB 从接口(AHBS)。
  • 可选的存储器保护单元(MPU)。参见第 6 章存储器保护单元。
  • MBIST 接口。

缓存架构为哈佛架构,即只能从指令缓存取指令,只能从数据缓存读取和写入数据。

与各缓存并行的是两个专用 RAM 区域,指令侧和数据侧均可访问。这些区域是 TCM。

指令 TCM(ITCM)使用 ITCM 接口,数据 TCM(DTCM)使用两个接口,D0TCM 和 D1TCM。第 1 章中的 Cortex-M7 功能图显示了这一点。

ITCM 接口为 64 位宽。DTCM 分为两个 32 位宽接口,D0TCM 和 D1TCM。数据的高 32 位位于 D1TCM 接口,低 32 位位于 D0TCM 接口。

如果地址位于已使能的 TCM 区域,则执行对 ITCM 的存储器访问(取指令和数据传送指令所需)。其余不在外设接口区域的指令访问和数据访问,如果是可缓存的,则在相应的 L1 缓存中查找。内存系统不服务的访问通过 AXI 主(AXIM)接口或 AHBP 接口传递到与处理器相连的外部内存系统。

仅当存储器传输由同一主接口发起时,Cortex-M7 处理器才遵守 Arm®v7-M 架构参考手册中描述的存储器排序限制。不同接口之间的排序在没有屏障指令的情况下不予保证。

指令和数据缓存 RAM 均可在实现时配置为带有纠错码(ECC),以保护存储器中存储的数据免受错误影响。每个 TCM 接口可支持处理器外部的逻辑,向处理器报告发生了错误。

处理器支持通过 AHBS 接口直接访问 TCM。该接口为 DMA 流量提供高带宽,并可在处理器其余部分处于低功耗待机模式且内部时钟关闭时使用。

可选的 MPU 处理指令和数据存储器访问。MPU 负责所有访问的保护检查、地址访问权限和存储器属性。其中一些属性可以通过 AXIM 接口或 AHBP 接口传递到外部内存系统。

内存系统包含用于独占访问的监视器。独占加载和存储指令(例如 LDREX 和 STREX)可与适当的存储器监视配合,提供进程间或处理器间的同步和信号量。更多信息请参见 Arm®v7-M 架构参考手册。

处理器设计用于采用 AMBA 4 AXI 和 AMBA 3 AHB-Lite 协议的芯片设计。

2. 推测访问

Cortex-M7 处理器执行推测访问以提高性能。推测访问由 Armv7-M 架构允许,系统设计人员不应假设推测的范围是固定或明确规定的。

以下列表描述可能发生推测访问的几种示例:

注意: 这不是可能发生推测访问的情况的完整列表。

  • 可以对任何 Normal、可执行存储器地址发起推测指令取指。无论取指的指令是否被执行,或在少数情况下该存储器地址是否包含任何有效程序指令,都可能发生。
  • 可以对任何 Normal、读写或只读存储器地址发起推测数据读取。在少数情况下,无论是否存在导致数据读取的指令,都可能发生。
  • 可以对任何可缓存存储器地址发起推测缓存行填充。在少数情况下,无论是否存在导致缓存行填充的指令,都可能发生。
  • 在少数情况下,针对 TCM 区域的推测读取可以在三个 TCM 接口中的任意一个上发起,而不管该存储器区域映射到哪个 TCM 接口。

以下列表描述不会发生推测访问的情况:

  • 永远不会对 Execute Never 区域中的存储器地址进行推测指令取指。
  • 永远不会对 MPU 中标记为不可访问的存储器地址进行推测数据读取。
  • 永远不会对不可缓存存储器地址进行推测缓存行填充。
  • 永远不会对 Device 或 Strongly-ordered 存储器地址进行推测数据读取和推测缓存行填充。
  • 永远不会在 AHBP 接口上进行推测读取。
  • 永远不会进行推测写入。

注意: 映射到 TCM 的存储器区域始终被视为 Normal Memory,因此始终受推测影响。

2.1. 系统设计考虑

系统设计人员必须确保系统足够健壮以处理推测访问,并确保所有可执行和 Normal 类型的存储器区域都可安全访问。

防止推测访问

推测访问不会导致任何处理器故障。处理器知道访问是否为推测的,并忽略系统因该推测访问而发出的任何错误响应。但是,处理器所集成到的系统无法区分推测访问和非推测访问。因此,系统设计人员必须确保系统足够健壮以处理推测访问,无论这些访问是否针对意外的存储器地址发起。

或者,如果存在不应向其发起推测访问的存储器区域,Arm 建议使用 MPU 将这些区域设置为具有以下全部属性:

  • Device 或 Strongly-ordered。
  • Execute Never。

注意: 映射到 TCM 的存储器区域始终被视为 Normal Memory,因此始终受推测影响。

防止访问

系统必须确保所有可执行和 Normal 类型的存储器区域都可安全访问。这意味着所有访问最终都应完成。

注意:

  • 处理器不取消非推测访问,因此会等待访问完成。
  • 处理器无法保证推测访问会被取消,因此可能会等待访问完成。

对于任何被认为不可安全访问的地址,Arm 建议要么确保系统返回 abort,要么使用 MPU 将这些区域设置为具有以下全部属性以阻止访问:

  • Device 或 Strongly-ordered。
  • Non-accessible。
  • Execute Never。

3. 故障处理

故障可能因以下原因在指令取指时发生:

  • MPU MemManage。
  • 外部 AXI 从错误(SLVERR)。
  • 外部 AXI 解码错误(DECERR)。
  • TCM 外部错误。
  • 断点和向量捕获事件。

故障可能因以下原因在数据访问时发生:

  • MPU MemManage。
  • 对齐 UsageFault。
  • 外部 AXI 从错误(SLVERR)。
  • 外部 AXI 解码错误(DECERR)。
  • 来自 AHBP 端口的外部 AHB 错误。
  • TCM 外部错误。
  • 观察点。

故障处理在以下部分描述:

  • 故障。
  • 使用模型。

3.1. 故障

可能发生的故障类别包括:

  • MPU 故障。
  • 外部故障。
  • 调试事件。
  • 同步和异步故障。

MPU 故障

MPU 可能因各种原因产生故障。MPU 故障始终是同步的,并优先于外部故障。如果对不在 TCM 中的访问发生 MPU 故障,则该访问的 AXI 或 AHB 事务不会执行。

外部故障

通过 AXIM 接口执行的存储器访问或指令取指可能产生两种不同类型的错误响应:从错误(SLVERR)或解码错误(DECERR)。这些称为外部 AXI 错误,因为它们由处理器外部的 AXI 系统产生。

通过 AHBP 接口执行的存储器访问可能产生单一错误响应。处理器以与 AXI 接口的 SLVERR 响应相同的方式处理它。

在 TCM 接口上执行的存储器或指令取指访问可能产生单一错误响应。处理器以与 AXI 接口的 SLVERR 响应相同的方式处理它。

指令取指和数据加载产生同步故障。所有存储产生异步故障。

注意: 系统中无法处理独占事务的 AXI 从设备在响应独占读取时返回 OKAY。这也被视为外部错误,处理器的行为如同响应为 SLVERR。

调试事件

处理器中的调试逻辑可配置为在指令取指时产生断点或向量捕获事件,在数据访问时产生观察点。如果处理器为 monitor 模式调试进行软件配置,则当这些事件之一发生或执行 BKPT 指令时,将接受故障。更多信息参见第 9 章调试。

同步和异步故障

有关同步和异步故障之间差异的更多信息,参见外部故障。

3.2. 使用模型

本节描述系统中处理错误的一些方法。具体如何对处理器编程以处理故障,取决于处理器和系统的配置以及要实现的目标。

如果接受故障异常,故障处理程序读取链接寄存器、堆栈中的程序状态寄存器(PSR)以及故障状态寄存器中的信息,以确定故障类型。某些类型的故障对系统是致命的,另一些可以修复并恢复程序执行。例如,CPU 后台 MemManage 可能表示堆栈溢出,可以通过分配更多堆栈并重新编程 MPU 来纠正。或者,异步外部故障可能表示软件错误导致对未映射存储器地址执行了存储指令。此类故障对系统或进程是致命的,因为没有记录发生错误的地址或导致故障的指令。

表 5-1 显示通常致命的故障类型,因为错误位置未被记录或错误不可恢复。一些标记为非致命的故障,在确定错误原因后,在某些系统中可能被证明是致命的。例如,MPU 后台 MemManage 故障可能表示可以纠正的堆栈溢出,也可能表示由于缺陷软件访问了不存在的存储器位置,这可能是致命的。这些情况可以通过确定错误发生的位置来区分。

故障类型 条件 来源 同步 致命
MPU MPUᵃ 不允许的访问 MPU 是 否
同步外部 使用外部内存接口的加载 AXIM、AHBP 是 否
异步外部 使用外部内存接口对 Normal 或 Device 存储器的存储 AXIM、AHBP 否 是

a. 更多信息参见 Arm®v7-M 架构参考手册。

4. 存储器类型与内存系统行为

内存系统的行为取决于所访问存储器的类型属性:

  • 默认情况下,只有 Normal、Non-shareable 存储器区域可以缓存在 RAM 中。只有使能相应缓存且存储器类型可缓存时才会进行缓存。如果 CACR.SIWT 设置为 1,则共享可缓存存储器区域可以被缓存。
  • 存储缓冲区可以合并对 Normal 存储器的任何存储,前提是它们不是来自访问标记为 Shared 的存储器区域的独占存储指令。更多信息参见存储缓冲区。
  • 只有非缓存的 Shared 独占事务在外部接口上标记为独占。如果 CACR.SIWT 设置为 1,则对 Shared 可缓存存储器区域的独占加载和存储指令不会导致外部接口上有任何标记为独占的访问。
  • 只有 Normal 存储器被视为可重启的,即多字传输可以在中断时中途放弃,并在处理中断后重新启动。有关中断行为的更多信息,参见异常处理。
  • 对于对 Non-shared 存储器的独占访问,仅更新和检查内部独占监视器。对 Shared 存储器的独占访问使用内部监视器检查,必要时还使用外部内存接口 AXIM 或 AHBP 的外部监视器检查。

表 5-2 总结处理器存储器类型及相关行为。

存储器类型 共享性 可缓存 合并 可重启 独占处理
Normal Shared 否ᵃ 是 是 内部和外部
Normal Non-shared 是 是 是 仅内部
Device Shared 否 否 否 内部和外部
Device Non-shared 否 否 否 仅内部
Strongly-ordered Shared 否 否 否 内部和外部

a. 除非 CACR.SIWT 设置为 1。

5. AXIM 接口

本节描述 AXIM 接口。AXIM 接口是一个 64 位宽接口,连接到外部内存系统。它用于:

  • 指令取指。
  • 数据缓存行填充和逐出。
  • 不可缓存的 Normal 类型存储器数据访问。
  • Device 和 Strongly-ordered 类型数据访问,通常用于外设。

AXIM 接口遵循 Arm® AMBA® AXI 和 ACE 协议规范中描述的 AXI4 标准。在 AXI 标准内,AXIM 接口使用若干扩展信号来指示内部存储器属性和请求源。参见 AXI 扩展。

AXIM 接口可以以与处理器相同的频率运行,或更低同步频率运行。

注意: 本节中对 AXI 从设备的引用均指外部系统中连接到处理器 AXIM 接口的 AXI 从设备。

以下小节描述 AXIM 接口的属性,并提供有关所生成突发类型的信息:

  • AXI 属性和事务。
  • AXIM 接口访问的标识符。
  • AXI 扩展。
  • 内存系统对 AXI 访问的影响。

注意: 关于推测访问的更多信息,参见推测访问。

5.1. AXI 属性和事务

表 5-3 显示当处理器配置有 L1 数据缓存时 AXIM 接口的 AXI 属性和事务。这用于具有高存储带宽的原生 AXI 系统,支持多个未完成事务,也称为高性能 AXIM 接口。

属性 值 描述
写发出能力 39 包括:
• 15 个对 Strongly-ordered 或 Device 存储器的写。
• 24 个对 Normal 存储器的写,可以是逐出、写突发或单次写。其中最多 17 个可以对可缓存存储器,最多 10 个可以对不可缓存或可共享存储器。
读发出能力 7 包括:
• 2 个数据行填充。
• 4 个不可缓存数据读取。
• 1 个指令取指或指令行填充。
写 ID 能力 4 包括:
• 1 个保留给 Strongly-ordered 或 Device 存储器。
• 1 个保留给 Normal、可缓存且 Non-shareable 存储器。
• 1 个保留给 Normal、不可缓存或 Shareable 存储器。
• 1 个保留给缓存行逐出(Normal、可缓存、Write-Back 存储器)。
读 ID 能力 4 -
组合发出能力 40 包括:
• 39 个未完成写。
• 1 个指令取指ᵃ。

a. 内存系统的最大发出能力限制为一个未完成指令读取,因为当最大数量的写事务已发出时,所有数据读取都会在 BIU 中被冒险(hazard)阻塞。

只能生成所有可能 AXI 事务的一个子集。这些事务是:

  • 对于 Normal、可缓存存储器:
  • WRAP4 64 位读取,用于加载、Write-Back Write-Allocate 存储行填充和指令行填充。
  • INCR4 64 位写入,用于逐出。
  • INCR N(N 为 1–4)64 位写传输,用于合并的单独 Write-Through 或 Write-Back、no Write-Allocate 存储。
  • INCR N(N 为 1–4)64 位读传输,用于数据缓存禁用时的加载,或指令缓存禁用时的指令取指。
  • 对于 Normal、不可缓存存储器:
  • INCR N(N 为 1–4)64 位读传输,用于单独加载和加载多。
  • INCR N(N 为 1–4)64 位写传输,用于合并的单独存储和存储多。
  • INCR N(N 为 1–4)64 位读传输,用于指令取指。
  • INCR 1 8 位、16 位和 32 位独占读写,用于共享独占。
  • 对于 Strongly-ordered 或 Device 存储器:
  • INCR 1 8 位、16 位和 32 位读写,用于单独加载和存储。
  • INCR 1 32 位读传输,用于加载多。
  • INCR N(N 为 1–2)32 位写传输,用于存储多。
  • INCR 1 8 位、16 位和 32 位独占读写,用于共享独占。
  • 不使用 FIXED 突发。
  • 对 Normal 存储器的写突发可以使用以下优化:
  • 没有设置任何字节选通(strobe)的完整拍。
  • 每拍的非连续选通。

这些在 AXI 上是允许的,但对桥接到 AHB 有影响。

有关不同事务使用的 ID 的更多信息,参见 AXIM 接口访问的标识符。

表 5-4 显示当处理器未配置 L1 数据缓存时的 AXI 属性和事务。也就是说,如果要在低成本 AXI 系统中使用它,或桥接到 AHB,该系统具有低带宽内存系统,例如片外内存系统。

属性 值 描述
写发出能力 25 包括:
• 15 个对 Strongly-ordered 或 Device 存储器的写。
• 10 个对 Normal 存储器的写。
读发出能力 5 包括:
• 4 个数据读取。
• 1 个指令取指或指令行填充。
写 ID 能力 2 包括:
• 1 个保留给 Strongly-ordered 或 Device 存储器。
• 1 个保留给 Normal 存储器。
读 ID 能力 2 -
组合发出能力 26 包括:
• 25 个未完成写。
• 1 个指令取指ᵃ。

a. 内存系统的最大发出能力限制为一个未完成指令读取,因为当最大数量的写事务已发出时,所有数据读取都会在 BIU 中被冒险(hazard)阻塞。

只能生成所有可能 AXI 事务的一个子集。这些事务是:

  • 对于 Normal 存储器:
  • WRAP4 64 位读传输,用于包含指令缓存时的指令行填充。
  • INCR N(N 为 1–4)64 位读传输,用于单独加载和加载多。
  • INCR N(N 为 1–4)64 位写传输,用于合并的单独存储和存储多。
  • INCR N(N 为 1–4)64 位读传输,用于不可缓存指令取指,或无指令缓存时的所有指令取指。
  • INCR 1 8 位、16 位和 32 位独占读写,用于共享独占。
  • 对于 Strongly-ordered 或 Device 存储器:
  • INCR 1 8 位、16 位和 32 位读写,用于单独加载和存储。
  • INCR 1 32 位读传输,用于加载多。
  • INCR N(N 为 1–2)32 位写传输,用于存储多。
  • INCR 1 8 位、16 位和 32 位独占读写,用于共享独占。
  • 不使用 FIXED 突发。
  • 对 Normal 存储器的写突发可以使用以下优化:
  • 没有设置任何字节选通(strobe)的完整拍。
  • 每拍的非连续选通。

这些在 AXIM 接口上是允许的,但对桥接到 AHB 有影响。

有关不同事务使用的 ID 的更多信息,参见 AXIM 接口访问的标识符。

5.2. AXIM 接口访问的标识符

以下 ID 值适用于 AXIM 接口上的读通道、写通道和 Write-Allocate 存储器访问:

  • 读通道,ARID[2:0]、RID[2:0]:
  • 0b000 Normal 不可缓存、Device 和 Strongly-ordered 读取。
  • 0b011、0b010 数据缓存行填充。
  • 0b100 指令取指。
  • 写通道,AWID[1:0]、WID[1:0]、BID[1:0]:
  • 0b00 Normal、不可缓存写,所有共享独占写,例如来自 STREX。
  • 0b01 对 Write-Through 和 Write-Back、Non-Write-Allocate 存储器的 Normal 可缓存写。
  • 0b10 Device 和 Strongly-ordered 写。
  • 0b11 对 Normal 可缓存 Write-Back 存储器的逐出。

WID 不是 AMBA 4 AXI 的必需信号。包含它是为了与 AMBA 3 AXI 系统兼容。

5.3. AXI 特权信息

AXI 在 ARPROT 和 AWPROT 信号上提供有关访问特权级别的信息。但是,当访问可能被缓存或合并在一起时,产生的事务可能同时包含特权数据和用户数据。如果发生这种情况,Cortex-M7 处理器将事务标记为特权,即使它是由用户进程发起的。

表 5-5 显示 Cortex-M7 模式和 AROT 值。

处理器模式 访问类型 AROT 值
- 可缓存读访问 始终标记为 Privileged
User 不可缓存读访问 User,但 L1 数据缓存实现时的 LDM、LDRD 和 POP 除外
Privileged 不可缓存读访问 Privileged
User Device 或 Strongly-ordered 读访问 User
Privileged Device 或 Strongly-ordered 读访问 Privileged
- 可缓存写访问 始终标记为 Privileged
User Device 或 Strongly-ordered 写访问 User
Privileged Device 或 Strongly-ordered 写访问 Privileged
User Normal 不可缓存写访问 Privileged,STREXB、STREXH 和 STREX 除外
Privileged Normal 不可缓存写访问 Privileged

5.4. 写响应

AXIM 接口要求从设备在收到写地址之前不得返回写响应。

注意: 此写响应要求对于使用 AMBA 4 AXI 协议的系统是强制性的。如果 Cortex-M7 处理器与使用 AMBA 3 AXI 协议的外部内存系统一起使用,这也是必需的。

5.5. AXI 扩展

AXIM 接口使用 ARCACHE 和 AWCACHE AXI 信号以及 ARSHARE、AWSHARE、ARINNER 和 AWINNER 扩展信号来指示传输的存储器属性,这些属性由 MPU 返回:

  • 主接口的 ARcache 和 AWcache 由存储器类型和外部区域属性生成。
  • ARINNER 和 AWINNER 由存储器类型和内部区域属性生成。
  • 对共享存储器区域的事务会置位 ARSHARE 和 AWSHARE。

除这些属性扩展信号外,AXIM 接口还包括以下信号:

AWMASTER 和 ARMASTER

指示存储器请求的来源。当设置为:

  1. 请求由处理器上运行的软件生成。
  2. 请求由 AHB 调试(AHBD)接口上的调试请求生成。

AWSPARSE

AWSPARSE 属于写地址通道信号组,指示突发使用稀疏字节写选通,即写突发的某些拍不包含数据。可以使用该信号来优化将 AMBA 4 AXI 协议桥接到 AHB 协议的系统。

有关所有 AxCACHE 和 AxINNER 信号的有效编码,参见 Arm® AMBA® AXI 和 ACE 协议规范。

5.6. 内存系统对 AXI 访问的影响

所访问存储器的属性会影响 AXI 访问。内存系统可以缓存任何标记为以下之一的 Normal 存储器地址:

  • 可缓存、Write-Back、Read-Allocate、Write-Allocate、Non-shareable。
  • 可缓存、Write-Back、仅 Read-Allocate、Non-shareable。
  • 可缓存、Write-Through、仅 Read-Allocate、Non-shareable。

但是,Device 和 Strongly-ordered 存储器始终不可缓存。此外,对 Device 或 Strongly-ordered 存储器的任何未对齐访问都会产生对齐 UsageFault,因此不会导致任何 AXI 传输。这意味着本章给出的访问示例从不显示对 Device 或 Strongly-ordered 存储器的未对齐访问。

注意: 标记为不可缓存 Normal 的存储器区域不得用于访问系统中对读取敏感的外设。这是因为如果发起加载指令被中断,来自处理器的对这些区域的读事务可能被重复多次。

5.7. AXIM 接口传输

处理器遵循 Arm® AMBA® AXI 和 ACE 协议规范,但不会生成该规范允许的所有 AXI 事务类型。本节描述 AXIM 接口不生成的 AXI 事务类型。

如果要设计仅与 Cortex-M7 处理器配合使用的 AXI 从设备,且系统中没有其他 AXI 主设备,则可以利用这些限制以及表 5-3 中描述的接口属性来简化从设备。

本节还包含一些表,显示处理器生成的 AXI 突发类型的示例。但是,此处未显示某种特定类型的事务并不意味着处理器不生成此类事务。

注意: 连接到 AXIM 接口的 AXI 从设备必须能够处理 Arm® AMBA® AXI 和 ACE 协议规范允许的每一种事务,除非本章明确说明不生成此类事务。不得从给出的示例表推断任何附加限制。

对不可缓存存储器的加载和存储指令可能不会导致 AXI 传输,因为数据可能从内部存储数据缓冲区中获取,或合并到其中。例外是对 Strongly-ordered 或 Device 存储器的加载或存储。这些始终导致 AXI 传输。参见 Strongly-ordered 和 Device 事务。

AXI 传输的限制描述了 AXIM 接口生成的传输类型的限制。如果处理器已上电,则缓冲写响应和读数据通道的就绪信号 BREADY 和 RREADY 始终置位。当处理器进入 Dormant 或 Shutdown 模式时,它们被撤销置位。除符合 Arm® AMBA® AXI 和 ACE 协议规范外,不得对 AXI 握手信号作任何其他假设。

以下小节给出 AXIM 接口生成的传输示例:

  • AXI 传输的限制。
  • Strongly-ordered 和 Device 事务。
  • 行填充。
  • 缓存行写回(逐出)。
  • 不可缓存读取。
  • 不可缓存、Write-Back no Write-Allocate 或 Write-Through 写入。
  • AXI 事务拆分。
  • Normal 写合并。

AXI 传输的限制

AXIM 接口对其生成的 AXI 事务施加以下限制:

  • 突发传输的数据量永不超过 32 字节。
  • 突发长度永不超过四个传输。
  • Strongly-ordered 或 Device 写突发的最大长度为两个传输。Strongly-ordered 或 Device 读取始终为一个传输。
  • 任何事务都不会在存储器中跨越 32 字节边界。参见 AXI 事务拆分。
  • 永不使用 FIXED 突发。
  • 写地址通道始终发出 INCR 类型突发,从不发出 WRAP 或 FIXED。
  • WRAP 类型读突发,参见行填充:
  • 仅用于可缓存 Normal 存储器的行填充(读取)。
  • 大小始终为 64 位,长度为四个传输。
  • 起始地址始终为 64 位对齐。
  • 如果传输大小为 8 位或 16 位,则突发长度始终为一个传输。
  • 传输大小永不超过 64 位,因为它是 64 位 AXI 总线。
  • 由 ARPROT[2] 标识的指令取指始终为 64 位传输大小,且从不锁定或独占。
  • 对 Device 和 Strongly-ordered 存储器的事务始终访问与传输大小对齐的地址。参见 Strongly-ordered 和 Device 事务。
  • 独占访问始终访问与传输大小对齐的地址。
  • 只有对共享存储器的独占访问才会在 AXIM 上产生由 ARLOCK 和 AWLOCK 标识的独占访问。对非共享存储器的独占访问在总线上标记为非独占访问。

Strongly-ordered 和 Device 事务

对 Strongly-ordered 或 Device 存储器的加载或存储指令始终生成与指令所暗示大小相同的 AXI 事务。使用 LDM、STM、LDRD 或 STRD 指令对 Strongly-ordered 或 Device 存储器的所有访问均以 32 位传输发生。

LDRB

表 5-6 显示从 Strongly-ordered 或 Device 存储器中字节 0–7 执行 LDRB 时 ARADDR、ARBURST、ARSIZE 和 ARLEN 的值。

Address[2:0] ARADDR ARBURST ARSIZE ARLEN
0x0(字节 0) 0x00 Incr 8 位 1 个数据传输
0x1(字节 1) 0x01 Incr 8 位 1 个数据传输
0x2(字节 2) 0x02 Incr 8 位 1 个数据传输
0x3(字节 3) 0x03 Incr 8 位 1 个数据传输
0x4(字节 4) 0x04 Incr 8 位 1 个数据传输
0x5(字节 5) 0x05 Incr 8 位 1 个数据传输
0x6(字节 6) 0x06 Incr 8 位 1 个数据传输
0x7(字节 7) 0x07 Incr 8 位 1 个数据传输
LDRH

表 5-7 显示从 Strongly-ordered 或 Device 存储器中半字 0–3 执行 LDRH 时 ARADDR、ARBURST、ARSIZE 和 ARLEN 的值。

Address[2:0] ARADDR ARBURST ARSIZE ARLEN
0x0(半字 0) 0x00 Incr 16 位 1 个数据传输
0x2(半字 1) 0x02 Incr 16 位 1 个数据传输
0x4(半字 2) 0x04 Incr 16 位 1 个数据传输
0x6(半字 3) 0x06 Incr 16 位 1 个数据传输

注意: 从 Strongly-ordered 或 Device 存储器地址 0x1、0x3、0x5 或 0x7 加载半字会产生对齐 UsageFault。

传输一个寄存器的 LDR 或 LDM

表 5-8 显示在 Strongly-ordered 或 Device 存储器中执行 LDR 或传输一个寄存器的 LDM(LDM1)时 ARADDR、ARBURST、ARSIZE 和 ARLEN 的值。

Address[2:0] ARADDR ARBURST ARSIZE ARLEN
0x0(字 0) 0x00 Incr 32 位 1 个数据传输
0x4(字 1) 0x04 Incr 32 位 1 个数据传输

注意: 从 Strongly-ordered 或 Device 存储器地址 0x1、0x2、0x3、0x5、0x6 或 0x7 加载字会产生对齐 UsageFault。

传输两个寄存器的 LDM

表 5-9 显示在 Strongly-ordered 或 Device 存储器中执行传输两个寄存器的 LDM(LDM2)时 ARADDR、ARBURST、ARSIZE 和 ARLEN 的值。

Address[3:0] ARADDR ARBURST ARSIZE ARLEN
0x0(字 0) 0x00 Incr 32 位 1 个数据传输
0x0(字 0) 0x04 Incr 32 位 1 个数据传输
0x4(字 1) 0x04 Incr 32 位 1 个数据传输
0x4(字 1) 0x08 Incr 32 位 1 个数据传输
0x8(字 2) 0x08 Incr 32 位 1 个数据传输
0x8(字 2) 0x0C Incr 32 位 1 个数据传输
0xC(字 3) 0x0C Incr 32 位 1 个数据传输
0xC(字 3) 0x10 Incr 32 位 1 个数据传输

注意: 从地址 0x1、0x2、0x3、0x5、0x6、0x7、0x9、0xA、0xB、0xD、0xE 或 0xF 执行加载多会产生对齐 UsageFault。

STRB

表 5-10 显示通过 AXIM 接口对 Strongly-ordered 或 Device 存储器执行 STRB 时 AWADDR、AWBURST、AWSIZE、AWLEN 和 WSTRB 的值。

Address[2:0] AWADDR AWBURST AWSIZE AWLEN WSTRB
0x0(字节 0) 0x00 Incr 8 位 1 个数据传输 0b00000001
0x1(字节 1) 0x01 Incr 8 位 1 个数据传输 0b00000010
0x2(字节 2) 0x02 Incr 8 位 1 个数据传输 0b00000100
0x3(字节 3) 0x03 Incr 8 位 1 个数据传输 0b00001000
0x4(字节 4) 0x04 Incr 8 位 1 个数据传输 0b00010000
0x5(字节 5) 0x05 Incr 8 位 1 个数据传输 0b00100000
0x6(字节 6) 0x06 Incr 8 位 1 个数据传输 0b01000000
0x7(字节 7) 0x07 Incr 8 位 1 个数据传输 0b10000000
STRH

表 5-11 显示通过 AXIM 接口对 Strongly-ordered 或 Device 存储器执行 STRH 时 AWADDR、AWBURST、AWSIZE、AWLEN 和 WSTRB 的值。

Address[2:0] AWADDR AWBURST AWSIZE AWLEN WSTRB
0x0(半字 0) 0x00 Incr 16 位 1 个数据传输 0b00000011
0x2(半字 1) 0x02 Incr 16 位 1 个数据传输 0b00001100
0x4(半字 2) 0x04 Incr 16 位 1 个数据传输 0b00110000
0x6(半字 3) 0x06 Incr 16 位 1 个数据传输 0b11000000

注意: 对 Strongly-ordered 或 Device 存储器地址 0x1、0x3、0x5 或 0x7 存储半字会产生对齐 UsageFault。

传输一个寄存器的 STR 或 STM

表 5-12 显示通过 AXIM 接口对 Strongly-ordered 或 Device 存储器执行 STR 或传输一个寄存器的 STM(STM1)时 AWADDR、AWBURST、AWSIZE、AWLEN 和 WSTRB 的值。

Address[2:0] AWADDR AWBURST AWSIZE AWLEN WSTRB
0x0(字 0) 0x00 Incr 32 位 1 个数据传输 0b00001111
0x4(字 1) 0x04 Incr 32 位 1 个数据传输 0b11110000

注意: 对 Strongly-ordered 或 Device 存储器地址 0x1、0x2、0x3、0x5、0x6 或 0x7 存储字会产生对齐 UsageFault。

传输五个寄存器的 STM

表 5-13 显示通过 AXIM 接口对 Strongly-ordered 或 Device 存储器执行写入五个寄存器的 STM(STM5)时 AWADDR、AWBURST、AWSIZE、AWLEN 和首个 WSTRB 的值。

Address[4:0] AWADDR AWBURST AWSIZE AWLEN 首个 WSTRB
0x00(字 0) 0x00 Incr 32 位 2 个数据传输 0b00001111
0x00(字 0) 0x08 Incr 32 位 2 个数据传输 0b00001111
0x00(字 0) 0x10 Incr 32 位 1 个数据传输 0b00001111
0x04(字 1) 0x04 Incr 32 位 1 个数据传输 0b11110000
0x04(字 1) 0x08 Incr 32 位 2 个数据传输 0b00001111
0x04(字 1) 0x10 Incr 32 位 2 个数据传输 0b00001111

注意: 对地址 0x1、0x2、0x3、0x5、0x6 或 0x7 执行存储多会产生对齐 UsageFault。

行填充

对可缓存 Normal 存储器的加载和指令取指,如果未在缓存中命中,且使能了相应缓存,则生成缓存行填充。表 5-14 显示缓存行填充时 ARADDR、ARBURST、ARSIZE 和 ARLEN 的值。

Address[4:0]ᵃ ARADDR ARBURST ARSIZE ARLEN
0x00–0x07 0x00 Wrap 64 位 4 个数据传输
0x08–0x0F 0x08 Wrap 64 位 4 个数据传输
0x10–0x17 0x10 Wrap 64 位 4 个数据传输
0x18–0x1F 0x18 Wrap 64 位 4 个数据传输

a. 这些是导致行填充的访问地址的低五位,即关键字的地址。

缓存行写回(逐出)

当有效且脏的缓存行从数据缓存中逐出时,必须发生数据写回。表 5-15 显示通过 AXIM 接口进行缓存行写回时 AWADDR、AWBURST、AWSIZE 和 AWLEN 的值。

AWADDR[4:0] AWBURST AWSIZE AWLEN
0x00 Incr 64 位 4 个数据传输

不可缓存读取

访问不可缓存 Normal 存储器的加载指令生成的 AXI 突发不一定与指令所暗示的大小或长度相同。此外,如果要读取的数据包含在存储缓冲区中,该指令可能完全不生成 AXI 读事务。

不可缓存、Write-Back no Write-Allocate 或 Write-Through 写入

对不可缓存、Write-Back no Write-Allocate 可缓存和 Write-Through 可缓存存储器的存储指令生成的 AXI 突发不一定与指令所暗示的大小或长度相同。AXIM 接口置位字节通道选通 WSTRB[7:0],以确保只更新指令写入的字节。

本节中的表给出各种存储指令访问 Normal 存储器中各种地址时可能产生的 AXI 事务类型示例。它们仅作为示例提供,并非对 AXI 事务的详尽描述。根据处理器状态和访问时序,即使对于同一指令,实际生成的突发也可能与所示示例具有不同的大小和长度。

此外,对 Normal 存储器的写操作可以合并以生成更复杂的 AXI 事务。有关示例,参见 Normal 写合并。

表 5-16 显示对 Normal 存储器执行 STRH 时 AWADDR、AWBURST、AWSIZE、AWLEN 和 WSTRB 的可能值。

Address[2:0] AWADDR AWBURST AWSIZE AWLEN WSTRB
0x0(字节 0) 0x00 Incr 64 位 1 个数据传输 0b00000011
0x1(字节 1) 0x00 Incr 64 位 1 个数据传输 0b00000110
0x2(字节 2) 0x00 Incr 64 位 1 个数据传输 0b00001100
0x3(字节 3) 0x00 Incr 64 位 1 个数据传输 0b00011000
0x4(字节 4) 0x00 Incr 64 位 1 个数据传输 0b00110000
0x5(字节 5) 0x00 Incr 64 位 1 个数据传输 0b01100000
0x6(字节 6) 0x00 Incr 64 位 1 个数据传输 0b11000000
0x7(字节 7) 0x00 Incr 64 位 1 个数据传输 0b10000000
0x7(字节 7) 0x08 Incr 64 位 1 个数据传输 0b00000001

表 5-17 显示通过 AXIM 接口对 Normal 存储器执行传输一个寄存器的 STR 时 AWADDR、AWBURST、AWSIZE、AWLEN 和 WSTRB 的可能值。

Address[2:0] AWADDR AWBURST AWSIZE AWLEN WSTRB
0x0(字节 0)(字 0) 0x00 Incr 64 位 1 个数据传输 0b00001111
0x1(字节 1) 0x00 Incr 64 位 1 个数据传输 0b00011110
0x2(字节 2) 0x00 Incr 64 位 1 个数据传输 0b00111100
0x3(字节 3) 0x00 Incr 64 位 1 个数据传输 0b01111000
0x4(字节 4)(字 1) 0x00 Incr 64 位 1 个数据传输 0b11110000
0x5(字节 5) 0x00 Incr 64 位 1 个数据传输 0b11100000
0x5(字节 5) 0x08 Incr 64 位 1 个数据传输 0b00000001
0x6(字节 6) 0x00 Incr 64 位 1 个数据传输 0b11000000
0x6(字节 6) 0x08 Incr 64 位 1 个数据传输 0b00000011
0x7(字节 7) 0x00 Incr 64 位 1 个数据传输 0b10000000
0x7(字节 7) 0x08 Incr 64 位 1 个数据传输 0b00000111

AXI 事务拆分

当访问跨越缓存行边界(即 32 字节边界)的地址时,处理器会拆分 AXI 突发。跨越一个或两个 32 字节边界的指令分别生成两个或三个 AXI 突发。以下示例说明了此行为。它们仅作为示例提供,并非对 AXI 事务的详尽描述。根据处理器状态和访问时序,即使对于同一指令,实际生成的突发也可能与所示示例具有不同的大小和长度。

例如,LDMIA R10, {R0-R5} 从不可缓存 Normal 存储器加载六个字。此指令生成的 AXI 事务数量取决于基地址 R10:

  • 如果六个字都在同一缓存行中,则只有一个 AXI 事务。例如,对于 R10 = 0x1008 的 LDMIA R10, {R0-R5},接口可能生成一个包含三个 64 位读传输的突发,如表 5-18 所示。
  • 如果数据来自两个缓存行,则有两个 AXI 事务。例如,对于 R10 = 0x1010 的 LDMIA R10, {R0-R5},接口可能生成一个包含两个 64 位读的突发,以及一个包含单个 64 位读的突发,如表 5-19 所示。
ARADDR ARBURST ARSIZE ARLEN
0x1008 Incr 64 位 3 个数据传输
ARADDR ARBURST ARSIZE ARLEN
0x1010 Incr 64 位 2 个数据传输
0x1020 Incr 64 位 1 个数据传输

表 5-20 显示对不可缓存 Normal 存储器执行跨越缓存行边界的 LDR 时 ARADDR、ARBURST、ARSIZE 和 ARLEN 的可能值。

Address[4:0] ARADDR ARBURST ARSIZE ARLEN
0x1D(字节 29) 0x1D Incr 32 位 1 个数据传输
0x1D(字节 29) 0x20 Incr 32 位 1 个数据传输
0x1E(字节 30) 0x1E Incr 32 位 1 个数据传输
0x1E(字节 30) 0x20 Incr 32 位 1 个数据传输
0x1F(字节 31) 0x1F Incr 32 位 1 个数据传输
0x1F(字节 31) 0x20 Incr 32 位 1 个数据传输

表 5-21 显示对不可缓存 Normal 存储器执行跨越缓存行边界的 STRH 时 AWADDR、AWBURST、AWSIZE、AWLEN 和 WSTRB 的可能值。

Address[4:0] AWADDR AWBURST AWSIZE AWLEN WSTRB
0x1F(字节 31) 0x18 Incr 64 位 1 个数据传输 0b10000000
0x1F(字节 31) 0x20 Incr 64 位 1 个数据传输 0b00000001

Normal 写合并

对不可缓存、Write-Back no Write-Allocate 可缓存或 Write-Through 可缓存 Normal 存储器的存储指令可能因内部缓冲区中的存储数据合并而不会导致 AXI 传输。

存储缓冲区可以检测何时包含对同一缓存行的多个写请求(针对 Write-Through 可缓存或不可缓存 Normal 存储器)。这意味着它可以将来自多条指令的数据合并为单个写突发,以提高 AXI 接口的效率。如果 AXIM 收到多个不构成单个连续突发的写请求,它可以选择输出一个突发,并在没有数据的字节上拉低 WSTRB 信号。

对于对 Normal 存储器的写访问,如果没有地址依赖关系,存储可以乱序执行写。这样做是为了最好地利用其合并访问的能力。

示例 5-1 中的指令序列显示了写的合并。

MOV r0, #0x4000
STRH  r1, [r0, #0x18]; 在 0x4018 存储半字
STR   r2, [r0, #0xC] ; 在 0x400C 存储字
STMIA r0, {r4-r7}    ; 在 0x4000 存储四个字
STRB  r3, [r0, #0x1D]; 在 0x401D 存储字节

如果地址 0x4000 处的存储器标记为 Strongly-ordered 或 Device 类型存储器,表 5-22 显示生成的 AWADDR、AWBURST、AWSIZE、AWLEN 和 WSTRB 的值。

AWADDR AWBURST AWSIZE AWLEN WSTRB
0x4018 Incr 16 位 1 个数据传输 0b00000011
0x400C Incr 32 位 1 个数据传输 0b11110000
0x4000 Incr 32 位 2 个数据传输 0b00001111
0b11110000
0x4008 Incr 32 位 2 个数据传输 0b00001111
0b11110000
0x401D Incr 8 位 1 个数据传输 0b00100000

在示例 5-1 中,每条存储指令产生一个与指令写入数据大小相同的 AXI 突发。

如果同一存储器标记为不可缓存 Normal 或 Write-Through 可缓存,表 5-23 显示可能产生的事务。

AWADDR AWBURST AWSIZE AWLEN WSTRB
0x4000 Incr 64 位 4 个数据传输 0b11111111
0b11111111
0b00000000
0b00100011

在此示例中:

  • 存储缓冲区已将 STRB 和 STRH 写合并到一个缓冲区条目,因此产生单个 AXI 传输,即突发中的第四个传输。
  • 占用三个缓冲区条目的写已合并为包含四个传输的单个 AXI 突发。
  • STR 指令生成的写未发生,因为它被 STM 指令覆盖。
  • 写传输相对于原始程序顺序乱序发生。

表 5-23 中显示的事务说明了此行为。它们仅作为示例提供,并非对 AXI 事务的详尽描述。根据处理器状态和访问时序,即使对于同一指令,实际生成的突发也可能与所示示例具有不同的大小和长度。

如果同一存储器标记为 Write-Back 可缓存,且地址分配到缓存行中,则在缓存行被逐出并执行写回事务之前,不会发生 AXI 写事务。参见缓存行写回(逐出)。

6. AHB 外设接口

本节描述 AHB-Lite 外设(AHBP)接口的属性,并提供有关所生成突发类型的信息。

AHBP 接口是一个 32 位宽接口,连接到外部内存系统。它仅用于数据访问。指令取指从不在该接口上执行。

6.1. AHBP 接口传输

AHBP 接口遵循 AHB-Lite 规范,但不会生成该规范允许的所有 AHB 事务类型。本节描述 AHBP 接口不生成的 AHB 事务类型。如果要设计仅与 Cortex-M7 处理器 AHBP 接口配合使用的 AHB 从设备,则可以利用这些限制以及以下各节描述的接口属性来简化从设备。

本节还包含一些表,显示处理器生成的 AHB 事务类型。但是,此处未显示某种特定类型的事务并不意味着处理器不生成此类事务。

注意: 连接到 AHBP 接口的 AHB 从设备必须能够处理 AHB 规范允许的每一种事务,除非本章明确说明不生成此类事务。不得从给出的示例表推断任何附加限制。

AHBP 接口传输的限制描述了 AHBP 接口生成的传输类型的限制。

以下小节给出 AHBP 接口生成的传输示例:

  • AHBP 接口传输的限制。
  • Strongly-ordered 和 Device 事务。
  • Normal 读取。
  • Normal 写入。

AHBP 接口传输的限制

AHBP 接口对其生成的 AHB 事务施加以下限制:

  • 该接口仅使用一个传输,所有突发都是单次,即 HBURSTP[2:0] 始终为 SINGLE。
  • 任何事务都不会在存储器中跨越 4 字节边界。
  • 传输类型,即 HTRANSP[2:0],从不为 BUSY 或 SEQUENTIAL。
  • 传输大小永不超过 32 位,因为它是 32 位 AHB 总线。
  • 所有事务都是数据访问,即 HPROTP[0] 始终为 1。
  • 对 Device 和 Strongly-ordered 存储器的事务始终访问与传输大小对齐的地址。
  • 独占访问始终访问与传输大小对齐的地址。

Strongly-ordered 和 Device 事务

对 Strongly-ordered 或 Device 存储器的加载或存储指令始终生成与指令所暗示大小相同的 AHB 事务。使用 LDM、STM、LDRD 或 STRD 指令对 Strongly-ordered 或 Device 存储器的所有访问均以单个 32 位传输发生。

LDRB

表 5-24 显示从 Strongly-ordered 或 Device 存储器中字节 0–3 执行 LDRB 时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(字节 0) 0x00 Single 8 位
0x1(字节 1) 0x01 Single 8 位
0x2(字节 2) 0x02 Single 8 位
0x3(字节 3) 0x03 Single 8 位
LDRH

表 5-25 显示从 Strongly-ordered 或 Device 存储器中半字 0–1 执行 LDRH 时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(半字 0) 0x00 Single 16 位
0x2(半字 1) 0x02 Single 16 位

注意: 从 Strongly-ordered 或 Device 存储器地址 0x1 或 0x3 加载半字会产生对齐 UsageFault。

一个寄存器的 LDR 或 LDM

表 5-26 显示在 Strongly-ordered 或 Device 存储器中执行 LDR 或传输一个寄存器的 LDM(LDM1)时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(字 0) 0x00 Single 32 位

注意: 从 Strongly-ordered 或 Device 存储器地址 0x1、0x02、0x3、0x5、0x06 或 0x7 加载字会产生对齐 UsageFault。

传输五个寄存器的 LDM

表 5-27 显示在 Strongly-ordered 或 Device 存储器中执行传输五个寄存器的 LDM(LDM5)时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(字 0) 0x00 Single 32 位
0x0(字 0) 0x04 Single 32 位
0x0(字 0) 0x08 Single 32 位
0x0(字 0) 0x0C Single 32 位
0x0(字 0) 0x10 Single 32 位
0x4(字 1) 0x04 Single 32 位
0x4(字 1) 0x08 Single 32 位
0x4(字 1) 0x0C Single 32 位
0x4(字 1) 0x10 Single 32 位
0x4(字 1) 0x14 Single 32 位

注意: 从 Strongly-ordered 或 Device 存储器地址 0x1、0x2 或 0x3 加载字会产生对齐 UsageFault。

STRB

表 5-28 显示从 Strongly-ordered 或 Device 存储器中字节 0–3 执行 STRB 时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(字节 0) 0x00 Single 8 位
0x1(字节 1) 0x01 Single 8 位
0x2(字节 2) 0x02 Single 8 位
0x3(字节 3) 0x03 Single 8 位
STRH

表 5-29 显示从 Strongly-ordered 或 Device 存储器中半字 0–1 执行 STRH 时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(半字 0) 0x00 Single 16 位
0x2(半字 1) 0x02 Single 16 位

注意: 对 Strongly-ordered 或 Device 存储器地址 0x1 或 0x3 存储半字会产生对齐 UsageFault。

一个寄存器的 STR

表 5-30 显示在 Strongly-ordered 或 Device 存储器中执行传输一个寄存器的 STR 时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(字 0) 0x00 Single 32 位

注意: 对 Strongly-ordered 或 Device 存储器地址 0x1、0x2 或 0x3 存储字会产生对齐 UsageFault。

传输五个寄存器的 STM

表 5-31 显示通过 AHBP 接口对 Strongly-ordered 或 Device 存储器执行传输五个寄存器的 STM(STM5)时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(字 0) 0x00 Single 32 位
0x0(字 0) 0x04 Single 32 位
0x0(字 0) 0x08 Single 32 位
0x0(字 0) 0x0C Single 32 位
0x0(字 0) 0x10 Single 32 位
0x4(字 1) 0x04 Single 32 位
0x4(字 1) 0x08 Single 32 位
0x4(字 1) 0x0C Single 32 位
0x4(字 1) 0x10 Single 32 位
0x4(字 1) 0x14 Single 32 位

注意: 对 Strongly-ordered 或 Device 存储器地址 0x1、0x2、0x3、0x5、0x6 或 0x7 存储字会产生对齐 UsageFault。

Normal 读取

访问 Normal 存储器的加载指令生成的 AHBP 接口事务不一定与指令所暗示的大小或长度相同。本节中的表给出各种加载指令访问 Normal 存储器中各种地址时可能产生的 AHBP 事务示例。它们仅是示例,并非对 AHBP 事务的详尽描述。

LDRH

表 5-32 显示从 Normal 存储器中字节 0 到 3 执行 LDRH 时 HADDRP[2:0]、HBURSTP 和 HSIZEP 的可能值。

Address[1:0] HADDRP[2:0] HBURSTP HSIZEP
0x0(字节 0) 0x00 Single 16 位
0x1(字节 1) 0x00 Single 32 位
0x2(字节 2) 0x02 Single 16 位
0x3(字节 3)ᵃ 0x00 Single 32 位
0x3(字节 3)ᵃ 0x04 Single 32 位

a. AHBP 接口事务不跨越双字边界。

LDR

表 5-33 显示从 Normal 存储器执行 LDR 时 HADDRP[2:0]、HBURSTP 和 HSIZEP 的可能值。

Address[1:0] HADDRP[2:0] HBURSTP HSIZEP
0x0(字节 0) 0x0 Single 32 位
0x1(字节 1) 0x0 Single 32 位
0x1(字节 1) 0x4 Single 32 位
0x2(字节 2) 0x0 Single 32 位
0x2(字节 2) 0x4 Single 32 位
0x3(字节 3) 0x0 Single 32 位
0x3(字节 3) 0x4 Single 32 位

Normal 写入

访问 Normal 存储器的存储指令生成的 AHBP 接口事务不一定与指令所暗示的大小或长度相同。本节中的表给出各种存储指令访问 Normal 存储器中各种地址时可能产生的 AHBP 事务示例。它们仅是示例,并非对 AHBP 事务的详尽描述。

STRH

表 5-34 显示从 Normal 存储器中字节 0 到 3 执行 STRH 时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的可能值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(字节 0) 0x00 Single 16 位
0x1(字节 1) 0x01 Single 8 位
0x1(字节 1) 0x02 Single 8 位
0x2(字节 2) 0x02 Single 16 位
0x3(字节 3) 0x03 Single 8 位
0x3(字节 3) 0x04 Single 8 位
一个寄存器的 STR 或 STM

表 5-35 显示对 Normal 存储器执行 STR 时 HADDRP[1:0]、HBURSTP 和 HSIZEP 的可能值。

Address[1:0] HADDRP[1:0] HBURSTP HSIZEP
0x0(字节 0,字 0) 0x00 Single 32 位
0x1(字节 1) 0x01 Single 8 位
0x1(字节 1) 0x02 Single 16 位
0x1(字节 1) 0x04 Single 8 位
0x2(字节 2) 0x02 Single 16 位
0x2(字节 2) 0x04 Single 16 位
0x3(字节 3) 0x03 Single 8 位
0x3(字节 3) 0x04 Single 16 位
0x3(字节 3) 0x06 Single 8 位

6.2. AHBP 信号量

外设接口使用内存系统的内部独占监视器来管理对非共享存储器的加载、存储和清除独占指令。内部监视器检查对共享存储器的独占访问,必要时还使用 AHB 存储器接口的任何外部监视器进行检查。可以使用这些指令构造信号量,并确保不同进程或处理器之间的同步。有关这些指令如何工作的更多信息,参见 Arm®v7-M 架构参考手册。

只有对共享存储器的独占指令才会在 AHBP 上产生独占访问。对非共享存储器的独占访问在总线上标记为非独占访问。

AHBP 扩展信号 EXREQP 和 EXRESPP 表示 AHBP 上共享独占事务的独占请求和响应。

AHBP 独占访问

本节描述 EXREQP 和 EXRESPP 信号以及 AHBP 独占访问的事务属性:

  • EXREQP 是地址阶段信号,仅在 HTRANSP 指示有效事务时置位。
  • EXRESPP 是数据阶段信号,仅在 HREADYP 为 1 的数据阶段采样。

处理器仅在以下情况下置位 EXREQP 信号:

  • 对 AHBP 上的 Shared 存储器区域执行独占加载。
  • 对 AHBP 上的 Shared 存储器区域执行独占存储,且内部独占访问监视器通过。当内部独占访问监视器失败时,不会在 AHBP 上执行存储。

表 5-36 显示系统必须为 EXRESPP 使用的事务属性。

EXREQP 访问类型 所需的 EXRESPP
0 加载/存储 -
1 加载 如果实现了覆盖访问地址的系统监视器,则为 0,否则为 1
1 存储 如果实现了覆盖访问地址的系统监视器且独占检查失败,则为 1,否则为 0

如果没有实现覆盖相关区域的全局独占监视器,软件必须避免对共享存储器区域执行独占访问。处理器将此类访问视为错误条件,如果执行加载时 EXREQP 置为 1 并收到置为 1 的 EXRESPP,则自动接受 BusFault 异常。对于以下访问,处理器忽略 EXRESPP:

  • 在 EXREQP 置为 0 的情况下执行。Arm 建议在这些情况下系统将 EXRESPP 驱动为 0。
  • 在 HRESPP 上返回错误响应。

Cortex-M7 处理器使用 EXREQP 和 EXRESPP 的方式与 Cortex-M3 处理器和 Cortex-M4 处理器不同,因此迁移到使用 Cortex-M7 处理器的系统时,可能需要同时更新系统硬件和软件。

7. AHB 从接口

32 位 AHB 从(AHBS)接口提供对 ITCM、D1TCM 和 D0TCM 的系统访问。它包含仲裁逻辑,以支持系统和处理器同时发出的 TCM 访问请求。AHBS 实现 AMBA 3 AHB-Lite 协议。

写在处理器的存储队列(SQ)中缓冲。SQ 还缓冲软件对 TCM 的写,并按顺序执行所有存储。读取可以相对于缓冲写乱序执行到 TCM。

如果读与软件或 AHBS 缓冲写之间存在数据依赖关系,冒险逻辑会阻塞读,并尝试排空 SQ,直到不再存在任何依赖关系。写继续按顺序执行。冒险检测以字节粒度执行。

所有 AHBS 访问都按与存储器相同的字节序处理。读或写均不执行数据交换(swizzling)。

AHBS 接口可以在处理器处于睡眠状态时使用。

7.1. 内存映射

AHBS 上呈现的内存映射:

  • 与呈现给处理器上运行的软件的内存映射一致。

注意: ITCMCR 和 DTCMCR 中定义的 TCM 使能位不影响 AHBS 访问,而仅影响 TCM 对软件的可见性,参见指令和数据紧密耦合存储器控制寄存器。AHBS 访问独立于这些位处理。

  • 具有附加限制:只能访问 TCM 地址范围。任何其他地址都会失败。

表 5-37 显示 AHBS 内存映射。对所示地址范围之外的地址的访问会在 AHBS 接口上返回错误响应。

起始地址 结束地址 HADDRS[2] 访问的 TCM TCM 索引
0x00000000 0x00000000 + - ITCM HADDRS[n:3]ᵃ
0x20000000 0x20000000 + 0 D0TCM HADDRS[n:3]ᵃ
0x20000000 0x20000000 + 1 D1TCM HADDRS[n:3]ᵃ

a. n 的值取决于配置的 TCM 大小,参见 TCM 配置。

7.2. AHBS 事务的限制

不支持将来自 AXIM 或 AHBP 接口的事务环回(loopback)到 AHBS,因为这可能导致死锁。

注意: 环回安排不太可能需要。处理器到 TCM 的带宽高于 AHBS 接口。这意味着软件直接向 TCM 传输数据比通过 AHBS 接口更快。

此限制并不排除主接口访问与 AHBS 访问之间存在间接关系的安排。例如,如果来自 AHBP 接口的写请求外部代理在 AHBS 接口上执行事务。在这种情况下,不要在系统中引入发起事务的控制访问与事务本身之间的依赖关系。

AHBS 接口事务不能执行 MPU 查找。内部不区分 HPROTS 上指示的非特权 AHBS 接口访问和特权 AHBS 接口访问。系统完全负责根据需要为 AHBS 接口访问提供 TCM 保护功能。

外部 TCM 接口逻辑必须使用 TCM 错误机制向 AHBS 接口指示访问已中止。在这种情况下,外部 TCM 接口逻辑还会屏蔽写并混淆读数据。有关 TCM 接口协议的更多信息,参见 TCM 接口协议。

在 TCM 接口上中止的 AHBS 接口读取返回随 HRESPS 上错误响应一起提供的读数据。AHBS 接口写被缓冲,并且总是推测性地返回 OK 响应。如果写随后在 TCM 接口上中止,AHBS 使用 WABORTS 信号向系统引发异步中止。

AHBS 不支持独占或锁定访问,AHBS 接口存储不影响内部独占访问监视器的状态。这使得它不适合需要 AHBS 接口与软件之间并发控制的系统。

有关软件与 AHBS 接口之间支持的 TCM 数据共享模型的更多信息,参见系统访问 TCM。

7.3. AHBS 接口仲裁

处理器中有两个相关的仲裁点:

  • 接受来自软件和 AHBS 接口的写进入 SQ。
  • 执行来自软件和 AHBS 接口的 TCM 读取。

处理器支持五种软件可配置的仲裁模式:

  • 仅轮转(round-robin)。
  • 使用公平计数器降低 AHBS 接口带宽。
  • 使用公平计数器降低软件带宽。
  • 轮转,但当执行优先级设置为高于定义阈值时,使用公平计数器降低 AHBS 接口带宽。
  • 轮转,AHBS 接口带宽由输入信号控制。

当轮转 AHBS 仲裁方案激活时,具有以下特性:

  • 任何请求方(即软件或 AHBS 接口)在没有争用时都会获得访问权。此方案保证:
  • 争用很少时每个请求方获得最佳吞吐量。在这种情况下,资源使用在请求方之间并不均衡,一个请求方比另一个更活跃。然而,当争用频繁时,所用方案倾向于在请求方之间平均分配资源。
  • 争用常见时所有请求方的平均吞吐量最佳。

公平计数器决定在存在争用时哪个请求方获得访问权。对于每次发生争用的访问,该计数器递减,当它达到 0 时初始化为 CM7_AHBSCR.INITCOUNT 字段值。有关如何使用 CM7_AHBSCR.INITCOUNT 的更多信息,参见 AHB 从控制寄存器。

提供了一些有限的软件可配置性,通过将 AHBS 接口优先级降到一个显著较低的水平而不完全将其排除,来调节 AHBS 接口带宽。这是通过增加公平计数器的初始化值来实现的,该值强制对 AHBS 接口访问进行仲裁。也可以反转优先级方案,允许 AHBS 接口访问使用公平计数器优先于软件访问。

通常,这种 AHBS 接口带宽调节功能预期用于在高优先级 ISR 中运行的实时关键代码。为了允许各个 ISR 降低 AHBS 接口流量,提供了阈值执行优先级(TPRI)模式,使处理器硬件能够自动执行此操作。有关如何使用 TPRI 的更多信息,参见 AHB 从控制寄存器。

注意: 如果计数器初始化值为 0,且 AHBS 接口完全占用 TCM 或 SQ 的带宽,处理器可能停止执行代码。

系统可以使用处理器上的 AHBSPRI 输入信号直接控制 AHBS 接口访问优先级。参见 AHB 从控制寄存器。

注意:

  • 编程不当可能直接降低整体系统性能。
  • 为使 AHBS 接口接受 AHBS 事务,必须撤销所有复位。
  • 对 CM7_AHBSCR 的更改可能不会立即生效,因为处理器必须完成现有的 AHBS 接口流量。
  • CM7_AHBSCR 的设置可能被覆盖,仅被视为对处理器的提示。

8. TCM 接口

内存系统支持连接本地紧密耦合存储器(称为 ITCM 和 DTCM)。ITCM 有一个 64 位存储器接口,DTCM 有两个 32 位存储器接口 D0TCM 和 D1TCM,由请求地址的位[2] 选择。每个 TCM 接口是处理器上的物理连接,适合以最少的胶合逻辑连接到 SRAM。这些端口针对低延迟存储器进行了优化。

TCM 接口设计用于连接 RAM 或类似 RAM 的存储器,即 Arm 架构中的 Normal 类型存储器。处理器可以在这些接口上发出推测读取访问。因此,通过 TCM 接口的读取访问可以重复,并且可以访问未初始化或不存在的存储器位置。这意味着 TCM 接口通常不适合对读取敏感的设备,例如 FIFO。如果访问是推测的,处理器忽略为该访问发出的任何错误或重试,参见 TCM 接口协议。

TCM 接口还具有等待信号,以支持慢速存储器,参见 TCM 接口协议。

预取单元(PFU)可以从任何 TCM 接口取指令。加载存储单元(LSU)和 AHBS 接口可以分别使用任何 TCM 接口读写数据。如果将代码放在 ITCM、数据放在 DTCM,则可获得最佳性能。但是,代码和数据放置在哪个 TCM 中没有功能限制。

每个 TCM 接口都有固定的基地址,参见系统地址映射。

本节描述:

  • TCM 属性和权限。
  • TCM 配置。
  • TCM 仲裁。
  • TCM 接口协议。
  • TCM 读修改写。

注意: 关于推测访问的更多信息,参见推测访问。

8.1. TCM 属性和权限

从 LSU 和 PFU 对 TCM 的访问会根据 MPU 检查访问权限。存储器访问属性和权限不在该接口上导出。对 Device 或 Strongly Ordered 存储器的任何未对齐访问都会产生对齐 UsageFault。产生 MPU 故障或对齐 UsageFault 的读取仍会发送到 TCM 接口,但不使用数据,且相关加载指令不更新任何处理器寄存器,从而确保保护得以维持。产生 MPU 故障或对齐 UsageFault 的写从不在 TCM 接口上广播。

无论 MPU 中为包含 TCM 中地址的存储器区域定义的存储器类型属性如何,TCM 始终表现为不可缓存 Non-shared Normal 存储器。TCM 地址空间中 MPU 区域相关的访问权限按与 TCM 地址空间之外的地址相同的方式处理。有关存储器属性、类型和权限的更多信息,参见 Arm®v7-M 架构参考手册。

注意: 为了将代码移植到其他 Arm 处理器或系统,Arm 建议在 MPU 中始终将 TCM 区域定义为 Normal、Non-shared 存储器。这与 MPU 禁用或未实现时适用的默认 ARMv7E-M 内存映射属性一致。

8.2. TCM 配置

每个 TCM 的基地址是固定的:

  • ITCM 位于 0x00000000。
  • DTCM 位于 0x20000000。

ITCM 和 DTCM 分别占据内存映射的代码区和数据区的低地址部分,参见系统地址映射。

每个 TCM 的大小在集成时配置,从 4KB 到 16MB,以 2 的幂为步进。如果系统中不存在 TCM,则其大小为 0KB。

DTCM 有两个接口 D0TCM 和 D1TCM。这意味着连接到每个接口的 RAM 大小是 DTCM 总大小的一半。

TCM 的大小对软件可见于 TCM 控制寄存器,参见指令和数据紧密耦合存储器控制寄存器。对内存映射中代码区和数据区已实现 TCM 地址范围之上的地址的访问会发送到 AXIM 接口。

ITCM 和 DTCM 可以由软件使用 ITCMCR.EN 和 DTCMCR.EN 位使能或禁用。参见指令和数据紧密耦合存储器控制寄存器。输入配置信号决定这些位在复位后的值。

8.3. TCM 仲裁

TCU 包含仲裁逻辑,在 LSU、PFU、AHBS 和 SQ 的 TCM 访问请求之间进行仲裁。大多数情况下,LSU 具有最高优先级,其次是 PFU、AHBS,SQ 的优先级最低。

当较高优先级的请求方正在访问 TCM 时,较低优先级设备的访问会阻塞。

在某些情况下,SQ 可以临时具有最高优先级,例如,当由于从 SQ 中存储的同一地址加载而发生 RAW 冒险时。这确保尽快清除冒险,允许加载继续。AHBS 接口可能因 AHBS 优先级提升而具有最高优先级,参见 AHBS 接口仲裁。如果 SQ 和 AHBS 同时被提升优先级,则 SQ 具有最高优先级。

8.4. TCM 接口协议

每个 TCM 接口彼此独立运行,每个接口在特定时钟周期内可以执行读访问或写访问。除地址和数据信号外,TCM 接口还提供有关访问来源以及访问是否特权的信息。因此,可以确定访问是来自 PFU 的指令取指、来自 LSU 的数据访问、SQ 访问、MBIST 接口访问,还是来自 AHBS 接口的 DMA 传输。

在读取访问期间,外部 TCM 存储器控制器可以指示处理器在从接口捕获读数据之前必须等待一个或多个时钟周期。控制器还可以指示读或写访问期间发生错误,处理器必须接受总线故障。例如,控制器可以使用此错误,通过解码地址、特权指示或访问源信息来指示特权冲突。有关 TCM 错误的更多信息,参见故障。

如果 TCM 存储器控制器支持 ECC 错误检测和纠正,它可以指示必须重试访问以返回纠正后的数据。必须使能处理器中的 TCM 重试功能,通过将 ITCMCR.RETEN 或 DTCMCR.RETEN 位设置为 1,以支持外部 TCM 错误纠正。参见指令和数据紧密耦合存储器控制寄存器。

注意: 在使能 TCM 重试功能的设计中,如果 TCM 存储器控制器在调试器读请求的重试阶段发出重试:

  • 不重试 TCM 访问。
  • 在 AHBD 接口上向调试器发出 ERROR 响应。

8.5. TCM 读修改写

可以通过将 ITCMCR.RMW 或 DTCMCR.RMW 位设置为 1,在 TCM 接口上使能读修改写,参见指令和数据紧密耦合存储器控制寄存器。使能后,处理器对数据大小小于接口宽度的写使用读修改写序列。此功能适用于在 TCM 中实现 ECC 的系统。

注意: 使用 ECC 时,TCM 必须在启动时初始化。这是为了避免推测和误预测访问触发 ECC 单比特错误纠正尝试,以及虚假双比特错误导致的系统故障响应;如果这些错误真实存在,可能不可恢复。

8.6. 从 TCM 启动

以下支持可用于启动必须在复位时初始化的易失性 TCM 存储器:

  • 可以使用配置输入信号独立于软件从复位使能 TCM。
  • 当 CPUWAIT 信号在复位时置为高电平时,它阻止处理器启动其正常的硬件启动例程。这允许系统硬件在处理器执行任何 TCM 访问之前加载 TCM。当 TCM 加载完成时,撤销该信号以允许处理器启动。
  • 处理器 AHBS 端口在 CPUWAIT 置位时正常工作,并服务系统硬件发起的加载 TCM 的事务。这避免了在 TCM 接口上需要外部硬件进行启动时初始化。

8.7. 与 Flash 存储器集成

执行 32 位指令时,处理器执行带宽可高达每周期 64 位。对于 16 位指令,可高达每周期 32 位。整体带宽非常依赖应用,但是对于通用产品,假定需要每周期 64 位。I 侧内存系统必须维持此带宽以获得最佳性能。Arm 建议,如果 Flash 集成在 ITCM 接口上,则使用系统缓存或 Flash 加速器来满足这些取指带宽要求。

或者,可以将 Flash 集成在 AXIM 上,并将处理器配置为包含指令缓存。

8.8. 系统访问 TCM

AHBS 接口即使在处理器运行时也提供对 TCM 的系统访问。支持软件和 AHBS 对 TCM 访问之间的仲裁,无需外部 TCM 接口逻辑。

软件和 AHBS 对 TCM 访问之间的并发控制没有硬件支持。特别是,软件对 TCM 的独占访问仅受内部独占监视器约束,该监视器不考虑 AHBS 访问。这意味着系统不得对与软件独占访问一起使用的任何 TCM 存储器区域执行 AHBS 访问。

但是,可以在处理器上运行的软件与使用 AHBS 接口的系统之间以一致的(coherent)方式共享数据,并具有以下处理器硬件保证:

  • 软件或 AHBS 对 TCM 的写永不重复。

注意: 存储多指令和未对齐的单次存储可能在异常返回时重复,因此不受此保证约束,不适合软件同步。处理器保证不重复任何单副本原子(single-copy-atomic)访问。有关原子性的更多信息,参见 Arm®v7-M 架构参考手册。

  • 软件和 AHBS 对 TCM 的写具有单一序列化点,即 TCM 存储队列。这意味着当一个主设备可以观察到某次写时,保证另一个主设备也可以观察到它。
  • 当 AHBS 接口上的写被接受、其数据阶段以 OK 响应完成时,处理器承担对该数据项的一致观察责任。在 AHBS 写完成后,任一主设备发起的读返回更新后的数据。

注意: TCM 隐式为 Normal 存储器,因此允许写缓冲。完成的 AHBS 写并不意味着该写已在 TCM 接口上执行,而是意味着它已成功进入存储队列。因此,如果要求所有写首先提交到存储器,系统必须避免复位处理器,直到存储队列排空。

可以使用用于数据共享的标准消息传递模型。Arm 架构要求此模型在支持一致性时工作,因此可移植到其他 Arm 处理器。

表 5-38 显示标准消息传递软件协议。

注意:

  • 当使用 AHBS 接口传输系统生成的数据时,处理器上基于中断的同步是可能的。在此模型中,当 AHBS 完成最后一个数据传输时生成中断。保证 ISR 中的第一条指令观察到在此传输之前或在此传输中存储的任何数据项。在这种情况下,最后一次 AHBS 访问的完成表示全局可观察性,而不必执行对该位置的软件读取并等待其更新。
  • 此方案不保证在其他 Arm 处理器上受支持,当需要代码可移植性时必须谨慎使用。
数据生成方 数据使用方
STR LDR
DMB LOOP until set
STR LDR

9. L1 缓存

本节描述 Cortex-M7 处理器内存系统中可选 L1 缓存的行为。

内存系统在实现时配置,可以包含不同大小的指令缓存和数据缓存。可以配置是否包含每个缓存控制器,如果包含,则独立配置每个缓存的大小。缓存的指令或数据使用 AXIM 接口从外部存储器取回。缓存控制器使用在实现时集成到 Cortex-M7 处理器中的 RAM。

任何非 TCM 或 AHBP 接口的访问都由相应的缓存控制器处理。如果访问是对 Non-shared 可缓存存储器,且缓存已使能,则在缓存中执行查找;如果在缓存中找到(即缓存命中),则从缓存取回数据或写入缓存。当缓存未使能时,以及对不可缓存或 Shared 存储器,访问使用 AXIM 接口执行。

由于读取而发生缓存未命中时,两个缓存都会将存储器位置分配到缓存行,即所有可缓存位置都是 Read-Allocate。此外,如果存储器位置标记为 Write-Allocate,数据缓存可以在写访问时分配。分配缓存行时,相应存储器由 AXIM 接口取入行填充缓冲区,然后写入缓存。行填充缓冲区始终先取回请求的数据,返回它,然后取回缓存行的其余部分。这使得无需等待行填充完成即可读取数据,称为关键字优先(critical word first)和非阻塞行为。如果后续指令需要同一缓存行的数据,也可以在数据取回后返回,而无需等待行填充完成,即缓存还支持流式(streaming)。如果 AXIM 接口报告行填充错误,则行填充不更新缓存 RAM。

如果处理器中的非推测读取使用了故障数据,则产生同步故障。如果配置为 Write-Back 的地址的写数据已从存储缓冲区合并到该行,则外部故障发生时行填充会生成异步故障。参见存储缓冲区。

数据缓存为四路组相联,指令缓存为两路组相联。

两个缓存的行长度均为 32 字节。如果组中的所有缓存行均有效,要将不同地址分配到缓存,缓存控制器必须从缓存中逐出一行。

数据缓存命中的写访问写入缓存 RAM。如果存储器位置标记为 Write-Through,写还会在 AXIM 接口上执行,以使 RAM 中存储的数据与外部内存系统保持一致。如果存储器为 Write-Back,则缓存行标记为脏,仅在行被逐出时在 AXIM 接口上执行写。当脏缓存行被逐出时,数据传递到 AXIM 接口中的写缓冲区,以写入外部内存系统。

缓存控制器还管理缓存维护操作中描述的缓存维护操作。

每个缓存还可以配置 ECC。如果实现并使能 ECC,则每当在缓存中执行查找时,都会检查与每行关联的 tag 以及从缓存读取的数据,如果可能则在处理器使用之前纠正数据。ECC 错误检查与纠正的完整描述超出本文档的范围。如果需要更多信息,请联系 Arm。

有关存储器属性和行为一般规则的更多信息,参见 Arm®v7-M 架构参考手册。

9.1. 动态读分配模式

当存储器区域标记为 Write-Back Write-Allocate 时,它通常在读未命中或写未命中时分配缓存行。但是,在某些情况下,在写时分配是不可取的,例如执行 C 标准库 memset() 函数将大块存储器清为已知值。写入这样的大块数据可能会用不必要的数据污染缓存。如果必须执行行填充,但随后由于 memset() 写入了整行而丢弃行填充数据,还可能浪费功耗和性能。

为防止这种情况,Cortex-M7 总线接口单元(BIU)包含逻辑,用于检测在行填充完成之前核心是否已写入完整缓存行。如果在连续三次行填充中检测到这种情况,则切换到动态读分配模式。处于动态读分配模式时,加载行为正常,仍可导致行填充;写仍在缓存中查找,但如果未命中,则写出到外部存储器,而不是开始行填充。

BIU 继续处于动态读分配模式,直到检测到对不是完整缓存行的外部存储器的可缓存写突发,或者存在对当前正在写入外部存储器的同一行的加载。

可以通过将 ACTLR.DISRAMODE 设置为 1 来禁用动态读分配模式。参见辅助控制寄存器。

9.2. 存储缓冲区

内存系统包含存储缓冲区,用于在数据写入缓存 RAM 或传递到 AXIM 接口之前保存数据。存储缓冲区有四个条目。每个条目最多可包含 64 位数据和 32 位地址。来自数据侧且非 TCM 或 AHBP 接口的所有写请求都存储在存储缓冲区中。

存储缓冲区合并

存储缓冲区具有合并能力。如果先前的写访问更新了某个条目,同一行上的其他写访问可以合并到该条目中。只有对 Normal 存储器的存储才能合并。

如果不同条目内的数据属于同一缓存行,则可以在链接在一起的多个条目之间进行合并。

对 Strongly-ordered 或 Device 存储器的写不发生合并。处理器在执行 Strongly-ordered 或 Device 读之前根据需要自动排空存储缓冲区。

存储缓冲区行为

存储缓冲区将写请求定向到以下模块:

  • 可缓存写命中的缓存控制器: 存储缓冲区发送缓存查找,以检查缓存是否在指定行中命中;如果命中,存储缓冲区在条目排空时将其数据合并到缓存中。
  • AXIM 接口:
  • 对于在数据缓存中未命中的不可缓存、Write-Through 可缓存、Write-Back no Write-Allocate 可缓存存储,在 AXIM 接口上执行写访问。
  • 对于在数据缓存中未命中的 Write-Back、Write-Allocate 存储,使用两个行填充缓冲区之一开始行填充。当行填充数据从外部内存系统返回时,存储缓冲区中的数据合并到行填充缓冲区,随后写入缓存。

存储缓冲区排空

在以下情况下排空存储缓冲区条目:

  • 条目中的所有字节都已写入。这可能来自合并。
  • 条目可以合并到行填充缓冲区。
  • 条目包含对 Device 或 Strongly-ordered 存储器的存储。
  • 条目是不可缓存或 Write-Through,且等待合并数据时间过长。

在以下情况下完全排空存储缓冲区:

  • 对以下操作执行显式排空请求:
  • 缓存维护操作。
  • DMB 或 DSB 指令。
  • 对 Shared 存储器的独占存储。
  • 存储缓冲区已满或可能变满。

在执行从 Strongly-ordered 或 Device 存储器的加载之前,存储缓冲区中所有对 Strongly-ordered 或 Device 存储器的存储都被排空。

9.3. 缓存维护操作

所有缓存维护操作通过写入内部 PPB 存储器空间的存储器映射系统控制空间(SCS)区域中的寄存器来执行。数据缓存支持的操作是:

  • 按地址无效化。
  • 按 Set/Way 组合无效化。
  • 按地址清理。
  • 按 Set/Way 组合清理。
  • 按地址清理并无效化。
  • 按 Set/Way 组合清理并无效化。

指令缓存支持的操作是:

  • 全部无效化。
  • 按地址无效化。

更多信息参见 Arm®v7-M 架构参考手册。

9.4. 缓存与内存系统的交互

使能或禁用指令缓存后,必须发出 ISB 指令以刷新流水线。这确保所有后续指令取指都能看到使能或禁用指令缓存的效果。

复位后,必须在使能每个缓存之前使其无效化。

禁用数据缓存时,必须清理整个缓存,以确保任何脏数据被刷写到外部存储器。

使能数据缓存之前,必须使整个数据缓存无效化,因为缓存禁用期间外部存储器可能已发生变化。

使能指令缓存之前,如果缓存禁用期间外部存储器可能已发生变化,则必须使整个指令缓存无效化。

参见第 4 章初始化,了解适合初始化和使能指令缓存和数据缓存并使其无效化的示例代码。