我看了很多文章,包括用的教材都是基础知识——时间中断——调度这个顺序
这给我造成了很多误解,因为看时钟中断看了很久,但完全不知道它和异步事件调度有什么联系,看到最后才恍然大悟,原来是这样。
虽然这种博客应该没什么人看,但恭喜你,不用奇怪这点了。
故事要从上篇提到的恢复(降低)优先级的RestoreTpl说起
这个函数前面都很正常,断言啊,判断啊,比较有意思的是这一段
while (gEventPending != 0)
{
PendingTpl = (UINTN) HighBitSet64 (gEventPending);
if (PendingTpl <= NewTpl) {
break;
}
gEfiCurrentTpl = PendingTpl;
if (gEfiCurrentTpl < TPL_HIGH_LEVEL) {
CoreSetInterruptState (TRUE);
}
CoreDispatchEventNotifies (gEfiCurrentTpl);
//执行gEventQueue [gEfiCurrentTpl]队列里所有event的Notification函数
}
之前提过,gEventPending是一个32位的二进制串,置1说明此位有事件已经被触发,等着你执行
那么这段就很好理解了
取出当前等待执行队列中优先级最高的,和准备恢复的优先级比较
如果比它小或者相同,退出函数
如果比它大,说明系统还有更要紧的事情,先执行高优先级的
这样,当一个事件恢复自己的优先级,系统里比它优先级高的事件全都执行了——至于这些事件什么时候触发,是的,在时钟中断里触发。
上一篇也说了,时间中断和waitforevent的优先级都是4。以时钟中断为例,时钟每10ms中断一次,每次中断先把自己的优先级拉到31,再调用RestoreTpl把自己的优先级降回4,每中断一次,事件就调度一次。
最后一篇讲时钟中断——应该还有一些维持的数据结构什么的。