FreeRTOS 简介

时间:2024-03-13 12:31:24

FreeRTOS 简介

FreeRTOS 简介
FreeRTOS 是一个嵌入式实时操作系统,什么是实时操作系统呢?

对于一个嵌入式系统,比如说一个数据采集器,他需要不停地采集数据并发送给主机,例如有三个任务,一个是采集任务,一个是发送任务,一个显示任务。正常情况下,应该是先采集再显示并发送,理想中显示和发送是同时进行的。但是我们的MCU在一个时刻只能跑一个任务,也就是说必有个先后关系,我们可以认为定义顺序如下——采集->发送->显示。

那么考虑复杂一点的情况,如果此时发送任务没有等到数据,他就会停在这里等待,然而这就导致了显示任务不能正常进行。这就不能称为实时。这个例子也许还不能完全体现实时系统的重要性,如果我们将场景设定为自动驾驶,我们的控制和感知系统的实时性凸显的尤为重要,一个意外的延迟会造成安全性的极大下降。还有更多的场景,这里就不一一列举了。当然,除了实时性的优点,RTOS也具有较强的扩展性和易用性,方便开发者进行开发。总之,RTOS在很多场景中都是不可或缺的。
FreeRTOS 简介
对于FreeRTOS来说,严格意义上来说还不能称为实时,因为他只是相当于分时复用,比方说我们把一个时间单位设定为1ms,那么我把这1ms可以分为很多的细分,每个细分上跑不同的任务,这样在宏观上看就相当于实时系统了。真正的实时系统,就是实现并行的操作,比如说FPGA,这里不再赘述。常见的RTOS,还有 μCOS\mu COS 、VxWorks等

下图是2019年EETimes统计的最常用的操作系统排名,供大家参考
FreeRTOS 简介

FreeRTOS 架构

FreeRTOS 简介
一个FreeRTOS 系统主要由BSP驱动+内核+组件组成(如上图)。内核包含多任务调度、内存管理、任务间通信的功能,组件包含网络协议、外设支持等。

FreeRTOS内核是可剪裁的,组件也是可选的。由于嵌入式应用往往对内存空间的要求十分苛刻,所以一个可剪裁的RTOS对于嵌入式应用非常重要。这使得FreeRTOS的核心代码只有9000行左右。

FreeRTOS 特性

  • 灵活的任务优先级
  • 灵活轻量级的任务通知机制
  • 队列
  • 二值/计数信号量
  • 互斥/递归互斥量
  • 软定时器
  • 事件组
  • 定时/空闲Hook函数
  • 栈溢出检查
  • 跟踪记录
  • 任务时间统计

FreeRTOS 文件

FreeRTOS核心组件主要有三个文件:list.c,queue.c,tasks.c是必须添加的;可扩展的部分:stream_buffer.c, croutine.c, event_group.c这几个功能用不着可以不加。

下图是FreeRTOS-Kernel的根目录
FreeRTOS 简介

  • queue.c 队列
  • timers.c 软定时器
  • event_group.c 事件组
  • croutine.c 协程,协程大多应用在资源很有限的MCU上,目前已经很少使用了

下图是FreeRTOS的根目录
FreeRTOS 简介
需要注意的是,这两个根目录是不一样的。FreeRTOS的内核文件是在FreeRTOS-Kernel的目录下的。\FreeRTOS\Demo目录下是不同芯片的Demo(如下图)
FreeRTOS 简介
一个完整的工程除了需要.c文件之外,还需要引用头文件
头文件‘task.h’, ‘queue.h’, ‘semphr.h’, ‘timers.h’ ,‘event_groups.h’ 等

另外还需要添加头文件等包含路径
示例:
**

FreeRTOS/Source/include. // 头文件
FreeRTOS/Source/portable/[compiler]/[architecture]. //其他接口
FreeRTOSConfig.h // 配置文件

**
FreeRTOS/Source/portable/[compiler]/[architecture]. 这个路径下可以包含Heap Memory allocation文件,具体请参考官方说明文档