看代码有一种现象,叫排斥性,就是我看一些新的代码,看个大概,感觉懂了,又感觉没懂,想动手实践呢又懒得去动,于是似懂非懂的搁置在那了
在UEFI原理与编程的第6章中,主要讲到了有关事件的知识,那么什么是事件呢?
UEFI不支持中断,而是用事件代替,既然是代替,那是不是和中断的作用效果一样呢?
这个事件就跟水库泄洪原理一样,水位超过某个水位了,那么就必须泄洪,也就是说达到某个条件了,哎,这个事件就要run了。
创建事件
创建事件有两种方法,第一种:CreateEvent,第二种:CreateEventEx,第一种呢创建的是单个事件,第二种呢就是批量。
现在,一步一步来,看一下CreateEvent的原型:
这是啥呀?这就是定义了一个函数指针嘛。。。
看里面的参数,咱们一个一个来,首先事件类型,记住下面的就足够了
第二个事件Notification优先级,同样一边看看,一边学习使用,特别是函数这一栏
第三个事件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组: