OneOs任务基础知识

一、OneOS任务组成

1)OneOS中,任务有三部分组成:任务函数、任务控制块、任务堆栈

2)任务函数有两种结构

无限循环结构

顺序结构

无限循环结构的任务需要有让出cpu使用权的操作,否则会一直执行

3) 任务控制块是管理任务,任务堆栈是恢复现场,保护现场的功能

二、任务状态

任务的生命周期内,会进行不同状态的变换、

2.1任务基础状态

基础任务状态说明
初始态任务创建完成,被启动之前处于初始态
就绪态初始态任务被启动之后,状态切换为就绪态,加入就绪队列,等待调度器调度运行
运行态正在运行的任务处于运行态
睡眠态正在运行的任务睡眠后会处于睡眠态,睡眠时间到后,会被唤醒
阻塞态任务运行条件未满足需要等待时进入阻塞态,当运行条件满足后被唤醒
挂起态任务被挂起后进入挂起态,不参与调度,直到被恢复
关闭态任务被销毁

2.2任务状态组合

有些状态是可以有效组合的

有效组合态说明
阻塞态+挂起态处在阻塞态的任务被挂起
阻塞态+睡眠态任务有限时间等待某种条件满足时,此时被唤醒的方式有2种,超时或者条件满足
睡眠态+挂起态处于睡眠态的任务被挂起
阻塞态+睡眠态+挂起态处于阻塞态+睡眠态的任务被挂起

2.3任务状态的迁移

1.任何状态都可以转变为关闭态,但关闭态不可以转变为其他状态

2.初始态Init只能转变为就绪态Ready,并且因被调度而转变为就绪态

3.运行态Running转变为就绪态是因为运行的任务被其他任务抢占或者时间片用完

4.运行态转变为阻塞态Block是由于任务条件不足,需要无限等待,此时就会被挂到阻塞队列

5.阻塞态任务也可以被挂起,从而变为阻塞态+挂起态Suspend的组合状态

6.当阻塞态+挂起态被恢复时,又会变为阻塞态

7.运行态任务主动睡眠变为睡眠态Sleep

8.当处于阻塞态的任务满足条件时又会转变为就绪态

9.睡眠态任务睡眠时间到达时又会进入就绪态

10.睡眠态任务被挂起可以变为睡眠态+挂起态

11.睡眠态+挂起态任务被恢复,但由于睡眠时间未到仍为睡眠态

12.睡眠态+挂起态睡眠时间已到,但由于挂起未被恢复,仍为挂起态

13.运行态任务由于某种条件未被满足而需要有限时间等待,此时任务会被同时挂在阻塞队列和睡眠队列

14.睡眠态+阻塞态任务由于条件已经满足或者等待超时,任务将转变为就绪态

15.睡眠态+阻塞态可以转变为睡眠态+阻塞态+挂起态

16.睡眠态+阻塞态+挂起态挂起被恢复后又会转为睡眠态+阻塞态

17.睡眠态+阻塞态+挂起态由于条件已经满足或者等待超时,又会转为挂起态

18.就绪态任务也可被挂起从而变为挂起态

19.挂起态任务挂起恢复后又可变为就绪态

20.运行态也可被挂起

21.阻塞态+挂起态任务由于条件满足变为挂起态

2.4任务状态宏定义

#define OS_TASK_STATE_EMPTY                 0x0000U
#define OS_TASK_STATE_INIT                  0x0001U
#define OS_TASK_STATE_READY                 0x0002U
#define OS_TASK_STATE_RUNNING               0x0004U
#define OS_TASK_STATE_SLEEP                 0x0008U
#define OS_TASK_STATE_BLOCK                 0x0010U
#define OS_TASK_STATE_SUSPEND               0x0020U
#define OS_TASK_STATE_CLOSE                 0x8000U
#define OS_TASK_STATE_MASK                  0xFFFFU
任务状态宏说明
OS_TASK_STATE_EMPTY无效态
OS_TASK_STATE_INIT初始态
OS_TASK_STATE_READY就绪态
OS_TASK_STATE_RUNNING运行态
OS_TASK_STATE_SLEEP睡眠态
OS_TASK_STATE_BLOCK阻塞态
OS_TASK_STATE_SUSPEND挂起态
OS_TASK_STATE_CLOSE关闭态
OS_TASK_STATE_MASK状态掩码

三、任务优先级

任务调度支持时基于优先级的抢占式调度算法,即在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的。

OneOS可支持256个优先级(可通过配置文件更改)

0优先级最高,最低优先级留给空闲任务使用

相同优先级任务采用时间片轮转进行调度

每个任务优先级都分配有就绪队列,相同优先级的就绪任务会连接在同一个队列上

四、API列表

接口说明
os_task_create创建并初始化任务,任务控制块使用的内存空间可由用户提供,也可在开启系统堆的情况下指定为空由系统堆提供空间
os_task_destroy销毁任务,与os_task_create()配合使用,回收 os_task_create()涉及到的资源
os_task_startup启动任务,让该任务进入就绪态
os_task_suspend挂起任务,被挂起的任务在被唤醒之前不再执行
os_task_resume唤醒被挂起的任务
os_task_yield任务让权,调用该接口任务会主动放弃CPU运行权
os_task_set_time_slice设置任务的时间片
os_task_get_time_slice获取任务的时间片
os_task_get_remaining_time_slice获取任务的剩余时间片
os_task_set_priority设置任务的优先级
os_task_get_priority获取任务的优先级
os_task_tsleep让当前任务进入睡眠状态,以节拍为单位,不可以在中断上下文使用
os_task_msleep让当前任务进入睡眠状态,以ms为单位,不可以在中断上下文使用
os_get_current_task获取当前任务的ID
os_task_get_id根据任务名字获取任务的ID
os_task_check_exist根据任务ID查询特定任务是否已存在于系统
os_task_get_name根据任务ID获取任务的名字
os_task_get_state根据任务ID获取任务的状态
os_task_get_stack_top根据任务ID获取任务栈的栈顶指针
os_task_get_stack_begin根据任务ID获取任务栈的栈起始地址
os_task_get_stack_end根据任务ID获取任务栈的栈结束地址
os_task_get_total_count获取系统中已初始化且未被销毁的任务数量
os_task_set_cleanup_callback设置用户清理回调函数,当任务销毁时会调用回调函数
os_task_set_user_data用于设置任务的用户信息
os_task_get_user_data用于获取任务的用户信息
os_task_set_cpu_affinity用于多核环境下设置任务的CPU亲和性
os_task_get_cpu_affinity用于多核环境下获取任务的CPU亲和性
os_schedule_lock锁调度器
os_schedule_unlock解锁调度器
os_is_schedule_locked查询调度器状态
os_errno获取最新的系统运行错误码地址
os_task_switch_hook_add添加任务切换时钩子函数
os_task_switch_hook_delete删除任务切换时钩子函数

五、官网链接

所有资料都可以在以下网站中找到文档中心 (10086.cn)icon-default.png?t=N7T8https://os.iot.10086.cn/v2/doc/detailPage/documentHtml?proId=2000000000&proName=OneOS%20Lite&idss=2179&versionName=V3.2.0&versionId=3000000016

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值