- 源代码: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;