嵌入式随记 —— 调度器-繁依Fanyi

在这里插入图片描述

前言

嵌入式实时操作系统的核心就是调度器和任务切换。调度器的核心就是调度算法。 任务切换的实现在不同的嵌入式实时操作系统中区别不大,基本相同的硬件内核架构,任务切换也是相似的。

在这里我们说说调度器。

从调度器开始

1. 什么是调度器?

调度器,应该是 RTOS 的灵魂。如果没有调度器,RTOS 就不能算作 实时操作系统,只能算作是一个只能像流水线一样执行任务的系统。就像下面做月饼一样,所有月饼按照先后顺序依次执行,没有分出 “轻重缓急”。
请添加图片描述
而有了调度器,就能让操作系统根据线程的优先级来处理问题。简单来说,调度器就是使用相关的调度算法来决定当前需要指定的任务

2. 调度器的共有特征

调度器有很多种类,但所有的调度器都有以下共同的特征

① 调度器可以区分就绪态任务和挂起任务(由于延迟,信号量等待,邮箱等待,事件组等待等原因而使得任务被挂起)。

② 调度器可以选择就绪任务中的一个任务,然后通过执行这个就绪任务激活它。然后当前执行的任务变成运行态的任务。

在这里插入图片描述

③ 不同调度器之间最大的区别就是如何分配就绪态任务间的完成时间。

FreeRTOS 支持的调度方式

FreeRTOS 操作系统支持三种调度方式 抢占式调度时间片调度合作式调度。但在实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少。

抢占式调度,每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,比如 vTaskDelay(延时函数)。

时间片调度,每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如vTaskDelay,才会执行同优先级任务之间的任务切换

抢占式调度器

在实际的应用中,不同的任务需要不同的响应时间。例如,大家买手机,买显示器都喜欢买高刷屏,为的就是打游戏能有更顺滑的感觉。

同样,为了显示器能够及时显示游戏的画面,我们就需要抢占式调度把显示器的相关任务调到优先级最高,处理器等才能及时地处理显示器的显示任务,“游戏才能不卡”。

但如果使用 合作式调度器 或者 时间片调度,那么显示设备将无法得到及时的响应,这时抢占式调度是必须的。
请添加图片描述
如果使用了抢占式调度,当前最高优先级的任务一旦就绪,总能得到CPU的控制权

举个例子,当一个运行着的任务被其它高优先级的任务抢占,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权并运行。

使用抢占式调度器,使得最高优先级的任务什么时候可以得到CPU的控制权并运行,同时使得任务级响应时间得以最优化。

时间片调度器

时间片调度器就是在优先级相等的时候,给每个任务 “画大饼”,保证每个任务分到的大饼相等,每个任务都能执行到相同的时间片。当一个任务消耗完一个时间片,就把 CPU 的使用权移交给下一个同等优先级的任务,直到下一个优先级执行完一个时间片,再到下一个…如此反复,直到次优先级完全对CPU使用权进行释放。
在这里插入图片描述

在小型的嵌入式 RTOS 中,最常用的的时间片调度算法就是 Round-robin 调度算法(即循环调度算法)。这种调度算法可以用于抢占式或者合作式的多任务中。另外,时间片调度适合用于不太要求任务实时响应的情况。

实现 Round-robin 调度算法需要给同优先级的任务分配一个专门的列表,用于记录当前就绪的任务,并为每个任务分配一个时间片(也就是需要运行的时间长度,时间片用完了就进行任务切换)。

在 FreeRTOS 操作系统中只有同优先级任务才会使用时间片调度,另外还需要用户在FreeRTOSConfig.h 文件中使能宏定义:

#define configUSE_TIME_SLICING 1

默认情况下,此宏定义已经在 FreeRTOS.h 文件里面使能了,用户可以不用在 FreeRTOSConfig.h 文件中再单独使能。

在这里插入图片描述

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容