中断服务函数流程
中断服务函数流程
以 ARM 体系为例,当 ARM CPU 检测到中断时,会自动将 PC 指针指向中断入口。SylixOS 的中断入口定义为 archIntEntry,由汇编语言编写,位于“libsylixos/SylixOS/arch/arm/common/armExcAsm.S”文件内,无论是哪一个中断向量产生中断,都会先进入 archIntEntry 函数。archIntEntry 函数经过一系列的函数调用,最终将会找到该中断向量对应的中断服务函数并执行,其调用流程如下图所示。
中断服务函数流程分析如下:
- archIntEntry 函数:在执行某一中断向量的中断服务函数之前,需要进行一些准备工作,例如上下文的保存、中断嵌套的判断等,执行完某一中断向量的中断服务函数之后,还需要进行上下文的恢复等操作。
- bspIntHandle 函数:该函数是底层中断入口函数,它通过读取硬件寄存器来获得中断向量号。
- archIntHandle 函数:对中断向量合法性进行判断,并判断是否需要开启中断抢占。
- API_InterVectorIsr 函数:向量中断总服务函数,根据中断号得到对应的中断服务函数链表,找到具体中断服务函数。
向量中断总服务函数
API_InterVectorIsr 函数的定义如下所示:
#include <SylixOS>
irqreturn_t API_InterVectorIsr (ULONG ulVector);
函数 API_InterVectorIsr 原型分析:
- 函数返回中断返回值。
- 参数 ulVector 是中断向量号。
API_InterVectorIsr 函数的大体流程(不考虑多核的情况)如下图所示。
中断服务函数返回值
API_InterVectorIsr 函数在遍历中断服务函数链表时,会根据中断服务函数的返回值判断是否需要结束遍历,中断服务函数的返回值有三种选项,如下表所示。
表 中断服务函数返回值选项
宏名 | 含义 |
---|---|
LW_IRQ_NONE | 不是本中断服务函数产生的中断,继续遍历 |
LW_IRQ_HANDLED | 是本中断服务函数产生的中断,结束遍历 |
LW_IRQ_HANDLED_DISV | 中断处理结束,并屏蔽本次中断 |