本文主要讲解FreeRTOS调度器中的三种调度算法:基于时间片的抢占式调度、不带时间片的抢占式调度和协同调度。
参考资料:《Mastering theFreeRTOS™ Real Time Kernel》3.12 Scheduling Algorithms
瑞萨RZ/T2L MPU
RZ/T2L是一款高性能MPU,可通过EtherCAT实现高速、高精度的实时控制。RZ/T2L搭载最大频率为800MHz的Arm® Cortex®-R52内核以及与CPU紧密耦合的大容量内存(576KB),可以降低使用高速缓存存储器时出现的执行时间波动,并提供确定性与高速响应处理。RZ/T2L在CPU内核、外设功能和LLPP(低延时外设端口)总线等方面具备与RZ/T2M无缝连接的硬件架构,可用于AC servo等更高性能的控制系统。此外,RZ/T2L提供了与瑞萨MPU和MCU可兼容、可扩展的软件平台。它使客户可以利用自己的软件资产进行新机型的开发。
RZ/T2L产品框图
有关RZ/T2L产品的更多介绍,您可识别下方二维码或复制链接到浏览器中打开查看:
https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/rz-mpus/rzt2l-high-performance-mpu-realizing-high-speed-and-high-precision-real-time-control-ethercat
1. 任务状态和事件的概述
实际正在运行(使用处理时间)的任务处于运行态。在单个核心处理器上,在任何时候都只能有一个任务处于运行态。
没有实际运行,但既不处于阻塞态也不处于挂起态的任务就是处于就绪态。
处于就绪态的任务可被调度器选择,然后进入运行态。调度程序会始终选择最高优先级的就绪态任务进入运行态。
任务可以在阻塞态下等待事件,并在事件发生时自动移回就绪态。
时间事件发生在特定的时间,例如当阻塞时间过期时,通常用于实现周期性或超时行为。当任务或中断服务例程使用任务通知、队列、事件组或多种类型的信号量之一发送信息时,就会发生同步事件。它们通常用于需要同步的情况,例如数据同步。
2.配置调度算法
调度算法决定了调度器将哪个就绪态任务转换到运行态。
可以使用configUSE_PREEMPTION和configUSE_TIME_SLICING配置常量来更改算法。这两个常量都在FreeRTOSConfig.h中定义。
还有个配置常数configUSE_TICKLESS_IDLE也会影响调度算法,因为使用它会导致tick中断在很长一段时间内被完全关闭。configUSE_TICKLESS_IDLE是一个高级选项,专门用于必须最小化功耗的应用程序。configUSE_TICKLESS_IDLE在之后解说。
对于相同优先级的任务,FreeRTOS调度器依次选中相同优先级的任务进入运行态。这种轮流策略被称为‘Round Robin Scheduling’
‘Round Robin Scheduling’算法并不能保证同等优先级的任务之间运行相同的时间,只能保证同等优先级的“就绪”任务会依次进入“运行”态。
基于时间片的抢占式调度
如果按照如下配置:
configUSE_PREEMPTION 1
configUSE_TIME_SLICING 1
FreeRTOS调度器使用一种称为“基于时间片的固定优先级抢占式调度”的调度算法,这是大多数小型RTOS应用程序使用的调度算法。
被描述为“固定优先级”的调度算法不会改变分配给被调度任务的优先级,但也不会阻止任务本身改变自己的优先级或其他任务的优先级。
在优先级高于运行态任务的任务进入就绪态时,调度器立即让这个高优先级的任务“抢占”运行态任务。被抢占意味着任务移出运行态并进入就绪态,并不是因为任务自己主动让出或者阻塞。
时间片用于在具有相同优先级的任务之间共享处理时间,即使任务没有显式地让步或进入阻塞状态。使用“时间片”的调度算法将在每个时间片结束时选择一个新任务进入运行状态,如果有其他与运行任务具有相同优先级的就绪状态任务。一个时间片等于两个RTOS tick中断之间的时间。
上图演示了使用“基于时间片的固定优先级抢占式调度”算法抢占调度任务的调度过程。
task1是最高优先级的事件驱动任务,task2是中等优先级的周期性任务,task3是最低优先级的事件驱动任务,Idle task是空闲任务。
task1周期性运行,阻塞时,空闲任务就会运行,task3的事件到达就会抢占空闲任务,task3运行期间,如果task2的周期到了,因为task2优先级高就会抢占task3,task2运行完了再接着运行task2,task2运行期间,由于task1优先级高,一旦task1等待的事件到了就会抢占task2。
有相同优先级任务的情况:
task1是优先级最高的事件驱动任务,task2是和Idle task优先级相同的持续处理型任务。
task2和空闲任务就会轮流运行,而task1则可以抢占task2和空闲任务。
假如空闲任务里其实没做什么事情,我们想让和空闲任务相同优先级的Task2有更多的运行时间就可以配置configIDLE_SHOULD_YIELD。
如果configIDLE_SHOULD_YIELD设置为0,那么空闲任务将在整个时间片中保持运行状态,除非它被更高优先级的任务抢占。
如果configIDLE_SHOULD_YIELD设置为1,如果有其他空闲优先级任务处于就绪状态,那么空闲任务将主动让出运行时间。
您可识别下方二维码或复制网址到浏览器中打开进入瑞萨技术论坛:
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待续
推荐阅读
支持EtherCAT协议的工业用微处理器新选择——瑞萨RZ/T2L评估套件评测(软件篇)
支持EtherCAT协议的工业用微处理器新选择——瑞萨RZ/T2L评估套件评测(硬件篇)
RZ/T2M N2L T2L原理图设计要点