第一章 FreeRTOS简介
从本章开始学习FreeRTOS, FreeRTOS 是一个 RTOS 类的嵌入式实时操作系统。 在学习和使用 FreeRTOS 之前, 需要先了解什么是 FreeRTOS? 为什么选择学习FreeRTOS? 以及FreeRTOS 的特点。
本章分为如下几部分:
1.1 初始 FreeRTOS
1.2 FreeRTOS资料说明
1.1 初识 FreeRTOS
1.1.1 什么是 FreeRTOS?
首先看一下 FreeRTOS 的名字, 可以分为两部分:“Free” 和“RTOS”,“Free” 就是免费的、自由的、 不受约束的意思, “RTOS” 全称是 Real Time Operating System, 中文名是实时操作系统, 要注意的是,RTOS并不是值某一特定的操作系统, 而是指一类操作系统, 例如,µC/OS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类的操作系统。 因此,从FreeRTOS 的名字中就能看出, FreeROTS是一款免费的实时操作系统。
本次学习的FreeRTOS 是众多 RTOS 类操作系统中的一种,FreeRTOS是一款免费开源的实时操作系统内核,专为资源受限的嵌入式微控制器设计。它的核心价值在于,通过多任务管理,让一个处理器能够“同时”处理多个任务,并确保关键任务能够在其截止时间前得到执行,从而满足嵌入式应用的实时性需求。
为了快速抓住核心,下表概括了FreeRTOS的主要特征:
核心特征 | 说明 |
---|---|
硬实时/软实时 | 采用抢占式调度,可满足严格时限(硬实时)或允许偶尔超时(软实时)的应用场景。 |
多任务并发 | 将复杂应用分解为多个独立任务,由调度器管理CPU时间,简化程序结构。 |
丰富的同步机制 | 提供队列、信号量、互斥量、事件组等,安全高效地实现任务间通信与同步。 |
高度可裁剪 | 内核轻量(最小可至约6KB ROM),功能模块可配置,适应不同资源约束的硬件平台。 |
多任务调度 | 支持基于优先级的抢占式调度(高优先级任务立即运行)和时间片轮转调度(同优先级任务轮流运行)。 |
强大的可移植性 | 使用C语言编写,已移植支持40多种处理器架构,包括ARM Cortex-M、RISC-V、ESP32等。 |
图 1.1.1.1 FreeRTOS的主要特征
1.1.2 为什么选择 FreeRTOS?
FreeRTOS 操作系统是一个功能强大的 RTOS 操作系统, 并且能够根据需求进行功能裁剪,以满足各种环境的要求, FreeRTOS 的特点如下图所示:
图 1.1.2.1 FreeRTOS 特点
1.1.3 为什么要学习FreeRTOS?
对于ESP32开发者来说,学习FreeRTOS不是一道选择题,而是一门必修课。这主要是因为ESP32的官方开发框架ESP-IDF构建在FreeRTOS之上。为了让能快速把握全貌,下面这个表格总结了学习FreeRTOS为ESP32开发带来的核心价值。
核心价值 | 说明 |
---|---|
开发模式升级 | 从“裸机”的轮询架构升级为多任务并发的现代编程模型,使程序结构更清晰。 |
硬件潜力释放 | 充分利用ESP32的双核处理器资源,实现真正的并行处理,提升系统效率和响应能力。 |
项目基石 | ESP-IDF及其所有组件和示例都基于FreeRTOS,要使用官方资源就必须掌握它。 |
资源管理专业化 | 提供队列、信号量、互斥锁等机制,能优雅地解决多任务环境下的资源共享和同步问题。 |
表1.1.3.1 学习FreeRTOS为ESP32开发带来的核心价值说明
1.1.3.1 告别“裸机”限制
在传统的“裸机”编程中,所有功能通常都塞在一个大的 while(1)循环里。这会导致一个严重问题:如果某个任务(比如读取传感器)需要等待,整个系统都会被阻塞,其他任务(如更新显示屏)也无法执行。
FreeRTOS通过多任务并发解决这个问题。可以为每个独立的功能(如网络连接、传感器采集、用户界面更新)创建一个独立的任务。每个任务都有自己的运行上下文,操作系统内核(调度器)负责在多个任务之间快速切换,让它们看起来像是在同时运行。这带来了几个显著好处:
- 模块化与团队协作:每个功能模块可以独立开发和测试,代码更易维护和复用;
- 实时性保证:可以为不同任务设置优先级。例如,处理紧急指令的任务可以设为高优先级,确保它能立即抢占低优先级任务(如日志记录)的CPU时间,从而满足实时性要求。
1.1.3.2 发挥双核威力
ESP32是一款功能强大的双核处理器。FreeRTOS的SMP(对称多处理)支持允许将任务精确地分配到指定的CPU核心上运行。
通过使用 xTaskCreatePinnedToCore()这个API,可以实现精细的任务分配。例如,将需要快速响应的Wi-Fi/蓝牙任务绑定到核心0,将复杂的后台数据处理任务绑定到核心1。这样就能真正发挥ESP32的硬件潜力,大幅提升整体处理能力,避免单个核心忙死而另一个核心闲置的情况。
1.1.3.3 使用官方生态的前提
乐鑫为ESP32提供的ESP-IDF开发框架,其内核就是FreeRTOS。这意味着:
- 官方示例基于FreeRTOS:几乎所有ESP-IDF的示例代码都是通过创建FreeRTOS任务来组织的;
- 系统组件依赖FreeRTOS:Wi-Fi、蓝牙、文件系统等高级功能,其底层驱动和事件处理都依赖于FreeRTOS的任务调度和通信机制。
因此,不学习FreeRTOS,就很难深入理解和灵活运用ESP-IDF提供的强大功能。
1.1.3.4 优雅处理多任务协作
当多个任务需要访问同一资源(如全局变量、串口)时,如果没有保护机制,会导致数据混乱。FreeRTOS提供了一整套成熟的同步与互斥机制来优雅地解决这些问题:
- 队列:任务间安全传递数据的管道,实现解耦;
- 信号量和互斥锁:互斥锁带有优先级继承机制,能有效防止优先级反转问题,安全地保护共享资源;
- 事件组:允许任务等待多个事件中的一件或多件发生后才继续执行。
1.1.3.5 如何开始学习
- 搭建环境:按照ESP-IDF官方文档安装开发环境;
- 理解核心概念:重点理解任务、状态(运行、就绪、阻塞、挂起)、优先级调度和上述的通信机制;
- 从示例入手:从最简单的“hello_world”任务创建示例开始,编译、烧录、观察串口日志,体会任务的创建、延时和删除;
- 逐步实践:尝试创建多个不同优先级的任务,观察调度行为;然后使用队列在任务间传递数据;最后在共享资源访问中引入互斥锁。
1.2 FreeRTOS资料说明
获取FreeRTOS最权威、最实时的资料,FreeRTOS官网是最好的地方,FreeRTOS的官网网址是https://www.freertos.org/,打开后如下图所示:
图 1.2.1.1 FreeRTOS 官网
FreeRTOS 的官网是全英文的,打开后分别是“Download FreeRTOS” 和“FreeRTOS Documentation”, 通过“Download FreeRTOS” 就能够下载到最新发布的 FreeRTOS, 而右侧的“FreeRTOS Documentation” 就是在 FreeRTOS 官网查看在线资料的入口,点击进入“FreeRTOS Documentation” 可以看到FreeRTOS相关介绍。
图 1.2.1.2 FreeRTOS 官网查看在线资料网页
FreeRTOS 官方对相关相关API有详细说明,并且提供了两份 PDF 文档和一份文档配套的源代码, 其中一份PDF是FreeRTOS的教程指南, 另一份PDF是FreeRTOS的参考手。后续会参开着两份手册进行编程, 如下图所示:
图 1.2.1.3 FreeRTOS 编程参考书籍