SylixOS 中断底半部
内核在处理中断请求时,要求在单位时间内可以处理尽可能多的中断,也就是系统要求处理中断的吞吐率要竟可能的大。但是大多数的中断处理程序是很复杂的,很难再短时间内处理完毕。
为了提高系统的响应能力和并发能力,SylixOS 将中断处理分为两个阶段:
顶半部
和底半部
。
- 顶半部:一般进行一些紧急的硬件操作,包括读取寄存器中的中断状态,清除中断标志,将底半部处理程序挂到底半部的执行队列中。
- 底半部:这部分主要完成大部分的耗时操作,并且可以被新的中断打断 (SylixOS 实现底半部的机制是工作队列)。
以 GPIO 中断中使用工作队列为例:
* 在 GpioInit 函数中:
{
//获取 KEY_NUM 对应的 GPIO
API_GpioRequestOne(KEY_NUM, LW_GPIOF_IN, "KEY");
//配置引脚为中断模式,并申请一个中断号
_G_iIrqNum = API_GpioSetupIrq(KEY_NUM, LW_FALSE, 0);
//安装对应中断号的中断处理函数
API_InterVectorConnect((ULONG)_G_iIrqNum, (PINT_SVR_ROUTINE)&GpioIsr,
(PVOID)KEY_NUM, "GpioIsr");
//使能中断
API_InterVectorEnable(_G_iIrqNum);
}
* 在 GpioIsr 函数中:
{
API_GpioClearIrq(iGpioNum);
API_WorkQueueInsert(..__workHandler...);
}