1. liteos内核的任务管理
huawei liteos 内核提供任务的创建、删除、延迟、挂起、恢复等功能,以及锁定和解锁任务调度,支持任务按优先级高低的抢占调度及同优先级时间片轮转调度。
1.1. 任务
在 liteos 中,一个任务就是一个线程,多个任务按照优先级进行抢占式调度,达到多个任务“同时”运行的目的。
1.2. 任务的状态
huawei liteos 系统中的每个任务都有多种运行状态。当系统初始化完成并启动调度器后,系统中所有创建的任务就由内核进行调度,在不同运行状态之间切换,同时在系统中竞争一定的资源。
任务的状态有以下四种:
就绪(ready):该任务在就绪列表中,只等待 cpu;
运行(running):该任务正在执行;
阻塞(blocked):该任务不在就绪列表中。包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等;
退出态(dead):该任务运行结束,等待系统回收资源。
1.3. 任务id
任务 id在任务创建时通过参数返回给用户,作为任务的一个非常重要的标识。
用户可以通过任务id对指定任务进行任务挂起、任务恢复、查询任务名等操作。
1.4. 任务优先级
优先级表示任务执行的优先顺序。任务的优先级决定了在发生任务切换时即将要执行的任务,在就绪列表中的最高优先级的任务将得到执行。
huawei liteos 的任务一共有 32 个优先级 (0-31),最高优先级为 0,最低优先级为 31。
因为是liteos的内核是抢占式调度内核,所以:
高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。
1.5. 任务入口函数
任务入口函数是每个新任务得到调度后将执行的函数,该函数由用户实现,在任务创建时,通过任务创建结构体指定。
1.6. 多任务运作背后的机制
在多任务操作系统的内核中,为了方便对每个任务进行管理,每一个任务都有一个任务控制块(tcb),其中包含了任务上下文栈指针(stack pointer)、任务状态、任务优先级、任务id、任务名、任务栈大小等信息,tcb 相当于每个任务在内核中的身份证,可以反映出每个任务运行情况。
那么,操作系统中这么多的任务,它们依靠tcb被系统统一管理,那么又是如何被系统执行的呢?
其实,每个任务相当于一个裸机程序,每个任务之间相互独立,这个“独立”指的是每个任务都有自己的运行环境 —— 栈空间,称为任务栈,栈空间里保存的信息包含局部变量、寄存器、函数参数、函数返回地址等。
可是,系统中只有一个cpu,即使每个任务的任务栈是独立的,可是多个任务都需要被同一个cpu所执行,cpu的资源是共用的吧。
对的,cpu的资源是多个任务共用的,这些cpu的寄存器只有在任务执行的时候被使用,称为任务上下文,因此,内核在任务切换时会将切出任务的上下文信息保存在自身的任务栈空间里面,以便任务恢复时还原现场,从而在任务恢复后在切出点继续开始执行。
用户创建任务时,系统会先申请任务控制块需要的内存空间,申请成功后,系统会将任务栈进行初始化,预置上下文。此外,系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时,将会执行“任务入口函数”。
2. 任务管理api
huawei liteos 任务管理模块提供任务创建、任务删除、任务延时、任务挂起和任务恢复、更改任务优先级、锁任务调度和解锁任务调度、根据任务控制块查询任务 id、根据 id 查询任务控制块信息功能。
huawei liteos 任务管理提供的 api 都是以los开头,但是这些 api 使用起来比较复杂,所以本文中我们使用 huawei iot link sdk 提供的统一api接口进行实验,这些接口底层已经使用 liteos 提供的api实现,对用户而言更为简洁,api列表如下:
osal的api接口声明在中,使用相关的接口需要包含该头文件,关于函数的详细参数请参考该头文件的声明。
任务相关的接口定义在osal.c中,基于liteos的接口实现在liteos_imp.c文件中:
osal_task_create
创建任务
osal_task_kill
删除任务(非自身)
osal_task_exit
任务退出
osal_task_sleep
任务休眠
接口名
功能描述
2.1. osal_task_create
osal_task_create的接口用于创建一个任务,其接口原型如下:
void*osal_task_create(constchar*name,int(*task_entry)(void*args),void*args,intstack_size,void*stack,intprior){void*ret=null;if((null!=s_os_cb)&&(null!=s_os_cb->ops)&&(null!=s_os_cb->ops->task_create)) { ret=s_os_cb->ops->task_create(name,task_entry,args,stack_size,stack,prior); }returnret; }
该接口的参数说明如下表:
name
任务名称
tsak_entry
任务入口函数的函数指针
args
任务入口函数的参数列表
stack_size
任务栈大小
stack
任务栈地址
prior
任务优先级
返回值
任务id
参数名称
参数说明
2.2. osal_task_kill
osal_task_kill用于删除某个其他任务(非自身),其接口原型如下:
intosal_task_kill(void*task){intret=-1;if((null!=s_os_cb)&&(null!=s_os_cb->ops)&&(null!=s_os_cb->ops->task_kill)) { ret=s_os_cb->ops->task_kill(task); }returnret; }
该接口的参数说明如下表:
task
任务id
返回值
0-删除成功
返回值
-1-删除失败
参数名称
参数说明
2.3. osal_task_exit
osal_task_exit接口用于任务退出(自身),目前暂未支持,可以直接return退出。
2.4. osal_task_sleep
osal_task_sleep接口用于任务主动休眠,单位是ms,其接口原型如下:
voidosal_task_sleep(intms){if((null!=s_os_cb)&&(null!=s_os_cb->ops)&&(null!=s_os_cb->ops->task_sleep)) { s_os_cb->ops->task_sleep(ms); }return; }
3. 动手实验 —— 体验任务的创建与切换
实验内容
本实验中将创建两个任务,一个低优先级任务task1,一个高优先级任务task2,两个任务都会每隔2s在串口打印自己的任务id号,在串口终端中观察两个任务的运行情况。
实验代码
首先打开之前创建的 helloworld 工程,基于此工程进行实验。
在demo文件夹右击,选择新建文件夹:
新建osal_kernel_demo文件夹,用于存放内核的实验文件:
接下来在此osal_kernel_demo文件夹中新建第一个实验文件osal_task_demo.c文件,开始编写代码:
/*使用osal接口需要包含该头文件*/#include/*任务优先级宏定义(shell任务的优先级为10)*/#defineuser_task1_pri12//低优先级#defineuser_task2_pri11//高优先级/*任务id*/uint32_tuser_task1_id=0;uint32_tuser_task2_id=0;/*任务task1入口函数*/staticintuser_task1_entry(){intn=0;/*每隔2s在串口打印一次,打印5次后主动结束*/ for(n=0;ntask2:mytaskidis5!task1:mytaskidis4,n=0!task2:mytaskidis5!task1:mytaskidis4,n=1!task2:mytaskidis5!task1:mytaskidis4,n=2!task2:mytaskidis5!task1:mytaskidis4,n=3!task2:mytaskidis5!task1:mytaskidis4,n=4!task2:mytaskidis5!usertask1exit!task2:mytaskidis5!……
可以看到,系统启动后,首先打印版本号,串口shell的优先级为10,最先打印shell信息,接下来task1先创建,但是优先级较低,所以后创建的task2抢占执行,task2打印后主动挂起2s,这时task1开始执行,依次执行5次后task1结束,task2一直保持运行。
40G,40G是什么意思
通用Cruise获50亿美元的投资,全力研发无人驾驶出租车业务
回顾第十一届中国制造业MES应用年会内容和介绍
河南省5G产业发展行动方案为5G应用孵化和产业落地提供了良好的机会
无桥Boost PFC电路的EMI实例分析
华为物联网操作系统 LiteOS内核教程03-任务管理
设计素养对前端工程师的重要性
基本共发射极放大电路的仿真分析(四)
TCL科技2020年的业绩呈现出向好势头
汽车自动驾驶简介,什么是自动驾驶
麟810与高通骁龙芯片相比,处于什么水平
工地扬尘监测系统协助监管工地扬尘的污染问题
5g流量消耗会不会很快 5g是不是很耗钱
小吉化妆品冰箱走红网络
美国GF公司宣布起诉台积电 指控其侵犯16项专利权
科创板中国通号监事吴作威介绍、履历信息
AD8656双运放芯片组成的接收放大电路
三分钟看懂贴片电感器怎么看大小
苏州大学研究人员研发出一种单锂离子通道聚合物粘结剂 将解决锂硫电池能量严重衰减的问题
高新兴与青莲云合作,共建物联网安全生态联盟