07_Events

news/2024/5/18 22:29:11 标签: events, signal, timer, function, keyboard, 算法

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

一次學兩個。

http://www.niftyadmin.cn/n/1516324.html

相关文章

每个程序员都应读的书

转自:http://blog.jobbole.com/5886/ 2008年8月4日,StackOverflow 网友Bert F 发帖提问:哪本最具影响力的书,是每个程序员都应该读的? “如果能时光倒流,回到过去,作为一个开发人员,…

Nginx担当WebSockets代理

Nginx担当WebSockets代理 尊重原创,原文链接 英文原文:http://nginx.com/blog/websocket-nginx/ WebSocket 协议提供了一种创建支持客户端和服务端实时双向通信Web应用程序的方法。作为HTML5规范的一部分,WebSockets简化了开发Web实时通信程…

兴趣链接

How browser work: http://taligarsiel.com/Projects/howbrowserswork1.htm 简明VIM 练级进阶: http://coolshell.cn/articles/5426.html 给程序员的VIM速查卡:http://coolshell.cn/articles/5479.html 编写VIM插件…

狗日的开源软件许可证

转自: http://coolshell.cn/articles/4657.html 陈皓 你知道这个世上有多少种开源软件的许可证吗?GPL,BSD,MIT,Apache?GNU上有个网页,上面记录了几乎所有的开源软件的许可证,真TMD…

websocket心跳的实现(包括全部代码)

尊重原创,原文链接 本文主要讲的是如果设计websocket心跳已经需要考虑哪些问题。 前言 在使用websocket的过程中,有时候会遇到客户端网络关闭的情况,而这时候在服务端并没有触发onclose事件。这样会: 多余的连接服务端会继续给客…

25个Vim教程、视频和资源

转自: http://blog.jobbole.com/10250/ 编注:程序员的那些事 12月14日在新浪微博发起的《你最常用哪些文本编辑器?》。根据目前的投票结果显示,Vim 以 43% 比例排第一。 在进行30天Vim特训过程中,我发现了数量众多的优…

python 爬虫架构_8个最高效的Python爬虫框架,你用过几个?

小编收集了一些较为高效的Python爬虫框架。分享给大家。1.ScrapyScrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。。用这个框架可以轻松爬下来如亚马逊商品信息之类的数…

WebSocket握手协议

尊重原创,原文链接 一、阅前热身 什么是keep-alive 1、keep-alive只是客户端的一种建议 我们打开百度首页,进一步查看header。如图,我们看到请求header中有一行: Connection:keep-alive keep-alive是通知服务器,在这个…