目录
在OpenHarmony/device/qemu/arm_msp2_an386/liteos_m/board/目录下添加文件夹task_demo,并拷贝模板文件到这个文件夹下
实验目的
- 了解LiteOS-M内核中任务管理的基础知识,目录结构组成、具体源文件及其功能的对应关系等。
- 熟悉LiteOS-M中任务的工作(调度)原理、任务的状态、包含:任务的创建、运行、调度、优先级变更等
- 掌握内核中的任务管理接口的使用,包含跟踪调试、编译和烧录程序到开发板等。
实验涉及知识点
- 了解类Linux系统中关于任务(Task)的相关概念
- 任务调度的工作原理,任务的四种状态和状态的变迁;任务调度的术语和相关概念。
- 了解任务创建、运行和结束的机制。
- 熟悉任务管理的相关函数接口:任务创建和删除、任务状态控制、任务调度等。
实验过程
任务的创建
在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在运行