原文连接:FreeRTOS基础知识 | Colin Gretzky的博客

RTOS全称real-time operation system即实时操作系统,FreeRTOS是其中的一款,同类的还有嵌入式linux或Ubuntu等

为什么要学习RTOS

相较于普通的裸机,是在循环内顺序执行任务,当一个任务没有执行完的时其余任务只能等待,即使是使用中断来应对突发的任务能调度的资源也十分有限
而RTOS很好的解决了这个问题,通过任务调度,很大程度上的解决了MCU资源使用浪费的问题,主要优势是实时性和任务执行的高效率

这里引入一个例子
假如在煎牛排的同时要煮意面,如果一直看着牛排意面就会煮过头,反之牛排就会煎焦,这就像裸机的任务执行环境,实时性非常差。
那有没有办法可以同时兼顾牛排与意面呢?答案是RTOS就可以,只要先设定好煎牛排和煮意面这两个任务,每隔一段时间切换一下。这就是接入了RTOS以后在做的事情,不会因为一直盯着一方而另一方煮过头。

FreeRTOS基本知识

任务调度器

调度器就是使用相关的调度算法来决定当前需要执行的哪个任务
FreeRTOS一共支持三种任务调度方式:

  • 抢占式调度
    主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务,在FreeRTOS中任务设置的数值越大,优先级越高
    总结:
    1. 高优先级任务,优先执行
    2. 高优先级任务不停止,低优先级任务无法执行
    3. 被抢占的任务将会进入就绪态
  • 时间片调度
    主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一个时钟节拍到的时候切换任务
    同等优先级任务轮流的享有相同的CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick终端周期
    总结:
    1. 同等优先级任务,轮流执行;时间片流转
    2. 一个时间片大小,取决为滴答定时器中断周期
    3. 注意没有用完的时间片不会再使用,下次任务得到执行还是按照一个时间片的时钟节拍运行
  • 协程式调度(已很少使用)
    当前执行的任务将会一直运行,同时高优先级任务不会抢占低优先级任务

另一个例子:
当你在打游戏的时候回复不了女朋友信息,但在回信息的时候游戏又在挂机,FreeRTOS的作用就是让你能同时兼顾打游戏和回信息,在极短的时间内来回切换,比如打游戏1ms,回信息1ms来回进行,这样在宏观的视角下,既没有挂机也没有很久不回信息,可以说是像一个影分身一样同时进行。
但当遇到肚子疼时要去医院,此时去医院的优先级就要高于打游戏和回信息,所以不管打游戏和回信息有多重要,都会优先去医院,这两件事就都先不处理。
但是在去医院的路上并不是瞬移,在车上又无事可做,相当于有一个延时delay,所以又可以开始打游戏和回消息,这就是FreeRTOS怎么处理高低优先级的任务。

任务状态

FreeRTOS中任务共存在四种状态

  1. 运行态: 正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态
  2. 就绪态: 如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态
  3. 阻塞态: 如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态
  4. 挂起态: 类似暂停,调用函数vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态
    544

这四种状态中,除了运行态,其他三种任务状态的的任务都有其对应的任务列表(类似链表)

  • 就绪列表pxReadyTasksLists[x],其中x代表任务优先级数值
  • 阻塞列表:pxDelayedTaskList
  • 挂起列表xSuspendedTaskList
    调度器总是在所有处于就序列表的任务中,选取具有最高优先级的任务执行
    如果优先级相同的话,会连接在同一个就序列表上,根据时间片来轮流执行
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐