跳至内容

Step to UEFI (37) ----- SetTimer 设定定时器(上)

众所周知:UEFI中没有中断(UEFI唯一一个中断int 0,timer )【参考1】,如果想实现一个定时器的功能,必须使用 Event。

实现的思路是:

1. CreateEvent 创建 Timer Event
2. SetTimer 设定 Periodic 触发
3. SetTimer 关闭定时器
4. CloseEvent 销毁 Timer Event

首先研究 CreateEvent ,这个函数是Boot Service中提供的【参考3】

settimer1

第一个参数给出创建的类型,我们要选择EVT_TIMER;第二个参数是优先级,对我们来说影响不大;第三个参数给出当Event发生时对应的处理函数;第四个参数我的理解是自定义的数据;第五个参数是创建出来的Event。

接下来再看看SetTimer函数,同样也是 Boot Service 中提供的服务

settimer2

第一个参数是你创建的Event;然后是Timer的类型,比如:周期性触发;最后是设定Timer的时间,多久触发一次,单位是100ns。

CloseEvent就很简单了

settimer3

程序还参考了 ShellPkg\Library\UefiShellNetwork1CommandsLib\Ping.c 的代码。

最终代码如下

#include  <Uefi.h>
#include  <Library/UefiLib.h>
#include  <Library/ShellCEntryLib.h>

#include  <stdio.h>
#include  <stdlib.h>
#include  <wchar.h>

#include <Protocol/EfiShell.h>
#include <Library/ShellLib.h>

#include <Protocol/SimpleFileSystem.h>
#include <Protocol/BlockIo.h>
#include <Library/DevicePathLib.h>
#include <Library/HandleParsingLib.h>
#include <Library/SortLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>

extern EFI_BOOT_SERVICES         *gBS;
extern EFI_SYSTEM_TABLE			 *gST;
extern EFI_RUNTIME_SERVICES 	 *gRT;

extern EFI_SHELL_ENVIRONMENT2    *mEfiShellEnvironment2;
extern EFI_HANDLE				 gImageHandle;

STATIC CONST UINTN SecondsToNanoSeconds = 10000000;

UINTN	Counter = 0;
/**
  The callback function for the timer event used to get map.

  @param[in] Event    The event this function is registered to.
  @param[in] Context  The context registered to the event.
**/
VOID
EFIAPI
Timeout (
  IN EFI_EVENT      Event,
  IN VOID           *Context
  )
{
  Print(L"www.lab-z.com [%d]\r\n",++ Counter);
  return ;
}

int
EFIAPI
main (                                         
  IN int Argc,
  IN char **Argv
  )
{
  EFI_STATUS                Status;
  EFI_HANDLE                TimerOne = NULL;
  BOOLEAN					ExitMark=FALSE;
  
  Status  = gBS->CreateEvent (
                    EVT_NOTIFY_SIGNAL | EVT_TIMER,
                    TPL_CALLBACK,
                    Timeout,
                    NULL,
                    &TimerOne
                    );
    
    if (EFI_ERROR (Status)) {
        Print(L"Create Event Error! \r\n");
		return ;
    }

    Status = gBS->SetTimer (
                   TimerOne,
                   TimerPeriodic,
                   MultU64x32 (SecondsToNanoSeconds, 1)
                   );
    
    if (EFI_ERROR (Status)) {
        Print(L"Set Timer Error! \r\n");
		return ;
    }

	while (!ExitMark)
	{
		if (mEfiShellEnvironment2 -> GetExecutionBreak()) {ExitMark=TRUE;}
	}
    gBS->SetTimer (TimerOne, TimerCancel, 0);
    gBS->CloseEvent (TimerOne);	

  return EFI_SUCCESS;
}

 

运行结果如下
TimerTest

完整代码下载
TimerTest

后记:这部分对我来说还是比较复杂,在描述上定义概念可能会有偏差,如果阅读中发现,欢迎通知我及时改正。

参考:

1. http://blog.csdn.net/celiaqianhj/article/details/7180783 UEFI Events
2. http://biosren.com/viewthread.php?tid=2095&highlight=%B6%A8%CA%B1 什么是EFI Events?
3. UEFI Spec 2.4 P118

发布于 分类 Other标签 EDK2、 Shell、 Timer、 UEFI、 vs2008、 控制台

近期文章

公众号

最近开通了本网站的公众号,有兴趣的朋友可以订阅一下。主要作用是为了某一天本网站由于某种原因失联,可以通过公众号再次取得联系。发送频率在1-2次/月左右。 目前使用的是”辰迅云”,已经续费到2025年。 weixin
  • 2024年5月22日,编写工具扫描所有标题URL带有中文的文章,然后手工修改URL保证没有中文。
  • 2024年5月04日,上线一个常用软件下载页面,可以在右侧“在线工具”访问到。需要注意的是因为服务器防攻击设定,直接点击链接无法下载,需要通过拷贝链接之后粘贴到浏览器新的页面下载。
  • 2024年3月26日,实验使用 WinDBG 调试 ACPI BIOS Error 的问题,结果是失败。无法使用WinDBG 明确找到出现问题的 ASL 位置
  • 2024年2月8日,整理了《Step to UEFI》的文章索引,去年写的关于 UEFI 的文章并不多。
  • 2024年2月2日,服务器切换完毕,现在是香港服务器,感觉速度还可以。
  • 2024年1月15日 空间就要到期了,正在计划更换服务商。 Godaddy 越来越不稳定。
  • 2024年1月2日 去掉了谷歌广告,挂了很多年还没有达到50刀,索性去掉了。
在线工具:
常用测试工具下载
在线EDID分析工具
ASCII 十六进制查询工具
USB 按键查询表
在线移除代码注释工具
在线代码格式化工具
在线图片放大工具
一些IBV BIOS工具
在线STP查看工具
在线音频视频广播
在线音频测试,支持左右声道调节

归档

WWW.LAB-Z.COM 自豪地采用WordPress

玻璃钢生产厂家铜仁公园玻璃钢雕塑厂家报价云南玻璃钢雕塑设计甘南玻璃钢植物雕塑设计铜陵商场大型美陈安徽多彩玻璃钢雕塑销售厂家公园玻璃钢雕塑定做山东玻璃钢雕塑系银川玻璃钢雕塑售价福建装饰商场美陈报价马鞍山玻璃钢雕塑公司玻璃钢卡通猴子雕塑出口玻璃钢彩绘雕塑玻璃钢雕塑在广联达哪里玻璃钢巧虎雕塑淄博广场玻璃钢雕塑安装黑龙江景观玻璃钢雕塑价位嘉兴佛像玻璃钢雕塑正宗玻璃钢雕塑厂家报价衢州景观玻璃钢雕塑哪家便宜北京常见商场美陈市场价万源玻璃钢雕塑设计图仿古玻璃钢卡通雕塑包头玻璃钢长颈鹿雕塑天津玻璃钢雕雕塑玻璃钢雕塑厂湖南商丘景观标识玻璃钢人物雕塑内蒙古玻璃钢雕塑公司江苏泡沫玻璃钢雕塑报价多少玻璃钢浮雕不锈钢动物雕塑厂定制玻璃钢大型户外动物雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化