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
分享
二维码
海报
UEFI开发学习23 – 利用定时器实现伪多线程
简介 多线程这个概念在UEFI的开发上比较少见,因为UEFI只是一个启动引导的规范,没有特别复杂各种任务需要处理,所以对多线程的要求不是很高。 什么是多线程呢……
<<上一篇
下一篇>>
文章目录
关闭
目 录