【OpenHarmony】任务管理

本文详细介绍了在OpenHarmonyLiteOS-M内核中进行任务管理的实验,包括任务创建、任务函数定义、任务调度、优先级设置以及任务删除。实验通过创建两个任务TaskF01和TaskF02,演示了任务的运行和相互影响,其中TaskF02在特定条件下删除TaskF01,展示了任务状态的监控和控制。
摘要由CSDN通过智能技术生成

目录

实验目的

实验涉及知识点

实验过程

任务的创建

在OpenHarmony/device/qemu/arm_msp2_an386/liteos_m/board/目录下添加文件夹task_demo,并拷贝模板文件到这个文件夹下

添加TaskF01任务函数

添加Create_Task1函数

添加任务函数TaskF02

添加Create_Task2函数

添加函数完成task1和task2的创建

添加对task_demo()的调用

编辑BUILD.gn文件

实验测试


实验目的

  1. 了解LiteOS-M内核中任务管理的基础知识,目录结构组成、具体源文件及其功能的对应关系等。
  2. 熟悉LiteOS-M中任务的工作(调度)原理、任务的状态、包含:任务的创建、运行、调度、优先级变更等
  3. 掌握内核中的任务管理接口的使用,包含跟踪调试、编译和烧录程序到开发板等。

实验涉及知识点

  1. 了解类Linux系统中关于任务(Task)的相关概念
  2. 任务调度的工作原理,任务的四种状态和状态的变迁;任务调度的术语和相关概念。
  3. 了解任务创建、运行和结束的机制。
  4. 熟悉任务管理的相关函数接口:任务创建和删除、任务状态控制、任务调度等。

实验过程

任务的创建

在OpenHarmony/device/qemu/arm_msp2_an386/liteos_m/board/目录下添加文件夹task_demo,并拷贝模板文件到这个文件夹下

添加TaskF01任务函数

static VOID TaskF01(VOID)
{
    int sum = 0;

    while (1) {
        printf("This is task1,current sum:%d\n", sum++);
        usleep(1000000);
    }
    
}

本函数为任务1得到调度时将执行的函数,该函数在while循环中对sum变量执行加1操作并打印,之后暂停1秒。即每隔一秒对sum的值打印一次。

添加Create_Task1函数

static UINT32 Create_Task1(VOID)
{
    UINT32 ret;
    TSK_INIT_PARAM_S task1 = {0};
    task1.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskF01;
    task1.uwStackSize = TASK_STACK_SIZE_TEST;
    task1.pcName = "Tsk001A";
    task1.usTaskPrio = TASK_PRIO_TEST - 1;
    task1.uwResved = LOS_TASK_STATUS_DETACHED;

    ret = LOS_TaskCreate(&g_testTaskID01, &task1);

    return LOS_OK;
}

在该函数中,使用任务变量初始化结构体TSK_INIT_PARAM_S设置任务的属性字段,最终使用LOS_TaskCreate()创建任务Task1。

添加任务函数TaskF02

static VOID TaskF02(VOID)
{
    int sum = 0;
    while (1) {
        printf("This is task2,current sum:%d\n", sum++);
        usleep(3000000);

        if(sum >= 10)
        {
            UINT32 task1Status;
            UINT32 ret = LOS_TaskStatusGet(g_testTaskID01, &task1Status);
            if(ret == LOS_OK)
            {
                if(task1Status != OS_TASK_STATUS_EXIT)
                {
                    LOS_TaskDelete(g_testTaskID01);
                }
            }
        }
    }
}
  • 本函数内的while循环中打印sum变量自加的结果,每隔三秒打印一次。当sum>=10的时候调用函数LOS_TaskStatusGet()完成对task1的状态检测,此时如果task1没有退出运行(由于task1没有自动退出的条件,所以如果不手动结束其运行,就会一直运行下去),调用LOS_TaskDelete删除task1。
  • 此时task2比task1的优先级高一级,所以在task2会被优先调度。

添加Create_Task2函数

static UINT32 Create_Task2(VOID)
{
    UINT32 ret;
    TSK_INIT_PARAM_S task2 = {0};
    task2.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskF02;
    task2.uwStackSize = TASK_STACK_SIZE_TEST;
    task2.pcName = "Tsk002A";
    task2.usTaskPrio = TASK_PRIO_TEST - 2;
    task2.uwResved = LOS_TASK_STATUS_DETACHED;

    ret = LOS_TaskCreate(&g_testTaskID02, &task2);

    return LOS_OK;
}

添加函数完成task1和task2的创建

VOID task_demo()
{
    Create_Task1();
    Create_Task2();
}

通过对创建任务函数的调用完成task1和task2的创建,此时task1先于task2被创建。

添加对task_demo()的调用

  • 在main.c中添加对函数task_demo()的调用,要放在LOS_start()之前,因为函数LOS_start()会直接启动任务调度器进入调度的轮询,故所有的任务需要在被调度之前完成创建。

编辑BUILD.gn文件

在OpenHarmony/device/qemu/arm_mps2_an386/liteos_m/board目录下编辑BUILD.gn

在task_demo目录下编辑BUILD.gn文件

实验测试

编译运行,结果如下

可以看到虽然task2晚于task1被创建,但是由于task2的优先级高于task1,所以task2先运行

然后task1和task2交替运行,task1每秒打印一次sum值,task2每3秒打印一次

当task2的sum值自加到10时,删除task1,此时只有task2在运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值