UEFI原理与编程实践--事件的实际使用

看代码有一种现象,叫排斥性,就是我看一些新的代码,看个大概,感觉懂了,又感觉没懂,想动手实践呢又懒得去动,于是似懂非懂的搁置在那了

 在UEFI原理与编程的第6章中,主要讲到了有关事件的知识,那么什么是事件呢?

UEFI不支持中断,而是用事件代替,既然是代替,那是不是和中断的作用效果一样呢?

这个事件就跟水库泄洪原理一样,水位超过某个水位了,那么就必须泄洪,也就是说达到某个条件了,哎,这个事件就要run了。

创建事件

创建事件有两种方法,第一种:CreateEvent,第二种:CreateEventEx,第一种呢创建的是单个事件,第二种呢就是批量。

现在,一步一步来,看一下CreateEvent的原型:

 这是啥呀?这就是定义了一个函数指针嘛。。。

看里面的参数,咱们一个一个来,首先事件类型,记住下面的就足够了 

第二个事件Notification优先级,同样一边看看,一边学习使用,特别是函数这一栏

扫描二维码关注公众号,回复: 13455339 查看本文章

 

 第三个事件Notification函数

 第四个传给事件Notification函数的参数

那第五个呢?当然就是你定义的事件啦,代码开写(书上的)

VOID 
myEventNotify(
     IN EFI_EVENT Event,
	 IN VOID *Context
	 )
{
     static UINTN times = 0;
	 DEBUG ((EFI_D_INFO, "myEventNotify Wait: %d\n",times));
	 times++;
	 if(times>5)
		 gBS->SignalEvent(Event);

}

EFI_STATUS
TestNotify()
{
   EFI_STATUS Status;
   UINTN index=0;
   EFI_EVENT myEvent;
   Status = gBS->CreateEvent(
	                    EVT_NOTIFY_WAIT,//普通事件,通过WaitForEvent等待,放入到执行队列
						TPL_NOTIFY,//优先级为16,大多数都为这个优先级
						myEventNotify,//这个就是notification函数
						NULL,//没有参数传递,直接写NULL
						&myEvent
	             );
   Status = gBS->WaitForEvent(
	                      1,
						  &myEvent,
						  &index
						  );
    return EFI_SUCCESS;
}

WaitForEvent用于等待事件的发生,是阻塞操作,直到Event数组内仁义事件被触发或者出错,WaitForEvent才返回。WaitForEvent服务有三个参数:第一个Event数组内Event的个数,第二个Event数组,第三个返回处于触发态的事件在数组内的下标。上述程序就是不断的去监控这个事件,监控一次,累加一次,现在知道为啥times要设置成静态的了,因为累加的过程中不再去进行初始化啦,所以,每检查一次myEvent的状态,myEventNotify就执行一次,检查6次后,myEvent被触发,从而WaitForEvent结束等待。

CreateEventEx服务用于生成事件并将事件加入事件组,相比较CreateEvent的函数原型,就是多了一个事件组:IN CONST EFI_GUID *EventGroup OPTIONAL,也就是当EventGroup中的任意事件被触发后,组中的其它事件都会被触发,进而同组内所有的Notification函数都将被加入到执行队列,同组内优先级高的先被执行。如果这个EventGroup为NULL,那么和CreateEvent函数没什么区别,基本上代码也就用到了下面的4个Event组:

猜你喜欢

转载自blog.csdn.net/u011397314/article/details/121536202
今日推荐