当前位置:   article > 正文

【LiteOS】06-开发内核-任务管理_liteos内核开发

liteos内核开发

此笔记由个人整理

华为IOT LiteOS开发实战营

第三天

一、简介

基础概念

  • 从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。
  • LiteOS是一个支持多任务的操作系统。在LiteOS中,一个任务表示一个线程。
  • LiteOS中的任务是抢占式调度机制,同时支持时间片轮转调度方式。
  • 高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。
  • LiteOS的任务一共有32个优先级(0-31),最高优先级为0,最低优先级为31。

任务状态

  • 就绪(Ready):该任务在就绪列表中,只等待CPU。
  • 运行(Running):该任务正在执行。
  • 阻塞(Blocked):该任务不在就绪列表中。包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。
  • 退出态(Dead):该任务运行结束,等待系统回收资源。

任务状态迁移

image-20200528143409610
  • **就绪态→运行态:**创建任务会在就绪列表中,运行态的任务会被高优先级打断而就绪。
  • **运行态→阻塞态:**任务运行因挂起、读信号量等待等,在就绪列表中被删除进入阻塞。
  • 阻塞态→就绪态(阻塞态→运行态):阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态;此时如果被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务由就绪态变成运行态。
  • **就绪态→阻塞态:**任务也有可能在就绪态时被阻塞(挂起)。
  • **运行态→就绪态:**有更高优先级任务创建或者恢复后,发生任务切换而进入就绪列表。
  • **运行态→退出态:**任务运行结束,内核自动将此任务删除,此时由运行态变为退出态。
  • **阻塞态→退出态:**阻塞的任务调用删除接口,任务状态由阻塞态变为退出态

常见名词

  • 任务ID:在任务创建时通过参数返回给用户,作为任务的一个非常重要的标识
  • 任务优先级:优先级表示任务执行的优先顺序
  • 任务入口函数:每个新任务得到调度后将执行的函数
  • 任务控制块TCB:每一个任务都含有一个任务控制块(TCB)。TCB包含了任务上下文栈指针(stackpointer)、任务状态、任务优先级、任务ID、任务名、任务栈大小等信息。TCB可以反映出每个任务运行情况
  • 任务栈:每一个任务都拥有一个独立的栈空间,我们称为任务栈。
  • 任务上下文:任务在运行过程中使用到的一些资源,如寄存器等,我们称为任务上下文。HuaweiLiteOS在任务挂起的时候会将本任务的任务上下文信息,保存在自己的任务栈里面,以便任务恢复后,从栈空间中恢复挂起时的上下文信息,从而继续执行被挂起时被打断的代码。
  • 任务切换:任务切换包含获取就绪列表中最高优先级任务、切出任务上下文保存、切入任务上下文恢复等动作。

二、运作原理

  • LiteOS任务管理模块提供任务创建、任务删除、任务延时、任务挂起和任务恢复、更改任务优先级、锁任务调度和解锁任务调度、根据任务控制块查询任务ID、根据ID查询任务控制块信息功能
  • 在任务模块初始化时,系统会先申请任务控制块需要的内存空间,如果系统可用的内存空间小于其所需要的内存空间,任务模块就会初始化失败。如果任务初始化成功,则系统对任务控制块内容进行初始化
  • 用户创建任务时,系统会将任务栈进行初始化,预置上下文。此外,系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时,将会执行“任务入口函数”

三、使用场景

  • LiteOS的任务模块可以给用户提供多个任务,实现了任务之间的切换和通信,帮助用户管理业务程序流程。这样用户可以将更多的精力投入到业务功能的实现中。

四、操作系统抽象层

您需要在您的系统初始化完毕之后,调用osal_install接口将您的系统注册进SDK即可。使用该接口需要包含<osal_imp.h>,相关的宏定义在<osal_type.h>中。详情参考该头文件。

  • 常见参数

image-20200528145415223

  • 创建任务
osal_task_create(constchar*name,int(*task_entry)(void*args),void*args,intstack_size,void*stack,intprior);
  • 1
  • 删除某个任务
osal_task_kill(void*task);
  • 1
  • 任务退出(不会再恢复)
osal_task_exit();
  • 1
  • 任务休眠
osal_task_sleep(int ms);
  • 1

五、代码实践

  • 创建任务,选择任务管理案例

image-20200528145843866

基础实验

#include <osal.h>

#define USER_TASK1_PRI  12//低优先级
#define USER_TASK2_PRI  11//高优先级

uint32_t user_task1_id = 0;
uint32_t user_task2_id = 0;

static int user_task1_entry()//任务1
{
    int n = 0;

    for(n = 0; n < 5; n++)
    {
        printf("task1: my task id is %ld, n = %d!\r\n", user_task1_id, n++);
        osal_task_sleep(2*1000);
    
    }

    printf("user task 1 exit!\r\n");
    return 0;
}
static int user_task2_entry()//任务2
{
    while (1)
    {
        printf("task 2: my task id is %ld!\r\n", user_task2_id);
        osal_task_sleep(2*1000);
    }
}

int standard_app_demo_main()
{
	printf("user task 1 exit!\r\n");
	user_task1_id = osal_task_create("user_task1",user_task1_entry,NULL,0x400,NULL,USER_TASK1_PRI);
    user_task2_id = osal_task_create("user_task2",user_task2_entry,NULL,0x400,NULL,USER_TASK2_PRI);

    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 结果

image-20200528152312399

扩展实验

  • 使用以下两个实现任务删除与退出:
  • osal_task_kill(taskid);
  • osal_task_exit();
#include <osal.h>

#define USER_TASK1_PRI  12//低优先级
#define USER_TASK2_PRI  11//高优先级

uint32_t user_task1_id = 0;
uint32_t user_task2_id = 0;

static int user_task1_entry()
{
    int n = 0;

    for(n = 0; n < 5; n++)
    {
        printf("task1: my task id is %ld, n = %d!\r\n", user_task1_id, n);
        osal_task_sleep(2*1000);
        if(n==3)
        {
            // osal_task_kill(user_task2_id);//删除指定任务
            // printf("kill task success\r\n");
            printf("user task 1 exit!\r\n");
            osal_task_exit();//退出当前任务
        }
    }

    return 0;
}
static int user_task2_entry()//任务2
{
    while (1)
    {
        printf("task 2: my task id is %ld!\r\n", user_task2_id);
        osal_task_sleep(2*1000);
    }
}

int standard_app_demo_main()
{
	printf("user task 1 exit!\r\n");
	user_task1_id = osal_task_create("user_task1",user_task1_entry,NULL,0x400,NULL,USER_TASK1_PRI);
    user_task2_id = osal_task_create("user_task2",user_task2_entry,NULL,0x400,NULL,USER_TASK2_PRI);

    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 结果

image-20200528191936512

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/226310
推荐阅读
  

闽ICP备14008679号