加入收藏 | 设为首页 | 会员中心 | 我要投稿 焦作站长网 (https://www.0391zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

鸿蒙轻内核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;
}

(编辑:焦作站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读