鸿蒙轻内核M核源码解析系列十八 Fault异常处理
发布时间:2021-10-19 16:57:05 所属栏目:系统 来源:互联网
导读:Fault Type异常类型 如下图中的Fault类型表格所示,Fault表示各种故障,Handler表示故障处理机制,Bit Name标记故障的寄存器的Bit位,Fault status register故障状态寄存器。该图摘自《Cortex-M7 Devices Generic User Guide》。 Vector table向量表 向量表
Fault Type异常类型
如下图中的Fault类型表格所示,Fault表示各种故障,Handler表示故障处理机制,Bit Name标记故障的寄存器的Bit位,Fault status register故障状态寄存器。该图摘自《Cortex™-M7 Devices Generic User Guide》。
Vector table向量表
向量表包含栈指针的复位值和开始地址,也叫异常向量。异常可以看作特殊的中断,异常编号Exception number, 中断请求号IRQ number,偏移值offset,向量Vector的对应关系如下图所示,本文主要关注NMI、HardFault、Memory management fault、Bus fault、Usage fault、SVCall等异常。
鸿蒙轻内核M核源码分析系列十八 Fault异常处理-鸿蒙HarmonyOS技术社区鸿蒙轻内核M核源码分析系列十八 Fault异常处理-鸿蒙HarmonyOS技术社区
在中断初始化时,会初始化该异常向量表,代码位置kernelarcharmcortex-m7gcclos_interrupt.c。⑴处的HalExcNMI,⑵处的HalExcHardFault,⑶处的HalExcMemFault,⑷处的HalExcBusFault,⑸处的HalExcUsageFault,⑹处的HalExcSvcCall这些中断异常处理函数定义在kernelarcharmcortex-m7gcclos_exc.S。本文我们主要分析这些汇编函数的代码。
⑺处开始的这两行代码也比较重要,通过更改系统处理控制与状态寄存器(System Handler Control and State Register)的bit位来使能相应的异常,通过更改配置与控制寄存器(Configuration and Control Register)的bit位来使能除零异常。
LITE_OS_SEC_TEXT_INIT VOID HalHwiInit(VOID)
{
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
UINT32 index;
g_hwiForm[0] = 0; /* [0] Top of Stack */
g_hwiForm[1] = Reset_Handler; /* [1] reset */
for (index = 2; index < OS_VECTOR_CNT; index++) { /* 2: The starting position of the interrupt */
g_hwiForm[index] = (HWI_PROC_FUNC)HalHwiDefaultHandler;
}
/* Exception handler register */
⑴ g_hwiForm[NonMaskableInt_IRQn + OS_SYS_VECTOR_CNT] = HalExcNMI;
⑵ g_hwiForm[HARDFAULT_IRQN + OS_SYS_VECTOR_CNT] = HalExcHardFault;
⑶ g_hwiForm[MemoryManagement_IRQn + OS_SYS_VECTOR_CNT] = HalExcMemFault;
⑷ g_hwiForm[BusFault_IRQn + OS_SYS_VECTOR_CNT] = HalExcBusFault;
⑸ g_hwiForm[UsageFault_IRQn + OS_SYS_VECTOR_CNT] = HalExcUsageFault;
⑹ g_hwiForm[SVCall_IRQn + OS_SYS_VECTOR_CNT] = HalExcSvcCall;
g_hwiForm[PendSV_IRQn + OS_SYS_VECTOR_CNT] = HalPendSV;
g_hwiForm[SysTick_IRQn + OS_SYS_VECTOR_CNT] = SysTick_Handler;
/* Interrupt vector table location */
SCB->VTOR = (UINT32)(UINTPTR)g_hwiForm;
#endif
#if (__CORTEX_M >= 0x03U) /* only for Cortex-M3 and above */
NVIC_SetPriorityGrouping(OS_NVIC_AIRCR_PRIGROUP);
#endif
/* Enable USGFAULT, BUSFAULT, MEMFAULT */
⑺ *(volatile UINT32 *)OS_NVIC_SHCSR |= (USGFAULT | BUSFAULT | MEMFAULT);
/* Enable DIV 0 and unaligned exception */
*(volatile UINT32 *)OS_NVIC_CCR |= DIV0FAULT;
return;
}
(编辑:焦作站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |