调度器
简单的来说,调度器就是使用相关的调度算法来决定当前需要执行的任务。
FreeRTOS操作系统支持三种调度方式:抢占式调度、时间片调度和合作式调度。
1.合作式调度
合作式调度器提供了一种单任务的系统结构:
口 当任务需要运行的时候,被添加到等待队列
口 任务在特定的时刻被调度运行(以周期性或者单次方式)
口 任务运行直到完成(高优先级任务不可抢占 CPU ),然后由调度器选择下一个任务
优点:调度简单,系统占用资源少(单任务结构,运行时高优先级任务不会抢占 CPU ,不需要给每个任务分配独立的栈空间)
缺点:系统实时性不够好
Note :
单片机资源越来越丰富,加上合作式调度器的系统实时性不够好,合作式调度已经很少用了, FreeRTOS 在新的版本中已不再更新,简单了解即可。
2、抢占式调度
抢占式调度器提供了一种多任务的的系统结构,高优先级任务可以抢占低优先级任务的 CPU 使用权,使得系统实时性非常好。
使用抢占式调度器时,根据任务重要程度合理分配优先级, CPU 会优先执行就绪列表中优先级最高的任务。
下面图片:任务1优先级<任务2优先级<任务3优先级
下面做个关于抢占式调度的测试:
用stm32cubeMX创建3个LED闪烁任务,优先级关系:LED1<LED2<LED3
LED1任务:LED1间隔10ms闪烁
LED2任务:LED2间隔1s闪烁
LED3任务:LED3间隔1s闪烁
实验现象:
任务1不会执行,任务2和任务3交替执行
3.时间片调度
时间片调度针对同优先级的任务,调度算法给同优先级的任务分配一个专门的列表,用于记录当前就绪的任务,并为每个任务分配一个时间片,这个时间片是固定的。
这里,一个Tick的时间是可以设定的:
在FreeRTOS.h文件里改变其频率:或者在stm32cubeMX中设定:
下面做个时间片调度的测试(一个Tick周期为50ms):
还是创建3个任务,不过这次3个LED任务优先级相同
3个任务里运行内容分别为LED1、LED2、LED3间隔10ms闪烁
实验现象:
补充:若是关闭了时间片调度器,那么系统将只执行任务3,如何关闭时间片调度器如下图: