转自:http://blog.yam.com/wttmama/article/33770221
接下來要說的是 Events......
粗略的 Event 可分為
Signal Event
Wait Event
Timer Event ( 這個又被包含在 Signal Event中 )
嚴格說來,我對這東東不大熟…真的…所以只能從 EDK 的 CODE 做說明了。
CoreCreateEvent (
IN UINT32 Type,
IN EFI_TPL NotifyTpl,
IN EFI_EVENT_NOTIFY NotifyFunction,
IN VOID *NotifyContext,
OUT EFI_EVENT *Event
)
CreateEvent 需要幾個參考。
1. Type ,它是屬於什麼種 Event ( Signal , Wait , Timer.. )
2. Tpl , Task Priority Level , 決定優先權 。
3. NotifyFunction , 要執行 的 function
4. NotifyContext , 目前我的理解是要給 wait event 使用。
5. Event , Create 成功的 Event 就是放在這裡傳出去。
最後的 Event 會有這樣的結構
CreateEvent 建立一個 Event 。並依自己所規劃的進行 Trigger 。
最簡單的就是 Signal Event 。
最重要的無非是 Type
它有分 Wait , Signal , Timer 。
1. Signal Type
在 CreateEvent 內部演算法中,如果你的 Event Type 是 Signal ,那會被放入一個 gEventSignalQueue中( 透過 SignalLink 串的 )。最後回傳一個 Event 給你。
當你想 Trigger 一個 Event 時,使用 SignalEvent ( Event ) ,即可。
而 Event 在 SignalEvent 內部中,則會透過 NotifyLink 將 Event 串到 gEventQueu。
意思就是,它不會馬上被執行,而是排到 queue 中。
2. Wait Type
此種 Type 最後的 owner 則是使用者自己,自己必須安排何時使用這個 Event
而傳入的參數,大多也需要 Context 。
而對 Wait Event 進行檢查,則是使用 CheckEvent( Event ) , 一般來說,這種 Type 的 Event ,
它傳入的 Function 會對 Context 進行檢查。
若成功了,它內部會 SignalEvent ,它利用了 SignalEvent 裡的 SignalCount 做進階使用。
CheckEvent 若做完 Function 的查檢後,若沒成功,則會回傳 NotReady 。
3. Timer Event
這種 Type 的 Event 最後的 owner 也是使用者自己
再使用 SetTimer 進行設定。
目前知道的 Timer Event 的 Type 也是可以加上 Signal 的。但這通常會加上 Signal Function 。
不然,就純綷是在 SetTimer(Event)後透過 CheckEvent 檢查ok了沒( 也是利用 SignalCount? )。
其實,Timer Event 我也是邊打邊懂的~哈哈。
最後最後,再補充一點
有一個 Service 也是利用 Event 在做事的。就是 RegisterProtocolNotify()
它會建立一個 Signal Event 並將它與 Protocol Entry 進行關聯。
結構會變成這樣
在實例上
KeyBoard Event 就是屬於 Wait Event ,而且是透過 WaitForEvent 來做
會和 Time Event 搭配使用。
一次學兩個。