Armv8-M架构概述:
关于Armv8架构和architecture profiles
Arm定义了三个architecture profiles:
A 应用程序profile:
支持基于内存管理单元(MMU)的虚拟内存系统架构(VMSA)。
支持A64、A32和T32指令集。
R 实时profile:
支持AArchi64或AArchi32执行状态。
支持A64或A32和T32指令集。
支持基于内存保护单元(MPU)的受保护内存系统架构(PMSA)。
支持VMSA。
M 本手册中描述的微控制器profile:
实现专为低延迟中断处理而设计的程序员模型,寄存器的硬件堆叠并支持用高级语言编写中断处理程序。
可选地实现基于MPU的PMSA变体。
支持T32指令集的变体。
Armv8-M architecture profile:
M-Profile架构包括:
有机会包括简单的流水线设计,在广泛的市场和应用中提供领先的边缘系统性能水平。
高度确定性操作:
单次或低循环计数执行。
最小中断延时。
能够进行无缓存操作。
出色的C/C++ 代码针对性。这符合该领域的Arm编程标准:
异常处理程序是标准的C/C++ 函数,使用标准调用约定输入。
深度嵌入式系统的设计支持:
低针数设备。
支持事件驱动系统的调试和软件分析。
Armv8-M指令集
Armv8-M仅支持执行T32指令。
Baseline implementation
没有任何可选扩展的最简单Armv8.0-M实现是基准实现。Armv8.0-M基准在以下领域提供了对以前M-Profile架构的改进:
改进的内存保护单元模型(MPU)。
与Armv8-A和Armv8-R内存类型保持一致。
堆栈指针限制检查。
改进了对多处理器的支持。
更好地与C11和C11++标准保持一致。
增强的调试功能。
在本架构参考手册中,基准实现被称为没有主扩展的实现。
嵌套矢量中断控制器
嵌套矢量中断控制器(NVIC)用于集成中断和异常处理以及优先级。Armv8-M将NVIC可能支持的中断数量增加到480个外部源,并包括自动矢量化和优先级管理以及自动状态保存。
可选扩展:
CDE-自定义数据路径扩展
自定义数据路径扩展是Armv8-M架构提供的可选特征。包含自定义数据路径扩展的实现必须实现主扩展(M)所需的所有功能,并且可能实现以下可选功能:
浮点扩展(FP)提供的功能。
Armv8.1 M向量扩展(MVE)提供的功能。
对S或D寄存器文件进行操作的指令需要FPorMVE。对Q寄存器文件进行操作的指令需要MVE。
调试
Armv8-M架构引入:
增强的断点和观察点功能。
Instrumentation Trace Macrocell(ITM)的改进。
全面的跟踪和自托管调试扩展,使嵌入式软件更容易调试和跟踪。
可以布置以下可选外围设备:
数据跟踪和观察点单元。
嵌入式跟踪宏单元。
插桩跟踪宏单元。
The Flash Patch和断点单元。
跟踪端口接口单元。
停止调试是允许调试器停止PE的可选特征。
生成跟踪数据包需要主扩展。
ID_DFR0中表示了对Armv8-M调试架构的支持。
适用于Armv8.0-M以后的架构实现。
在Armv8.1-M实现中,可选的非特权调试扩展增加了对非特权调试的支持。
放宽了对多个寄存器的访问限制,以允许调试器在PE未处于调试状态时写入寄存器。
ID_DFR0.UDE中指出了对Armv8-M调试架构的支持。
适用于Armv8.1-M以上架构的实现。
DSP-数字信号处理扩展。
DSP数字信号处理扩展是一个可选特征。DSP增加了对SIMD指令的支持。
实现DSP扩展的PE必须实现主扩展(M)。
以下寄存器显示了对DSP的支持:
ID_ISAR1。
ID_ISAR2。
ID_ISAR3。
适用于架构Armv8.0-M以上架构的实现。
DSP调试扩展(DSPDE)
Armv8.1-M增加了对DSP的可选调试支持。
如果实施了DSPDE,则必须实施停止调试。
如果实现了MVE和DWT-D,则必须实现DSPDE。
适用于Armv8.1-M以上架构的实现。
浮点扩展
实现浮点扩展的PE必须实现主扩展(M)。
浮点扩展支持单精度浮点指令或单精度和双精度浮点指令。
适用于架构Armv8.0-M以上架构的实现。
HP-半精度浮点指令
Armv8.1-M架构扩展了浮点扩展以包括半精度数据类型,如果实现单精度数据类型,也必须实现半精度数据类型。
适用于架构Armv8.1-M以上架构的实现。
主扩展
实现主扩展的PE实现系统定时器扩展。
注:
具有主扩展的PE也称为主线实现。
没有主扩展的PE也称为基线实现。基线实现具有主线实现的指令、寄存器和功能的子集。
Armv7-M兼容性需要主扩展。
Armv6-M兼容性由所有Armv8-M实现提供。
CPUID. Architecture中指出了对主扩展的支持。
适用于架构Armv8.0-M以上架构的实现。
MPU(Memory Protection Unit)模型:
Armv8-M架构提供系统地址映射,并允许实现包含可选MPU。可选微处理器使用受保护的内存系统架构(PMSAv8),并在微处理器区域定义中包含改进的灵活性。
Armv8.1-M体系结构为MPU区域引入了另一个属性,MPU_RLAR. PXN。
适用于架构Armv8.1-M以上架构的实现。
M-Profile矢量扩展,MVE
此扩展提供对各种SIMD数据类型的操作。
它由MVE-I(整数)和MVE-F(浮点)组成。
实现MVE-I的PE需要主扩展(M)和DSP扩展(DSP)提供的功能。
实现MVE-F的PE需要实现浮点扩展(FP)和MVE-I。
对MVE的支持在ID_MVFR1。
注:
Armv8-M MVE也可称为Armv8-M的Arm Helium™ 。
适用于架构Armv8.1-M以上的实现。
指针认证和分支目标识别扩展
Armv8.1-M的可选指针身份验证和分支目标识别扩展(PACBTI)增加了对寄存器内容的身份验证的支持,在寄存器用作负载或间接分支的目标之前,还支持堆栈指针的身份验证。
ID_ISAR5表示支持PACBTI扩展。
适用于Armv8.1-M以上架构的实现。
性能监视器扩展
在Armv8.1-M实现中,可选的性能监视器扩展增加了对性能监视器单元(PMU)的支持。
PMU_TYPE. N表示对性能监视器扩展的支持。
适用于Armv8.1-M以上架构的实现。
可靠性、可用性和可服务性
在Armv8.1-M实现中,可靠性、可用性和可服务性(RAS)扩展添加了额外的调试支持。最低RAS扩展在Armv8.1-M实现中是强制性的。
ID_PFR0.RAS指示支持RAS。
适用于Armv8.1-M以上架构的实现。
安全扩展
Armv8-M架构为M-Profile架构引入了许多新指令以支持资产保护。这些指令仅适用于支持安全扩展的实现。
从Armv8.1-M线程模式可以在SG指令上禁用重入。
适用于架构Armv8.1-M以上的实现。
在具有主扩展的PE中,对安全扩展的支持在 ID_PFR1.Security中指示。
注:
Armv8-M安全扩展也可以称为Armv8-M的Arm TrustZone。
系统定时器扩展
系统定时器扩展,也称为SysTick,提供了一个递减的、wrap-on-zero、写时清除的计数器。
这是没有主扩展的PE的可选功能,如果没有,则实现一个或两个计数器。如果实现了一个计时器,它将在安全状态之间共享,如果实现了安全扩展。如果实现了两个计时器,每个安全状态都有一个专用计时器。
在主扩展的实现中,每个安全状态实现一个计时器。
ARMv8-M架构规则:
复位,冷复位,热复位:
它是不可能有一个冷复位也有一个热复位。
在冷复位时,具有定义的复位值的寄存器包含该值。
在热复位时,某些具有定义的复位值的调试寄存器控制字段保持不变,但其他所有具有定义的复位值的寄存器都包含该值。
在热复位时,PE执行 TakeReset() 伪代码描述的操作。
AIRCR. SYSRESETREQ用于请求热复位。
对于AIRCR. SYSRESETREQ,该架构不保证立即进行重置。
电源管理:
以下指令和伪代码函数向PE硬件暗示它可以暂停执行并进入低功耗状态:
WaitForEvent().
WaitForInterrupt().
SleepOnExit().
等待事件(WFE)指令
当执行WFE指令时,如果事件寄存器的状态为清除clear,PE可以暂停执行并进入低功耗状态。
当执行WFE指令时,如果设置了事件寄存器的状态,则该指令清除寄存器并立即完成。
如果PE在WFE指令上进入低功耗状态,它将保持在该低功耗状态,直到它收到WFE唤醒事件。当PE识别出WFE唤醒事件时,WFE指令完成。以下是WFE唤醒事件:
任何PE执行SEV指令。
当SCR. SEVONPEND为1时,任何异常都进入挂起状态。
优先级上的任何异常将抢占当前执行优先级,考虑到任何活动异常,包括AIRCR. PRIS==1和PRIMASK、FAULTMASK或BASEPRI的任何软件控制优先级提升的影响。
如果启用了调试,则为调试事件。
任何IMPLEMENTATION DEFINED的事件。
当SCR. SLEEPDEEP为1且SCR.SEVONPEND为1时,执行定义是否有任何进入挂起状态的异常将充当WFE唤醒事件并唤醒PE。
Armv8-M架构没有定义在指令上输入的低功耗状态的确切性质,只是它不会导致内存一致性的损失。
Arm建议软件始终循环使用WFI指令。
事件寄存器
事件寄存器是系统中每个PE的一位寄存器。
PE的事件寄存器由以下任一设置:
任何WFE唤醒活动。
异常条目。
异常返回。
设置事件寄存器时,表示自上次清除寄存器以来发生了事件,并且该事件可能需要PE执行某些操作。
一次复位会清除事件寄存器。
执行WFE指令将清除事件寄存器。
软件不能直接读取和写入事件寄存器。
等待中断(WFI)指令
当执行WFI指令时,PE可以暂停执行并进入低功耗状态。如果是这样,它将保持该状态,直到收到WFI唤醒事件。当PE识别出WFI唤醒事件时,WFI指令完成。以下是WFI唤醒事件:
reset。
任何具有优先级的异步异常,如果忽略PRIMASK的影响(因此行为就好像PRIMASK为0),将抢占任何当前活动的异常。
IMPLEMENTATION DEFINED的WFI唤醒事件。
如果启用了调试,则为调试事件。
如果以下任一情况,调试事件将是唤醒事件:
PE的当前安全状态允许停止调试,并且PE需要进入调试状态。
DebugMonitor异常被断言,并且该异常具有足够的优先级来抢占PE的当前优先级。
设置DEMCR.MON_PEND不需要导致唤醒事件。
如果PE的当前安全状态和特权模式允许非特权调试,则非特权调试事件将是唤醒事件。如果未启用非特权调试,则该事件将被挂起并在允许非特权调试时执行。
Arm建议软件始终循环使用WFI指令。
Sleep on exit
SleepOnExit() 函数是否会导致PE在从唯一活动异常返回到线程模式期间进入低功耗状态,这是实现定义的。
当以下所有条件均为真时,允许PE在从唯一活动异常返回时进入低功耗状态:
EXC_RETURN. Mode==1。
SCR. SLEEPONEXIT==1。
如果启用了退出时睡眠功能,则它是在异常返回过程中PE进入低功耗状态的时刻定义的。
退出时睡眠功能的唤醒事件与WFI指令唤醒事件相同。
编程模型:
PE modes, Thread mode and Handler mode:
有两种PE模式:
线程模式。
处理程序模式。
PE模式的常见使用模型是:
线程模式:应用程序。
处理程序模式:操作系统内核和相关功能,用于管理系统资源。
PE在Handler模式下处理所有异常。
复位时选择线程模式。
特权和非特权执行
线程模式:执行可以是特权的或非特权的。
处理程序模式:执行总是有特权的。
CONTROL. nPRIV确定线程模式下的执行是否无特权。
在没有主扩展的PE中,是否可以将CONTROL.nPRIV设置为1是实现定义的。
执行权限可以确定资源是否可访问。
特权执行通常比非特权执行可以访问更多资源。
寄存器
有以下类型的寄存器:
通用寄存器,全部32位:
R0-R12(Rn)。
R13。这是堆栈指针(SP)。
R14。这是链接寄存器(LR)。
程序计数器,32位:
R15是程序计数器(PC)。
特殊用途寄存器:
掩码寄存器:
1位异常掩码寄存器,PRIMASK。
8位基本优先级掩码寄存器,BASEPRI。
1位故障掩码寄存器,FAULTMASK。
一个控制寄存器,它是:
当浮点扩展、MVE、安全扩展和PACBTI扩展都未实现时为2位。
3位,当浮点扩展或MVE已实现,但未实现安全扩展和PACBTI扩展时。
当安全扩展和浮点扩展或MVE中的至少一个都实现了,但未实现PACBTI扩展时为4位。
实现PACBTI扩展时为8位。
两个32位堆栈指针限制寄存器,MSPLIM和PSPLIM,如果未实现主扩展,这些寄存器的非安全版本是RAZ/WI。
组合32位程序状态寄存器(XPSR),包括:
应用程序状态寄存器(APSR)。
中断程序状态寄存器(IPSR)。
执行程序状态寄存器(EPSR)。
内存映射寄存器:
所有其他寄存器。
32位组合异常返回程序状态寄存器RETPSR包含从XPSR派生的保存状态的有效负载。
扩展可能会向基本寄存器集添加更多寄存器。
SP指的是活动堆栈指针、主堆栈指针或进程堆栈指针。
如果实施了主扩展,则LR在热复位时设置为0xFFFFFFFF。
如果未实现主扩展,则LR在热复位时变为未知。
PC在热复位时加载了复位处理程序的起始地址。
PC包含当前正在执行的指令的指令地址。如果一条指令读取PC的值,则使用的值是PC加4的值。
除了写入CONTROL寄存器外,保证CPS或MSR指令对专用寄存器的任何更改:
不影响CPS或MSR指令,或程序顺序中在其之前的任何指令。
对CPS或MSR之后按程序顺序出现的所有指令可见。
除非寄存器描述中另有说明,否则本参考手册中描述的内存映射寄存器中具有分配值的字段的所有未分配或保留值都以以下方式之一运行:
编码映射到任何分配的值,但不会导致受限的不可定义行为。
编码会产生影响,可以通过组合多个分配的编码来实现。
编码导致字段没有功能影响。
被描述为只写(WO)的寄存器的读数表现为RES0。
写入描述为只读(RO)的寄存器不会导致只读寄存器的修改。
Special-purpose CONTROL寄存器(专用控制寄存器):
MRS和MSR指令可用于访问CONTROL寄存器。
特权执行可以写入CONTROL寄存器。PE忽略对CONTROL寄存器的非特权写入。允许对CONTROL寄存器的所有读取,无论权限如何。
该体系结构需要上下文同步事件来保证CONTROL寄存器更改的可见性。
PE在异常输入和异常返回时自动更新CONTROL.SPSEL。
CONTROL.SPSEL在PE处于线程模式时选择堆栈指针。
XPSR, APSR, IPSR, and EPSR:
APSR、IPSR和EPSR组合成一个寄存器,即XPSR:
保留任何APSR、IPSR或EPSR中的所有未使用位,或组合XPSR中的任何未使用位。
MRS和MSR指令识别以下助记符以访问APSR、IPSR或EPSR或它们的组合:
Arm不推荐使用不带 _限定符的MSR APSR作为MSR APSR_nzcvq的别名。
中断程序状态寄存器(IPSR):
当PE处于线程模式时,IPSR值为零。
当PE处于处理程序模式时:
在发生异常的情况下,IPSR保存正在处理的异常的异常号。
当从安全状态到非安全状态进行函数调用时,IPSR的值为1。
PE在异常进入和返回时更新IPSR。
PE忽略MSR指令对IPSR的写入。
如果使用DCRDR更改IPSR的值,则IPSR的值变为UNKNOWN。如果DCRDR尝试将IPSR设置为非法值,则UNKNOWN值将设置为已知的合法值之一。
使用DCRDR和DCRSR机制写入IPSR将被忽略。
执行程序状态寄存器 (EPSR):
重置将EPSR.T设置为重置向量的位[0]的值。
当EPSR. T是:
0:任何执行任何指令的尝试都会生成:
具有主扩展的PE中的INVSTATE UsageFault。
硬故障,在没有主扩展的PE中。
1:指令集状态为T32状态,所有指令解码为T32指令。
目的是指令集状态始终为T32状态。
使用MRS指令读取所有EPSR字段为零。PE忽略MSR指令对EPSR的写入。
安全状态:安全状态和非安全状态
具有安全扩展的PE有两个安全状态:
安全状态。
安全线程模式。
安全处理程序模式。
非安全状态。
非安全线程模式。
非安全处理程序模式。
如果实施了安全扩展,则标记为安全的内存区域和其他关键资源只能在PE以安全状态执行时访问。
带有安全扩展的PE在Armv8-M复位、冷复位和热复位时都复位到安全状态。
没有安全扩展的PE在Armv8-M复位、冷复位和热复位时都复位为非安全状态。
安全状态和安全状态之间的寄存器banking
在具有安全扩展的PE中,一些寄存器在安全状态之间存储。当一个寄存器以这种方式存储时,有一个不同的寄存器实例处于安全状态,另一个不同的寄存器实例处于非安全状态。
在具有安全扩展的PE中:
存储的通用寄存器是:
R13。这是堆栈指针(SP)。
存入的专用寄存器是:
掩码寄存器、PRIMASK、BASEPRI和FAULTMASK。
CONTROL寄存器中的一些位。
主堆栈和进程堆栈指针限制寄存器,MSPLIMandPSPLIM。
系统控制空间(SCS)中的所有寄存器都有一个非安全别名,只能从安全状态访问。
对于MRS和MSR(寄存器)指令,指令编码中的SYSm[7]指定是访问银行寄存器的Secure实例还是非安全实例:
使用以下命名约定来标识banked寄存器:
_S:寄存器的Secure实例。
_NS:寄存器的非安全实例。
:与当前安全状态关联的实例。
栈指针
在具有安全扩展的PE中,实现了四个堆栈和四个堆栈指针寄存器:
在没有安全扩展的PE中,实现了两个堆栈和两个堆栈指针寄存器:
在异常返回时,Armv8-M架构仅支持双字对齐的堆栈指针。
如果在异常返回时,堆栈指针没有双字对齐,则CONSTRAINED UNPREDICTABLE行为是:
将堆栈指针视为实际值。
将堆栈指针视为对齐。
在Handler模式下,PE使用主堆栈。
在线程模式下,CONTROL.SPSEL确定PE是使用主堆栈还是进程堆栈。
在没有安全扩展的PE中,MSP在复位时被选择并初始化。
在具有安全扩展的PE中,安全主堆栈MSP_S在重置时被选择并初始化。
在热复位时,所选堆栈指针(MSP或MSP_S)设置为Vector表中包含的值,如TakeReset() 中所述。
处于安全状态的MSP或PSP的位[1:0]都是RES0H,因此始终保证所有堆栈指针都是字对齐的。
如果指令指出SP不可预测并且使用SP:
从SP读取或写入SP的值是未知的。
允许将指令视为UNDEFINED。
如果正在写入SP,则不知道是否应用了堆栈限制检查。
成功完成异常条目堆叠操作后,由于异常条目而推送的堆栈的堆栈指针是双字对齐的。
Arm建议安全堆栈位于安全内存中。
异常编号和异常优先级编号:
每个异常都有一个关联的异常编号和一个关联的优先级编号。
在具有主扩展的PE中,异常、相关编号和相关优先级编号如下:
当AIRCR. BFHFNMINS为1时,以升级为HardFault的安全状态为目标的故障仍然是Secure HardFaults。也就是说,AIRCR.BFHFNMINS的值不会影响以升级为HardFault的安全状态为目标的故障。此表行适用于此类故障。
如果未实施安全扩展,则保留Exception 7。
在没有主扩展的PE中,异常、相关编号和相关优先级编号如下:
当AIRCR. BFHFNMINS为1时,以升级为HardFault的安全状态为目标的故障仍然是Secure HardFaults。也就是说,AIRCR.BFHFNMINS的值不会影响以升级为HardFault的安全状态为目标的故障。此表行适用于此类故障。
无论是否实现主扩展,支持的最大外部中断数为496。
该体系结构允许实现省略外部可配置中断,其中没有外部设备连接到相应的中断引脚。如果实现省略这样的中断,则相应的挂起、活动、启用和优先级寄存器是RES0。
在具有主扩展的PE中,可以在系统控制块(SCB)中使用SHPR1-SHPR3配置具有可配置优先级编号的以下异常:
内存管理错误。
BusFault。
用法错误。
SecureFault(如果实施了安全扩展)。
SVCall。
DebugMonitor异常。
PendSV。
SysTick。
在没有主扩展的PE中,可以在系统控制块(SCB)中使用SHPR2和SHPR3配置具有可配置优先级编号的以下异常:
SVCall。
PendSV。
SysTick。
可以使用NVIC_IPRn.PRI_寄存器字段配置所有其他可配置异常。
可配置优先级号从0开始,这是最高的可配置异常优先级号。
在具有主扩展的PE中,可配置优先级编号的数量是8-256范围内2的幂:
SHPRIn.PRI_n的所有低阶位未作为优先级实现的都是RES0,如最大优先级数列所示。
在没有主扩展的PE中,可配置优先级数的数量为4:
SHPRn.PRI_n[5:0]是RES0,如最大优先级数列所示。
异常启用、挂起和活动位:
SHCSR、ICSR、DEMCR、NVIC_IABRn、NVIC_ISPRn包含异常启用、挂起和活动字段。STIR可用于挂起异常。
以下异常始终启用,因此没有异常启用位:
如果未实施安全扩展,则安全HardFault或非安全HardFault。
NMI。
SVCall。
PendSV。
在没有安全扩展的PE中:
特权执行可以通过写入NVIC_ISPRn来暂停中断。
当CCR. USERSETMPEND为1时,非特权执行可以通过写入STIR来挂起中断。
在具有安全扩展的PE中:
STIR可以挂起任何安全或非安全中断,如下所示:
Secure state | Non-secure state | |
Privileged execution | 可以使用STIR挂起任何安全或非安全中断 | 可以使用STIR挂起非安全中断 |
Unprivileged execution | 当CCR_S. USERSETMPEND为1时,可以使用STIR挂起任何安全或非安全中断,否则当CCR_S.USERSETMPEND为0时,会生成BusFault | 当CCR_NS.USERSETMPEND为1时,可以使用STIR挂起任何非安全中断,否则当CCR_NS.USERSETMPEND为0时,将生成BusFault |
STIR_NS可以挂起非安全中断,如下所示:
Secure state | Non-secure state | |
Privileged execution | 可以使用STIR_NS. pend非安全中断 | RES0 |
Unprivileged execution | 当CCR_NS. USERSETMPEND为1时,可以使用STIR_NS挂起非安全中断,否则当CCR_NS.USERSETMPEND为0时,将生成BusFault | BusFault |
NVIC_ISPRn可以挂起任何安全或非安全中断,如下所示:
Secure state | Non-secure state | |
Privileged execution | 可以使用NVIC_ISPRn挂起任何安全或非安全中断 | 可以使用NVIC_ISPRn挂起非安全中断 |
Unprivileged execution | BusFault | BusFault |
NVIC_ISPRn_NS可以挂起非安全中断,如下所示:
Secure state | Non-secure state | |
Privileged execution | 可以使用NVIC_ISPRn_NS挂起非安全中断 | RES0 |
Unprivileged execution | BusFault | BusFault |
安全状态,异常banking:
一些异常被banked。被banked的异常具有以下所有内容:
banked启用位、挂起位和活动位。
banked的SHPRn. PRI字段。
banked的异常向量。
与状态相关的处理程序。
MemManage Fault、UsageFault、BusFault和DebugMonitor异常需要实现主扩展。SecureFault需要实现安全扩展。
如果主扩展被实现,则SysTick异常被banked。如果主扩展没有实现,如果异常被banked,或者如果有一个实例具有可配置的目标安全状态,则它是实现定义的。
banked的同步异常以获取它的安全状态为目标,但以下情况除外:
当访问仅被NSACR禁用的协处理器时,由于该访问而生成的任何NOCP UsageFault都将以安全状态为目标,即使PE处于非安全状态执行。
访问仅被CPPWR禁用的协处理器时,如果相应的CPPWR.SUSm位设置为1,则由此访问产生的任何NOCP UsageFault都将以安全状态为目标,否则NOCP UsageFault将以当前安全状态为目标。
如果指令触发惰性浮点状态保存,则会引发存储异常,就好像当前安全状态与浮点状态相同一样,如FPCCR. S所示。
由指令获取引起的banked故障和异常将针对与指令地址关联的安全状态,而不是当前的安全状态。
由于AIRCR. BFHFNMINS设置为1,因此启用了非安全HardFault,以下内容适用:
通过升级生成的HardFault异常将针对原始异常在升级到HardFault之前的安全状态。
由于向量获取失败而生成的HardFault将针对向量获取失败期间引发的异常的安全状态,而不是当前的安全状态。
MemManage故障由堆叠状态上下文寄存器或异常条目上的附加状态上下文寄存器触发,包括尾链目标与后台状态关联的安全状态,如EXC_RETURN.S所示。
如果AIRCR. BFHFNMINS==0,则所有非安全HardFaults都升级为Secure HardFaults,并且非安全挂起位对于除显式读取和写入之外的所有内容都表现为零。
如果实现有两个SysTick计时器,每个计时器都处于安全状态,则每个计时器都针对其拥有的安全状态,而不是PE的当前执行状态。
NMI可以使用AIRCR. BFHFNMIS配置为针对任一安全状态。
可以使用AIRCR. BFHFNMIN将BusFault配置为针对任一安全状态。
SecureFault始终以安全状态为目标。
如果状态位DEMCR.SDME为1,则DebugMonitor异常以安全状态为目标。否则,它以非安全状态为目标。
每个外部中断0-N都针对其NVIC_ITNSn[bit number]指示的安全状态。
当以安全状态为目标时,其优先级字段的非安全视图,任何启用、挂起和活动位,都是RAZ/WI。
是以下之一:
NMI。
BusFault。
调试监视器。
外部中断N。
在没有主扩展的PE中,以及SysTick定时器的单个实例SysTick。
安全软件必须确保在更改异常的目标安全状态时,异常不是挂起的或活动的。当异常挂起或活动时,更改异常的安全状态可能会导致不可预测的行为。
故障:
有以下故障状态寄存器:
硬件故障状态寄存器HFSR。仅在实施主扩展时存在。
MemManage故障状态寄存器MMFSR。仅在实现主扩展时存在。
BusFault状态寄存器BFSR。仅在实现主扩展时存在。
使用故障状态寄存器UFSR。仅在实现主扩展时存在。
安全故障状态寄存器SFSR。仅在实现主扩展时存在。
调试故障状态寄存器DFSR。仅当实施停止调试或主扩展时才存在。
辅助故障状态寄存器AFSR。该寄存器的内容是实现定义的。
RAS故障状态寄存器RFSR。
在具有主扩展的PE中,BFSR、MMFSR和UFSR组合成一个寄存器,称为可配置故障状态寄存器(CFSR)。
除非另有说明,否则MMFAR仅针对直接数据访问时的MemManage故障进行更新。
除非另有说明,否则BFAR仅针对数据访问上的BusFault更新,这是一个精确的故障。
除非另有说明,否则SFAR仅针对导致安全归因单元违规的内存访问上的SecureFault进行更新。
每个故障地址寄存器都有一个相关的有效位。当PE更新故障地址寄存器时,PE将有效位设置为1。
如果发生故障,否则会将FAR有效位设置为1,该位已由较早的故障设置,则实施定义是否:
FAR寄存器随着新syndrome而更新。
FAR寄存器保留了原始故障的syndrome。
如果未实施安全扩展,则实施定义是否实施了单独的BFAR和MMFAR。如果实施了一个共享故障地址寄存器,则在否则会更新共享故障地址寄存器的故障上,如果其他有效位之一设置为1,则实施定义是否:
更新共享故障地址寄存器,设置故障的有效位,清除另一个有效位。
共享故障地址寄存器不更新,有效位不更改。
如果实现了安全扩展,是否为每个故障实现单独的故障地址寄存器是实现定义的。如果每个安全状态实现一个共享故障地址寄存器,那么在一个否则会更新共享故障地址寄存器的故障上,如果同一安全状态的其他FAR有效位之一设置为1,则是否实现定义:
更新共享故障地址寄存器,设置故障的有效位,清除另一个有效位。
共享故障地址寄存器不更新,有效位不更改。
AIRCR. BFHFNMINS根据安全状态规定使用哪些共享故障寄存器:
在安全状态下,可能共享的故障寄存器是SFAR和MMFAR_S,当AIRCR. BFHFNMINS为0时,BFAR。
在非安全状态下,可能共享的故障寄存器MMFAR_NS,当AIRCR. BFHFNMINS为1时,BFAR。
例如,在包含共享故障地址寄存器的实现中,可以使用导致BusFault故障的正在访问的内存位置的地址写入共享故障寄存器,并且BFSR. BFARVALID设置为1。如果在随后发生可能更新共享故障地址寄存器的MemManage故障时仍设置BFSR.BFARVALID,则它是一个实现定义的选择:
使用导致MemManage故障的综合征更新共享故障地址寄存器,清除BFSR. BFARVALID并设置MemManage故障的MMFSR.MMARVALID。
保留导致BusFault的内存位置的地址,丢弃由MemManage故障生成的故障地址信息,而不清除BFSR. BFARVALID或更新MMFSR.MMARVALID以获取MemManage故障。
如果出现以安全状态为目标的Secure MemManage故障,如ExceptionTargetsSecure() 所述,则使用导致MemManage故障的内存位置地址写入安全共享故障寄存器,并将MMFSR_S. MMARVALID设置为1。如果在SecureFault随后发生时仍设置MMFSR_S.MMARVALID,则可以在以下之间进行实现定义的选择:
使用导致SecureFault、MMFSR_S. MMARVALID被清除和SFSR.SFARVALID被设置的内存位置的地址更新共享故障地址寄存器。
导致MemManageFault的内存位置的地址被保留,SecureFault生成的故障地址信息被丢弃,而不清除MMFSR_S. MMARVALID或更新SFSR.SFARVALID。
Arm强烈建议,如果实施了单独的BFAR,则在更改AIRCR. BFHFNMINS时清除关联的BFAR和BFSR.BFARVALID位,以免将最后访问的地址暴露为非安全状态。
实施安全扩展时:
如果AIRCR. BFHFNMINS为0,则读取BFAR_NS将返回0。
如果AIRCR. BFHFNMINS为1,则读取BFAR_NSBFAR_S可能返回相同的值。如果在不同安全状态的BFAR读取之间更改了AIRCR.BFHFNMINS,则不能依赖此行为。