FreeRTOS调度器中的三种调度算法实践(上)

控制/MCU

1814人已加入

描述

参考资料:《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可兼容、可扩展的软件平台。它使客户可以利用自己的软件资产进行新机型的开发。

cpu

RZ/T2L产品框图

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’算法并不能保证同等优先级的任务之间运行相同的时间,只能保证同等优先级的“就绪”任务会依次进入“运行”态。

2.1

基于时间片的抢占式调度

如果按照如下配置:

configUSE_PREEMPTION 1

configUSE_TIME_SLICING 1

FreeRTOS调度器使用一种称为“基于时间片的固定优先级抢占式调度”的调度算法,这是大多数小型RTOS应用程序使用的调度算法。

固定优先级

被描述为“固定优先级”的调度算法不会改变分配给被调度任务的优先级,但也不会阻止任务本身改变自己的优先级或其他任务的优先级。

抢占式调度

在优先级高于运行态任务的任务进入就绪态时,调度器立即让这个高优先级的任务“抢占”运行态任务。被抢占意味着任务移出运行态并进入就绪态,并不是因为任务自己主动让出或者阻塞。

时间片

时间片用于在具有相同优先级的任务之间共享处理时间,即使任务没有显式地让步或进入阻塞状态。使用“时间片”的调度算法将在每个时间片结束时选择一个新任务进入运行状态,如果有其他与运行任务具有相同优先级的就绪状态任务。一个时间片等于两个RTOS tick中断之间的时间。

cpu

上图演示了使用“基于时间片的固定优先级抢占式调度”算法抢占调度任务的调度过程。

task1是最高优先级的事件驱动任务,task2是中等优先级的周期性任务,task3是最低优先级的事件驱动任务,Idle task是空闲任务。

task1周期性运行,阻塞时,空闲任务就会运行,task3的事件到达就会抢占空闲任务,task3运行期间,如果task2的周期到了,因为task2优先级高就会抢占task3,task2运行完了再接着运行task2,task2运行期间,由于task1优先级高,一旦task1等待的事件到了就会抢占task2。

有相同优先级任务的情况:

cpu

task1是优先级最高的事件驱动任务,task2是和Idle task优先级相同的持续处理型任务。

task2和空闲任务就会轮流运行,而task1则可以抢占task2和空闲任务。

假如空闲任务里其实没做什么事情,我们想让和空闲任务相同优先级的Task2有更多的运行时间就可以配置configIDLE_SHOULD_YIELD。

如果configIDLE_SHOULD_YIELD设置为0,那么空闲任务将在整个时间片中保持运行状态,除非它被更高优先级的任务抢占。

如果configIDLE_SHOULD_YIELD设置为1,如果有其他空闲优先级任务处于就绪状态,那么空闲任务将主动让出运行时间。

cpu

审核编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分