FreeRTOS基础知识
RTOS全称real-time operation system即实时操作系统,FreeRTOS是其中的一款,同类的还有嵌入式linux或Ubuntu等
为什么要学习RTOS
相较于普通的裸机,是在循环内顺序执行任务,当一个任务没有执行完的时其余任务只能等待,即使是使用中断来应对突发的任务能调度的资源也十分有限
而RTOS很好的解决了这个问题,通过任务调度,很大程度上的解决了MCU资源使用浪费的问题,主要优势是实时性和任务执行的高效率
这里引入一个例子:
假如在煎牛排的同时要煮意面,如果一直看着牛排意面就会煮过头,反之牛排就会煎焦,这就像裸机的任务执行环境,实时性非常差。
那有没有办法可以同时兼顾牛排与意面呢?答案是RTOS就可以,只要先设定好煎牛排和煮意面这两个任务,每隔一段时间切换一下。这就是接入了RTOS以后在做的事情,不会因为一直盯着一方而另一方煮过头。
FreeRTOS基本知识
任务调度器
调度器就是使用相关的调度算法来决定当前需要执行的哪个任务
FreeRTOS一共支持三种任务调度方式:
- 抢占式调度
主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务,在FreeRTOS中任务设置的数值越大,优先级越高
总结:- 高优先级任务,优先执行
- 高优先级任务不停止,低优先级任务无法执行
- 被抢占的任务将会进入就绪态
- 时间片调度
主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一个时钟节拍到的时候切换任务
同等优先级任务轮流的享有相同的CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick终端周期
总结:- 同等优先级任务,轮流执行;时间片流转
- 一个时间片大小,取决为滴答定时器中断周期
- 注意没有用完的时间片不会再使用,下次任务得到执行还是按照一个时间片的时钟节拍运行
- 协程式调度(已很少使用)
当前执行的任务将会一直运行,同时高优先级任务不会抢占低优先级任务
另一个例子:
当你在打游戏的时候回复不了女朋友信息,但在回信息的时候游戏又在挂机,FreeRTOS的作用就是让你能同时兼顾打游戏和回信息,在极短的时间内来回切换,比如打游戏1ms,回信息1ms来回进行,这样在宏观的视角下,既没有挂机也没有很久不回信息,可以说是像一个影分身一样同时进行。
但当遇到肚子疼时要去医院,此时去医院的优先级就要高于打游戏和回信息,所以不管打游戏和回信息有多重要,都会优先去医院,这两件事就都先不处理。
但是在去医院的路上并不是瞬移,在车上又无事可做,相当于有一个延时delay,所以又可以开始打游戏和回消息,这就是FreeRTOS怎么处理高低优先级的任务。
任务状态
FreeRTOS中任务共存在四种状态
- 运行态: 正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态
- 就绪态: 如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态
- 阻塞态: 如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态
- 挂起态: 类似暂停,调用函数
vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态
![[Pasted image 20260511172445.png|544]]
这四种状态中,除了运行态,其他三种任务状态的的任务都有其对应的任务列表(类似链表)
- 就绪列表:
pxReadyTasksLists[x],其中x代表任务优先级数值 - 阻塞列表:
pxDelayedTaskList - 挂起列表:
xSuspendedTaskList
调度器总是在所有处于就序列表的任务中,选取具有最高优先级的任务执行
如果优先级相同的话,会连接在同一个就序列表上,根据时间片来轮流执行



