- 源代码:EDK2
- 版本:UDK2017
- UEFI源码分析第二篇,异步事件服务
- 第三部分,定时器
- 第一部分,事件驱动
- 第二部分,任务优先级
设置定时器EVT_TIMER
244 EFI_STATUS
245 EFIAPI
246 CoreSetTimer (
247 IN EFI_EVENT UserEvent,
248 IN EFI_TIMER_DELAY Type,
249 IN UINT64 TriggerTime
250 )
函数CoreSetTimer将定时器类型的事件设置好超时时间,也就是更新Event->Timer域
273 if (Event->Timer.Link.ForwardLink != NULL) {
274 RemoveEntryList (&Event->Timer.Link);
275 Event->Timer.Link.ForwardLink = NULL;
276 }
进一步调用CoreInsertEventTimer将定时器设置好。
281 if (Type != TimerCancel) {
282
283 if (Type == TimerPeriodic) {
284 if (TriggerTime == 0) {
285 gTimer->GetTimerPeriod (gTimer, &TriggerTime);
286 }
287 Event->Timer.Period = TriggerTime;
288 }
289
290 Event->Timer.TriggerTime = CoreCurrentSystemTime () + TriggerTime;
291 CoreInsertEventTimer (Event);
292
293 if (TriggerTime == 0) {
294 CoreSignalEvent (mEfiCheckTimerEvent);
295 }
296 }
函数CoreInsertEventTimer如下
40 VOID
41 CoreInsertEventTimer (
42 IN IEVENT *Event
43 )
44 {
54 TriggerTime = Event->Timer.TriggerTime;
59 for (Link = mEfiTimerList.ForwardLink; Link != &mEfiTimerList; Link = Link->ForwardLink) {
60 Event2 = CR (Link, IEVENT, Timer.Link, EVENT_SIGNATURE);
61
62 if (Event2->Timer.TriggerTime > TriggerTime) {
63 break;
64</

本文深入分析UEFI的DXE阶段中,关于定时器和时钟中断的实现。从设置定时器、时钟中断的初始化以及时钟中断的处理流程进行探讨,讲解如何利用事件驱动执行定时器回调,并详细阐述了时钟中断的初始化过程。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



