一.任务调度器简介
调度器:使用调度相关算法决定当前需要执行那个任务
1.FreeRTOS三种任务调度方式:
(1)抢占式调度:针对优先级不同的任务,优先级高的任务可抢占优先级低的任务(序号越大,优先级越高,与中断相反)
(2)时间片调度:针对优先级相同的任务,当多个任务的优先级相同,任务调度器会在每一次系统时钟节拍到的时候切换任务
(3)协程式调度:当前任务将会一直运行,同时高优先级的任务不会抢占低优先级的任务(不常用)
2.抢占式调度
创建任务1、2、3,优先级依次Task3>Task2>Task1
运行过程:
1.Task1运行时,Task2进入就绪状态,Task2抢占Task1运行
2.Task2运行时,Task3进入就绪状态,Task3抢占Task2运行,当Task3进入阻塞状态(系统延时或等待信号量),此时,就绪状态中优先级最高的任务Task2运行
3.Task3解除阻塞状态,Task3恢复就绪状态,Task3抢占Task2运行
总结:a.高优先级任务,优先执行 b.高优先级任务不停止执行,低优先级任务无法执行
c.被抢占的任务将会进入就绪状态
3.抢占式调度
相同优先级的任务轮流享有CPU时间,叫时间片,在FreeRTOS中,一个时间片等于Systick中断周期
创建任务1、2、3,优先级依次Task3=Task2=Task1
运行过程:
1.Task1运行完一个时间片,运行Task2
2.Task2运行完一个时间片,运行Task3
3.Task3运行过程中(还不到一个时间片),Task3阻塞了,此时直接切换到下一个任务Task1运行
4.Task1运行完一个时间片,运行Task2
总结:a.相同优先级的任务,轮流执行;时间片流转 b.一个时间片的大小,取决于滴答定时器的 中断周期 c.没被用完的时间片不会再使用,即下次运行的还是一个完整的时间片
二.任务状态
FreeRTOS中任务存在4种状态:运行态、就绪态、阻塞态、挂起态
1.运行态:正在执行的任务,注意:STM32中,同一时间只能有一个任务处于运行态
2.就绪态:该任务具备被执行的条件,但未被执行
3.任务因延时或外部事件发生,该任务处于阻塞态
4.挂起态:类似于暂停,调用vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume(),将任务恢复为就绪态
注意:(1)仅就绪态可以转换为运行态 (2)其他状态的任务想运行,必须先转换为就绪态
(3)这4种状态中,除了运行态,其他三种任务都有对应的任务状态列表
三.任务状态列表
创建任务1、2、3,优先级依次Task3>Task2>Task1
1.任务创建完,存放在就绪列表中,查询状态列表中优先级最高的任务,优先运行
2.当Task3被阻塞了,Task3存放到阻塞列表,此时,运行Task2
3.当Task2被挂起了,Task2存放到挂起列表,此时,运行Task1
4.当Task3恢复为就绪状态,Task3存放到就绪列表中,再次查询,运行Task3
创建任务1、2、3,4,优先级依次Task4>Task3=Task2=Task1
1.相同优先级的任务,会链接在同一个就绪列表上,此时,任务运行采用时间调度,每个任务运行一个时间片