本专栏将对FreeRTOS进行快速讲解,带你了解并使用FreeRTOS的各部分内容。适用于快速了解FreeRTOS并进行开发、突击面试、对新手小白非常友好。期待您的后续关注和订阅!
目录
FreeRTOS基础知识
1.1 调度方式
调度的意思为:调度器就是使用相关的调度算法来决定当前需要执行的任务。 FreeRTOS共计有三种调度方式,其主要被使用的为抢占式调度和时间片调度,详情如下所示。
- 抢占式调度:这种调度方式主要针对优先级不同的任务。每个任务都有一个优先级,高优先级的任务可以中断并抢占低优先级的任务。
- 时间片调度:这种方式主要用于优先级相同的任务。当多个任务具有相同的优先级时,任务调度器会在每次系统时钟节拍到达时切换任务。
- 协程式调度(官方不再更新,后续不再进行解释):当前执行的任务会持续运行,即使有高优先级的任务也不会中断和抢占低优先级任务。
1.1.1 抢占式调度
占式调度依赖任务的抢占优先级别,在FreeRTOS中抢占优先级数值越大,任务优先级越高。举例目前有三个任务需要运行:Task1、Task2、Task3。
Task1优先级为:1
Task2优先级为:2
Task3优先级为:3
运行过程如下所示:
1.当Task1在运行时,若Task2变为就绪状态,抢占式调度器将使Task2抢占Task1的运行;
2.当Task2在运行时,若Task3变为就绪状态,抢占式调度器将使Task3抢占Task2的运行;
3.当Task3在运行时,若Task3因系统延时或等待信号量等原因进入阻塞状态,系统将选择就绪态中优先级最高的Task2来执行;
4.当Task3的阻塞状态解除(如延时结束或接收到信号量),Task3将恢复到就绪状态,并抢占Task2的运行。
总结
对于抢占式优先级,我们只需要记住以下三点:
- 运行过程中,高优先级任务先执;
- 若是高优先级任务没有进入阻塞或者停止,低优先级任务将无法进行运行;
- 若任务被抢占后,就会直接进入就绪状态(下文介绍)。
1.1.2 时间片调度
时间片调度主要是用来应对同等优先级任务运行的情况。同等优先级任务它们轮流享有相同的运行时间(时间片),在该系统中一个时间片就相当于系统抵达定时器的一个中断周期。
同样举例来说:Task4、Task5、Task6的优先级为相同的三个任务。
运行过程如下所示:
1.Task4运行完一个时间片之后,将会切换到Task5进行运行;
2.Task5运行完一个时间片之后,将会切换到Task6进行运行;
3.Task6运行完一个时间片之后,将会切换到Task4进行运行;
4.最终按照此顺序进行运行。
总结
对于抢占式优先级,我们只需要记住以下三点:
1.具有相同优先级的任务会轮流执行,采用时间片轮转调度;
2.时间片的大小由滴答定时器中断的周期决定;
3.未用完的时间片不会被保留,下次任务执行时仍然按照一个完整的时间片时钟节拍运行。
1.2 任务状态与运行列表
1.2.1任务状态
在FreeRTOS中,任务有四种状态:运行态、就绪态、阻塞态、挂起态。
1.运行态:任务正在被执行时处于运行态。在STM32中,同一时间仅有一个任务处于运行态。
2.就绪态:任务已准备好执行,但尚未被调度运行时处于就绪态。
3.阻塞态:任务因延时或等待外部事件而无法继续执行时处于阻塞态。
4.挂起态:类似于暂停状态。任务通过调用函数vTaskSuspend()进入挂起态,需调用解挂函数vTaskResume()才能返回到就绪态。
系统状态转化图
上图为系统之间状态的转换图。由于运行态的任务只能有一个,运行态只能由就绪态任务进行转换,但进入就绪态的任务可以转换为其他三种状态。需要进行强调的为挂起状态,在将任务采用函数挂起之后,任务无法运行。如果不调用函数将其进入就绪态,其将一直无法运行。
1.2.1 运行列表
运行状态只有一个,而就绪状态、阻塞状态、挂起状态有多个,因此就需要相对的列表。分别为就绪列表、阻塞列表、挂起列表。而调度器总是会处于就绪的列表之中,选择其中优先级最高的任务进行执行。
列表
本专栏将对FreeRTOS进行快速讲解,带你了解并使用FreeRTOS的各部分内容。期待诸君的关注点赞!