一:任务调度的知识分享:
调度器就是使用相关的调度算法来决定当前需要执行的哪个任务
FreeRTOS 一共支持三种任务调度方式:
1.1 抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。
1.2 时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务。
这种方式类似于之前的帖子描述:
NUCLEO-U083RC学习历程35-使用任务调度实现不同任务输出-电子产品世界论坛
1.3 协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务。
二:抢占式调度:
执行过程参考帖子:【STM32F103ZET6】14:实测STM32F1的串口输出任务的挂起与恢复功能-电子产品世界论坛
比如之前的帖子中描述的LED0,LED1,串口1输出任务;三个的优先级不同,这里分别为0,1,2三种不同的优先级别,在任务设置中设置的数值越大,优先级别越大,这点和中断向量分组:抢占优先级和响应优先级不同。程序执行过程如下所示:
1、首先LED0在运行中,在这个过程中LED1就绪了,在抢占式调度器的作用下LED1会抢占LED0的运行。
2、LED1运行过程中,串口1输出任务就绪了,在抢占式调度器的作用下串口1输出任务会抢占LED1的运行。
3、串口1输出任务运行过程中,串口1输出任务阻塞了(系统延时或等待信号量等),此时就绪态中,优先级最高的任务LED1执行
4、串口1输出任务阻塞解除了(延时到了或者接收到信号量),此时串口1输出任务恢复到就绪态中,抢占LED1的运行
抢占式执行总结如下:
1、高优先级任务,会优于低优先级的任务先执行。
2、高优先级任务不停止,低优先级任务无法执行。
3、被抢占的任务将会进入就绪态
三:时间片调度:
同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片,在FreeRTOS中,一个时间片就等于SysTick 中断周期。
比如在之前的帖子中,创建的100ms,200ms,1000ms的三个任务。
执行过程如下所示:
1、首先100ms运行完一个时间片后,切换至200ms运行。
2、1000ms运行过程中(还不到一个时间片),1000ms阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务100ms。
总结如下所示:
1、同等优先级任务,轮流执行;时间片流转
2、一个时间片大小,取决为滴答定时器中断周期。
四:任务状态:
1:运行态:正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态。
2:就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态
3:阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态
4:挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。
几种状态的转换图如下所示:

总结如下:
1:运行态仅仅支持就绪态被转换。
2:挂起态,阻塞态只有在进入就绪态,才能被再次执行。
我要赚赏金
