首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Cortex-M3和Cortex-M4 Fault异常应用(4)

Cortex-M3和Cortex-M4 Fault异常应用(4)

3.2.1.2 总线Fault状态寄存器BFSR:指示总线访问Fault原因


名称
描述
[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地址。

3.2.1.3 用法Fault状态寄存器UFSR:指示产生用法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值指向未定义的指令。
未定义的指令是一条不能被处理器译码的指令。
继承事业,薪火相传
返回列表