RTOS学习笔记,主要参考正点原子教程
FreeRTOS特点
- 实现多个任务功能划分
- 延时函数实现任务调度
- 高优先级抢占低优先级
- 每个任务都有自己的栈空间
注意:
中断可以打断任意任务
任务可以同等优先级
任务调度方式
任务调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。
- 抢占式调度(不同优先级抢占时间)
- 时间片调度(同优先级轮流享有相同的CPU时间)
- 协程调度(当前任务一直进行,高优先级不抢占低优先级,不维护了)
抢占式调度
运行过程如下:
- 首先Task1在运行中,在这个过程中Task2就绪了,在抢占式调度器的作用下,Task2会抢占Task1的运行。
- Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行。
- Task3运行过程中,Task3阻塞了(系统延时或者等待信号等),此时就绪中,优先级最高的任务Task2执行。
- Task3阻塞解除了(延时到了或者接收到信号量),此时Task3恢复到就绪态中,抢占Task2的运行。
总结和注意:
- 高优先级任务,优先执行。
- 高优先级任务不停止,低优先级任务无法执行。
- 被抢占的任务将会进去就绪态。
数值越大,优先级越高
时间片调度
一个时间片等于一个SysTick周期
- 首先Task1运行完一个时间片后,切换至Task2运行。
- Task2运行完一个时间片后,切换至Task3运行。
- Task3运行过程中(还不到一个时间片),Task3阻塞了(系统延时或者等待信号量等),此时直接切换到下一个任务Task1执行。
- Task1运行完一个时间片后,切换至Task2运行。
总结和注意:
- 同等优先级任务,轮流执行。
- 一个时间片大小,取决滴答定时器中断周期。
- 没有用完的时间片不会再使用,任务Task3下次得到执行时间还是按照一个时间片的时钟节拍运行。
任务状态
状态转换
- 运行态 :正在执行的任务,该任务就处于运行状态。注意:在STM32中,同一时间仅一个任务处于运行态。
- 就绪态 :如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态,等待更高优先级结束运行态。
- 阻塞态 :如果一个任务因为延时或者等待外部事件发生,那么这个任务就处于阻塞态。
- 挂起态 :类似于暂停,调用函数vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。
注意和总结:
- 只有就绪态才可以直接进入运行态
- 其他任务想要进入运行态,首先要进入就绪态
- 除了运行态,其他三种任务状态的任务都有其对应的任务状态列表
任务列表
就绪列表 : pxReadyTasksLists[x],其中x代表人物优先级数值。
阻塞列表 :pxDelayedTaskList
挂起列表 :xSuspendedTaskList
注意:
- 调度器总是在所有处于就绪列表中的任务中,选择具有最高优先级的任务执行
- 相同优先级的任务会链接在同一个就绪列表中