一、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 | 删除任务切换时钩子函数 |


https://os.iot.10086.cn/v2/doc/detailPage/documentHtml?proId=2000000000&proName=OneOS%20Lite&idss=2179&versionName=V3.2.0&versionId=3000000016
1698

被折叠的 条评论
为什么被折叠?



