Cortex-M3(以下简称CM3)和Cortex-M4(以下简称CM4)内核的Fault异常可以捕获非法内存方法和非法编程行为。Fault异常能够检测到以下情况:
通过以上三步,我们就可以使用结构体指针SCB来访问系统控制寄存器组的寄存器了,比如给系统控制寄存器SCR赋值:SCB->SCR=0xFF;SCB->CCR寄存器控制除数为零和未对齐内存访问是否触发用法Fault。
地址/访问
寄存器
复位值
描述
0xE000ED14
RW 特权级
SCB->CCR
0x00000000
配置和控制寄存器:包含控制除数为零和未对齐内存访问是否触发用法Fault的使能位。
0xE000ED18
RW 特权级
SCB->SHP[12]
0x00
系统处理程序优先级寄存器:控制异常处理程序的优先级
0xE000ED24
RW特权级
SCB->SHCSR
0x00000000
系统处理程序控制和状态寄存器
位
名称
描述
[31:10]
-
保留
[9]
STKALIGN
表示进入异常时的堆栈对齐。
0:4字节对齐
1:8字节对齐
进入异常时,处理器使用压入堆栈的PSR位[9]来指示堆栈对齐。从异常返回时,这个堆栈位被用来恢复正确的堆栈对齐。
[8]
BFHFNMIGN
使能时,使得以优先级位-1或-2运行的处理程序忽略加载和存储指令引起的数据总线故障。它用于硬故障、NMI和FAULTMASK升级处理程序中:
0:加载和存储指令引起的数据总线故障会引起锁定。
1:以优先级-1或-2运行的处理程序忽略加载和存储指令引起的数据总线故障。
仅在处理程序和其数据处于绝对安全的存储器时将该位设为1。一般将该位用于探测系统设备和桥接器以检测并纠正控制路径问题。
[7:5]
-
保留
[4]
DIV_0_TRP
当处理器进行除0操作(SDIV或UDIV指令)时,会导致故障或停止。
0:不捕获除以零故障
1:捕获除以零故障。
当该位设为0时,除以零返回的商数为0。
[3]
UNALIGN_TRP
使能非对齐访问捕获:
0:不捕获非对齐半字和字访问
1:捕获非对齐半字和字访问。
如果该位设为1,非对齐访问产生一个使用故障。无论UNALIGN_TRP是否设为1,非对齐的LDM、STM、LDRD和STRD指令总是出错。
[2]
-
保留
[1]
USERSETM
PEND
使能对STIR的无特权软件访问。
0:禁能
1:使能
[0]
NONEBASE
THRDENA
指示处理器如何进入线程模式:
0:处理器仅在没有有效异常时才能够进入线程模式。
1:处理器可以从EXC_RETURN值控制下的任何级别进入线程模式
位
名称
描述
[31:19]
-
保留
[18]
USGFAULTENA
用法Fault使能位,设为1时使能
[17]
BUSFAULTENA
总线Fault使能位,设为1时使能
[16]
MEMFAULTENA
存储器管理Fault使能位,设为1使能
[15]
SVCALLPENDED
SVC调用挂起位,如果异常挂起,该位读为1
[14]
BUSFAULTPENDED
总线Fault异常挂起位,如果异常挂起,该位读为1
[13]
MEMFAULTPENDED
存储器Fault故障异常挂起位,如果异常挂起,该位读为1
[12]
USGFAULTPENDED
用法Fault异常挂起位,如果异常挂起,该位读为1
[11]
SYSTICKACT
SysTick 异常有效位,如果异常有效,该位读为1
[10]
PENDSVACT
PendSV异常有效位,如果异常有效,该位读为1
[9]
-
保留
[8]
MONITORACT
调试监控有效位,如果调试监控有效,该位读为1
[7]
SVCALLACT
SVC调用有效位,如果SVC调用有效,该位读为1
[6:4]
-
保留
[3]
USGFAULTACT
用法Fault异常有效位,如果异常有效,该位读为1
[2]
-
保留
[1]
BUSFAULTACT
总线Fault异常有效位,如果异常有效,该位读为1
[0]
MEMFAULTACT
存储器管理Fault异常有效位,如果异常有效,该位读为1
地址/访问
寄存器
复位值
描述
0xE000ED28
RW 特权级
SCB->CFSR
0x00000000
可配置Fault状态寄存器:包含指示存储器管理Fault、总线Fault或用法Fault的原因位
0xE000ED2C
RW 特权级
SCB->HFSR
0x00000000
硬Fault状态寄存器:包含用于指示硬Fault原因位。
0xE000ED34
RW特权级
SCB->MMFAR
不可知
存储器管理Fault地址寄存器:包括产生存储器管理Fault的位置的地址
0xE000ED38
RW特权级
SCB->BFAR
不可知
总线Fault地址寄存器:包括产生总线Fault的位置的地址
bit31 bit16
bit15 bit8
bit7 bit0
用法Fault状态寄存器(UFSR)
总线Fault状态寄存器(BFSR)
存储器管理Fault状态寄存器(MMFSR)
位
名称
描述
[7]
MMARVALID
存储器管理Fault地址寄存器(MMAR)有效标志:
0:MMAR中的值不是一个有效Fault地址
1:MMAR中保留一个有效Fault地址。
如果发生了一个存储器管理Fault,并由于优先级的原因升级成一个硬Fault,那么硬Fault处理程序必须将该位设为0。
[6:5]
-
保留
[4]
MSTKERR
进入异常时的入栈操作引起的存储器管理Fault:
0:无入栈Fault
1:进入异常时的入栈操作引起了一个或一个以上的访问违犯。
当该位设为1时,依然要对SP进行调节,并且堆栈的上下文区域的值可能不正确。处理器没有向MMAR中写入Fault地址。
[3]
MUNSTKERR
异常返回时的出栈操作引起的存储器管理Fault:
0:无出栈Fault
1:异常返回时的出栈操作已引起一个或一个以上的访问违犯.
该Fault与处理程序相连,这意味着当该位为1时,原始的返回堆栈仍然存在。
处理器不能对返回失败的SP进行调节,并且不会执行新的存储操作。处理器没有向MMAR中写入Fault地址。
[2]
-
保留
[1]
DACCVIOL
数据访问违犯标志:
0:无数据访问违犯Fault
1:处理器试图在不允许执行操作的位置上进行加载和存储。
当该位为1时,异常返回的压入堆栈的PC值指向出错指令。处理器已在MMAR中加载了目标访问的地址。
[0]
IACCVIOL
指令访问违犯标志:
0:无指令访问违犯错误
1:处理器试图从不允许执行操作的位置上进行指令获取。
即使MPU被禁能,这一故障也会在XN(CM3内核的0xE0000000~0xFFFFFFFF区域)区寻址时发生。
当该位为1时,异常返回的压入堆栈的PC值指向出错指令。处理器没有向MMAR中写入故障地址。
位
名称
描述
[7]
BFARVALID
总线Fault地址寄存器(BFAR)有效标志:
0:BFAR中的值不是有效故障地址
1:BFAR中保留一个有效故障地址。
在地址已知的总线故障发生后处理器将该位设为1。该位可以被其他Fault清零,例如之后发生的存储器管理Fault。
如果发生总线Fault,并由于优先级原因升级为一个硬Fault,那么硬Fault处理程序必须将该位设为0。
[6:5]
-
保留
[4]
STKERR
进入异常时的入栈操作引起的总线Fault:
0:无入栈故障
1:进入异常时的入栈操作已引起一个或一个以上的总线故障。
当处理器将该位设为1时,依然要对SP进行调节,并且堆栈的上下文区域的值可能不正确。处理器没有向BFAR中写入Fault地址。
[3]
UNSTKERR
异常返回时的出栈操作引起的总线Fault:
0:无出栈Fault
1:异常返回时的出栈操作已引起一个或一个以上的总线Fault。
该Fault与处理程序相连, 这意味着当处理器将该位设为1时,原始的返回堆栈仍然存在。处理器不能对返回失败的SP进行调节,并且不会执行新的存储操作,也未向BFAR中写入Fault地址。
[2]
IMPRECISERR
非精确数据总线错误:
0:无非精确数据总线错误
1:已发生一个数据总线错误,但是堆栈帧中的返回地址与引起错误的指令无关。
当处理器将该位设为1时,不向BFAR中写入Fault地址。
这是一个异步Fault。因此,如果在当前进程的优先级高于总线Fault优先级时检测到该Fault,总线Fault被挂起并仅在处理器从所有更高优先级进程中返回时开始变为有效。如果在处理器进入非精确总线Fault的处理程序前发生一个精确Fault,那么处理程序同时对IMPRECISERR 和其中一个精确Fault状态位进行检测,判断它们是否置位为1。
[1]
PRECISERR
精确数据总线错误:
0:非精确数据总线错误
1:已发生一个数据总线错误,且异常返回的压入堆栈的PC值指向引起Fault的指令。
当处理器将该位设为1时,向BFAR中写入Fault地址。
[0]
IBUSERR
指令总线错误:
0:无指令总线错误
1:指令总线错误。
处理器检测到预取指令时的指令总线错误,但仅在其试图签发Fault指令时才将IBUSERR 标志设为1。
当处理器将该位设为1时,不向BFAR中写入Fault地址。
位
名称
描述
[15:10]
-
保留
[9]
DIVBYZERO
0:无除以零Fault或除以零捕获未使能
1:处理器已执行SDIV或UDIV指令(除以零)。
当处理器将该位设为1时,异常返回的压入堆栈的PC值指向执行除以零的指令。
注:通过将CCR中的DIV_0_TRP位设为1使能除以零捕获,默认是不使能的。
[8]
UNALIGNED
0:无非对齐访问Fault,或非对齐访问捕获未使能
1:处理器已进行了一次非对齐的存储器访问。
注:通过将CCR中的UNALIGN_TRP位设为1来使能非对齐访问捕获,默认是不使能的。非对齐的LDM、STM、LDRD和STRD指令总是出错,与UNALIGN_TRP的设置无关。
[7:4]
-
保留
[3]
NOCP
无协处理器用法Fault。处理器不支持协处理器指令:
0:试图访问一个协处理器未引起用法Fault
1:处理器已试图访问一个协处理器。
[2]
INVPC
EXC_RETURN的无效PC加载引起的无效PC加载用法Fault:
0:没有发生无效PC加载用法Fault
1:处理器已试图将EXC_RETURN非法载入PC,作为一个无效的上下文或一个无效的EXC_RETURN值。
当该位被设为1时,异常返回的压入堆栈的PC值指向尝试执行非法PC加载的指令。
[1]
INVSTATE
无效状态用法Fault:
0:未发生无效状态用法Fault
1:处理器已试图执行一个非法使用EPSR的指令。
当该位设为1时,异常返回的压入堆栈的PC值指向一个尝试非法使用EPSR的指令。
如果一个未定义的指令使用了EPSR,则该位不被置位为1。
[0]
UNDEFINSTR
未定义的指令用法Fault:
0:无未定义的指令用法Fault
1:处理器已试图执行一个未定义的指令。当该位设为1时,异常返回的压入堆栈的PC值指向未定义的指令。
未定义的指令是一条不能被处理器译码的指令。
位
名称
描述
[31]
DEBUGEVT
硬Fault因调试事件产生,保留供调试使用。对寄存器执行写操作时,必须向该位写入0;否则,该行为不可预知。
[30]
FORCED
指示硬Fault是否由上访产生,非硬Fault的处理程序无法执行时,会上访成硬Fault。
0:硬Fault不是因为非硬Fault上访产生的
1:硬Fault是通过非硬Fault上访产生的。
当该位设为1时,硬Fault处理程序必须读其他Fault状态寄存器以找出Fault原因。
[29:2]
-
保留
[1]
VECTTBL
指示一个在异常处理过程中读向量表而引起的总线Fault:
0:读向量表未引起总线Fault
1:读向量表引起了总线Fault。
这一错误通常情况下都由硬Fault处理程序来处理。
[0]
-
保留
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |