中断服务函数流程

更新时间:
2024-03-14
下载文档

中断服务函数流程

中断服务函数流程

以 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中断处理结束,并屏蔽本次中断
文档内容是否对您有所帮助?
有帮助
没帮助