UEFI开发学习23 – 利用定时器实现伪多线程
简介
多线程这个概念在UEFI的开发上比较少见,因为UEFI只是一个启动引导的规范,没有特别复杂各种任务需要处理,所以对多线程的要求不是很高。
什么是多线程呢?简单地讲就是在一个时间点,可以同时执行多项任务的技术。有了多线程,便可以充分利用系统资源,实现任务处理效率的最大化。
又什么是伪多线程呢?真正的多线程是并发执行,而这里之所以称为伪多线程,是因为程序执行的时候还是有先后之分,比如我创建了两个任务,这两个任务执行的时候是按照一定的先后顺序依次执行的。如果有做过上层的多线程开发,对这个概念会比较好理解。
代码示例
伪多线程的实现利用的是UEFI中的定时器,创建一个定时器可以当作一个任务,创建多个定时器便是多个任务了,也就是“多线程”。示例代码如下:
#include <Uefi.h> #include <Library/UefiLib.h> #include <Library/UefiBootServicesTableLib.h> VOID TimerTask1 ( IN EFI_EVENT Event, IN VOID *Context ) { Print(L"Timer task 1\n\r"); } VOID TimerTask2 ( IN EFI_EVENT Event, IN VOID *Context ) { Print(L"Timer task 2\n\r"); } VOID Function ( VOID ) { Print(L"Main task\n\r"); gBS->Stall(50 * 1000 * 1000); } EFI_STATUS TaskCreate ( IN EFI_EVENT_NOTIFY NotifyFunction, IN VOID *Context, IN EFI_TIMER_DELAY Type, IN UINT64 TriggerTime ) { EFI_STATUS Status; EFI_EVENT Event; Status = gBS->CreateEvent ( EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_NOTIFY, (EFI_EVENT_NOTIFY)NotifyFunction, Context, &Event ); if (EFI_ERROR (Status)) { return EFI_UNSUPPORTED; } Status = gBS->SetTimer (Event, Type, TriggerTime); if (EFI_ERROR (Status)) { return EFI_UNSUPPORTED; } return Status; } int main(int argc, char **argv) { // Task 1 TaskCreate (TimerTask1, (VOID*)NULL, TimerPeriodic, 10 * 1000 * 1000); // Task 2 TaskCreate (TimerTask2, (VOID*)NULL, TimerPeriodic, 10 * 1000 * 1000); // Main task Function(); return EFI_SUCCESS; }
执行结果(gif动图):
可以看到,在执行主线任务Function()期间,又分别多次调用了Task1和Task2。如果只想让任务只执行一次,可以将TimerPeriodic设置为TimerRelative即可。
版权声明:
作者:bin
链接:https://ay123.net/mystudy/uefi/1575/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。
THE END
0
二维码
海报
UEFI开发学习23 – 利用定时器实现伪多线程
简介
多线程这个概念在UEFI的开发上比较少见,因为UEFI只是一个启动引导的规范,没有特别复杂各种任务需要处理,所以对多线程的要求不是很高。
什么是多线程呢……
文章目录
关闭
共有 0 条评论