目录
一. 任务调度简介
认识:调度器就是使用相关的调度算法决定当前需要执行哪个任务。
1.1 FreeRTOS的任务调度方式:
1.1.1 抢占式调度
主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。
总结:
① 高优先级任务,优先执行
② 高优先级任务不停止,低优先级的任务无法执行
③ 被抢占的任务将会进入就绪态
1.1.2 时间片调度
主要是针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务。
总结:
① 同等优先级任务,轮流执行;时间片流转。
② 同等优先级的任务轮流享有相同的CPU时间(时间片),一个时间片的大小,取决于滴答定时器中断周期。
③ 任务中途被打断或者阻塞,没有用完的时间片不会再使用,下次该任务得到执行还是按照一个时间片的时钟节拍运行。
1.1.3 协程式调度
当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级的任务。
二. 任务状态
2.1 FreeRTOS中有4种任务状态:
2.1.1 运行态
正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅有一个任务处于运行态。
2.1.2 就绪态
如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。
2.1.3 阻塞态
如果一个任务因延时或者等待外部事件发生,那么该任务处于阻塞态。
2.1.4 挂起态
类似于暂停,调用函数vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。
总结:
① 仅有就绪态的任务可以直接变成运行态
② 其他状态的任务想执行,必须先转变为就绪态
2.2 FreeRTOS中有3种任务状态列表
2.2.1 就序列表
pxReadyTasksLists[x],其中x代表任务优先级数值(硬件为STM32,所以x取值0~31),32位的变量,当某个位,置一时,代表所对应的优先级就绪列表有任务存在。
调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行 。
若任务的优先级相同,相同优先级的任务会连接在同一个就绪列表上。
2.2.2 阻塞列表
pxDelayedTaskList
2.2.3 挂起列表
xSuspendedTaskList