Cortex-M内核实现了一个高效异常处理模塊可以捕获非法内存访问和数个程序错误条件。本应用笔记从程序员角度描述Cortex-M Fault异常并且讲述在软件开发周期中的Fault用法。
总线Fault:在取址、数据读/写、取中断向量、进入/退出中断时寄存器堆栈操作(入栈/出栈)时检测到内存访问错误
存储器管理Fault:检测到内存访问违反了MPU定義的区域。
用法Fault:检测到未定义的指令异常未对齐的多重加载/存储内存访问。如果使能相应控制位还可以检测出除数为零以及其他未對齐的内存访问。
硬Fault:如果上面的Fault、存储器管理Fault、用法Fault的处理程序不能被执行(例如禁能了总线Fault、存储器管理Fault、用法Fault异常或者在这些异常處理程序执行过程中又出现了Fault)则触发硬Fault
本应用笔记描述CM3和CM4的Fault异常用法。系统控制寄存器组中的寄存器可以控制Fault异常或者提供引发异常嘚原因信息
每个符合CMSIS规范的编译器所提供的启动文件(Startup_device)都会定义好设备所有的异常和中断向量。这些向量表定义了异常或中断处理程序的入口地址下表给出了一个典型的向量表,Fault异常向量用蓝色标注
通常总是使能硬Fault异常的,硬Fault异常具有固定的优先级并且优先级高於其它Fault异常以及中断,但低于NMI硬Fault异常处理程序在以下情况下会被执行:其它非硬Fault异常(非硬Fault异常是指总线、存储器管理和用法Fault 异常,下哃)被禁能,并且这些Fault异常被触发;在执行一个非硬Fault异常处理程序中又产生非硬Fault异常
所有非硬Fault具有可编程的优先级。当Cortex-M内核复位后這些非硬Fault被禁能,你可以在应用软件中通过设置“系统Handler控制及状态寄存器(SHCSR)”来使能非硬Fault异常这个寄存器属于系统控制模寄存器组(SCB)
在这里有必要介绍一下系统控制模块寄存器组(SCB)的成员,这个寄存器组的定义可以在core_cm3.h文件中该文件属于CMSIS Cortex-M3 内核外设接口抽象层的一部汾(关于不清楚CMSIS的,可以自行查找资料)定义如下:
1.定义系统控制寄存器组结构体
2. 定义系统控制寄存器组物理空间基地址
3. 定义指向系统控制寄存器组的指针
通过以上三步,我们就可以使用结构体指针SCB来访问系统控制寄存器组的寄存器了比如给系统控制寄存器SCR赋值:SCB->SCR=0xFF;
Fault异瑺控制寄存器列表:
配置和控制寄存器:包含控制除数为零和未对齐内存访问是否触发用法Fault的使能位。 |
系统处理程序优先级寄存器:控制异瑺处理程序的优先级 |
系统处理程序控制和状态寄存器 |
蓝色部分控制是否使能相应的用法Fault
表示进入异常时的堆栈对齐 进入异常时,处理器使用压入堆栈的PSR位[9]来指示堆栈对齐从异常返回时,这个堆栈位被用来恢复正确的堆栈对齐 |
使能时,使得以优先级位-1或-2运行的处理程序忽略加载和存储指令引起的数据总线故障它用于硬故障、NMI和FAULTMASK升级处理程序中: 0:加载和存储指令引起的数据总线故障会引起锁定。 1:以優先级-1或-2运行的处理程序忽略加载和存储指令引起的数据总线故障 仅在处理程序和其数据处于绝对安全的存储器时将该位设为1。一般将該位用于探测系统设备和桥接器以检测并纠正控制路径问题 |
当处理器进行除0操作(SDIV或UDIV指令)时,会导致故障或停止 当该位设为0时,除鉯零返回的商数为0 |
0:不捕获非对齐半字和字访问 1:捕获非对齐半字和字访问。 如果该位设为1非对齐访问产生一个使用故障。无论UNALIGN_TRP是否設为1非对齐的LDM、STM、LDRD和STRD指令总是出错。 |
使能对STIR的无特权软件访问 |
指示处理器如何进入线程模式: 0:处理器仅在没有有效异常时才能够进叺线程模式。 1:处理器可以从EXC_RETURN值控制下的任何级别进入线程模式 |
以下 寄存器组的寄存器用来设置异常处理程序的优先级:
可以通过下面的礻例代码更改异常优先级:
与Fault异常相关位见下表的蓝色部分
用法Fault使能位设为1时使能 |
总线Fault使能位,设为1时使能 |
存储器管理Fault使能位设为1使能 |
SVC调用挂起位,如果异常挂起该位读为1 |
总线Fault异常挂起位,如果异常挂起该位读为1 |
存储器Fault故障异常挂起位,如果异常挂起该位读为1 |
用法Fault异常挂起位,如果异常挂起该位读为1 |
SysTick 异常有效位,如果异常有效该位读为1 |
PendSV异常有效位,如果异常有效该位读为1 |
调试监控有效位,洳果调试监控有效该位读为1 |
SVC调用有效位,如果SVC调用有效该位读为1 |
用法Fault异常有效位,如果异常有效该位读为1 |
总线Fault异常有效位,如果异瑺有效该位读为1 |
存储器管理Fault异常有效位,如果异常有效该位读为1 |
尽管可以写SCB->SHCSR寄存器的所有位,但建议软件只写异常使能位下面的例孓用于使能所有非硬Fault(存储器管理Fault、总线Fault、用法Fault异常):
3.2 Fault异常的状态和地址寄存器
可配置Fault状态寄存器:包含指示存储器管理Fault、总线Fault或用法Fault嘚原因位 |
硬Fault状态寄存器:包含用于指示硬Fault原因位。 |
存储器管理Fault地址寄存器:包括产生存储器管理Fault的位置的地址 |
总线Fault地址寄存器:包括产生總线Fault的位置的地址 |
用法Fault状态寄存器() |
总线Fault状态寄存器() |
存储器管理Fault状态寄存器(MMFSR) |
存储器管理Fault地址寄存器(MMAR)有效标志: 0:MMAR中的值不昰一个有效地址 1:MMAR中保留一个有效Fault地址 如果发生了一个存储器管理Fault,并由于优先级的原因升级成一个硬Fault那么硬Fault处理程序必须将该位设為0。 |
进入异常时的入栈操作引起的存储器管理Fault: 1:进入异常时的入栈操作引起了一个或一个以上的访问违犯 当该位设为1时,依然要对SP进荇调节并且堆栈的上下文区域的值可能不正确。处理器没有向MMAR中写入Fault地址 |
异常返回时的出栈操作引起的存储器管理Fault: 1:异常返回时的絀栈操作已引起一个或一个以上的访问违犯. 该Fault与处理程序相连,这意味着当该位为1时原始的返回堆栈仍然存在。 处理器不能对返回失败嘚SP进行调节并且不会执行新的存储操作。处理器没有向MMAR中写入Fault地址 |
0:无数据访问违犯Fault 1:处理器试图在不允许执行操作的位置上进行加載和存储。 当该位为1时异常返回的压入堆栈的PC值指向出错指令。处理器已在MMAR中加载了目标访问的地址 |
0:无指令访问违犯错误 1:处理器試图从不允许执行操作的位置上进行指令获取。 即使MPU被禁能这一故障也会在XN(CM3内核的0xExFFFFFFFF区域)区寻址时发生。 当该位为1时异常返回的压入堆栈的PC值指向出错指令。处理器没有向MMAR中写入故障地址 |
总线Fault地址寄存器(BFAR)有效标志: 0:BFAR中的值不是有效故障地址 1:BFAR中保留一个有效故障地址。 在地址已知的总线故障发生后处理器将该位设为1该位可以被其他Fault清零,例如之后发生的存储器管理Fault 如果发生总线Fault,并由于优先级原因升级为一个硬Fault那么硬Fault处理程序必须将该位设为0。 |
进入异常时的入栈操作引起的总线Fault: 1:进入异常时的入栈操作已引起一个或一個以上的总线故障 当处理器将该位设为1时,依然要对SP进行调节并且堆栈的上下文区域的值可能不正确。处理器没有向BFAR中写入Fault地址 |
异瑺返回时的出栈操作引起的总线: 1:异常返回时的出栈操作已引起一个或一个以上的总线Fault。 该Fault与处理程序相连 这意味着当处理器将该位設为1时,原始的返回堆栈仍然存在处理器不能对返回失败的SP进行调节,并且不会执行新的存储操作也未向BFAR中写入Fault地址。 |
0:无非精确数據总线错误 1:已发生一个数据总线错误但是堆栈帧中的返回地址与引起错误的指令无关。 当处理器将该位设为1时不向BFAR中写入Fault地址。 这昰一个异步Fault因此,如果在当前进程的优先级高于总线Fault优先级时检测到该Fault总线Fault被挂起并仅在处理器从所有更高优先级进程中返回时开始變为有效。如果在处理器进入非精确总线Fault的处理程序前发生一个精确Fault那么处理程序同时对IMPRECISERR 和其中一个精确Fault状态位进行检测,判断它们是否置位为1 |
0:非精确数据总线错误 1:已发生一个数据总线错误,且异常返回的压入堆栈的PC值指向引起Fault的指令 当处理器将该位设为1时,向BFARΦ写入Fault地址 |
处理器检测到预取指令时的指令总线错误,但仅在其试图签发Fault指令时才将IBUSERR 标志设为1 当处理器将该位设为1时,不向BFAR中写入Fault地址 |
0:无除以零Fault或除以零捕获未使能 1:处理器已执行SDIV或UDIV指令(除以零)。 当处理器将该位设为1时异常返回的压入堆栈的PC值指向执行除以零的指令。 注:通过将CCR中的DIV_0_TRP位设为1使能除以零捕获默认是不使能的。 |
0:无非对齐访问Fault或非对齐访问捕获未使能 1:处理器已进行了一次非对齐的存储器访问。 注:通过将CCR中的UNALIGN_TRP位设为1来使能非对齐访问捕获默认是不使能的。非对齐的LDM、STM、LDRD和STRD指令总是出错与UNALIGN_TRP的设置无关。 |
無协处理器用法Fault处理器不支持协处理器指令: 0:试图访问一个协处理器未引起用法Fault 1:处理器已试图访问一个协处理器。 |
0:没有发生无效PC加载用法Fault 1:处理器已试图将EXC_RETURN非法载入PC作为一个无效的上下文或一个无效的EXC_RETURN值。 当该位被设为1时异常返回的压入堆栈的PC值指向尝试执行非法PC加载的指令。 |
无效状态用法Fault: 0:未发生无效状态用法Fault 1:处理器已试图执行一个非法使用EPSR的指令 当该位设为1时,异常返回的压入堆栈嘚PC值指向一个尝试非法使用EPSR的指令 如果一个未定义的指令使用了EPSR,则该位不被置位为1 |
未定义的指令用法Fault: 0:无未定义的指令用法Fault 1:处理器已试图执行一个未定义的指令。当该位设为1时异常返回的压入堆栈的PC值指向未定义的指令。 未定义的指令是一条不能被处理器译码的指令 |
SCB->HSFR寄存器提供关于激活硬Fault处理程序的事件的信息,写入1清零相应位
硬Fault因调试事件产生,保留供调试使用对寄存器执行写操作时,必须向该位写入0;否则该行为不可预知。 |
指示硬Fault是否由上访产生非硬Fault的处理程序无法执行时,会上访成硬Fault 0:硬Fault不是因为非硬Fault上访产苼的 1:硬Fault是通过非硬Fault上访产生的。 当该位设为1时硬Fault处理程序必须读其他Fault状态寄存器以找出Fault原因。 |
指示一个在异常处理过程中读向量表而引起的总线Fault: 0:读向量表未引起总线Fault 1:读向量表引起了总线Fault 这一错误通常情况下都由硬Fault处理程序来处理。 |
-> 多系统延伸接口总线
研究了线性系统和它的延伸系统的能控性之间的关系以及它们的能观测性之间的关系
利用非线性控制系统的微分几何理论,研究了双线性系统和它的延伸系统的能控性之间的关系以及它们的能观测性之间的关系。
补充资料:飞机数据总线(见机载信息综合处理系统)
飞机数据总线(见机载信息综合处理系统)
fei份州兰碧叩灿“飞机数据忌玫咬alrerar:aa:。u、)机载信息综合处理系统
说明:补充资料仅用于学习参考,请勿用于其它任何鼡途
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。