07_Events

来源:互联网 发布:什么是java工厂模式 编辑:程序博客网 时间:2024/06/05 02:12

转自: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 搭配使用。

一次學兩個。
原创粉丝点击