第一章 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 编程参考书籍

### FreeRTOS 教程 第一章 内容 #### 1. 创建任务 FreeRTOS 是一种轻量级的操作系统内核,专为微控制器设计。在第一章中介绍了如何创建任务以及初始化必要的组件来启动调度器。 当调用 `xTaskCreate` 函数时会传入一个指向任务入口函数的指针、任务名称字符串、堆栈大小以及其他参数[^3]。一旦成功创建了一个新任务,则该任务会被放置于就绪状态列表里等待被CPU执行;然而,在此之前还需要完成一些额外的工作才能真正激活这些已定义好的线程: - **配置定时器 (可选)**:如果应用程序启用了定时功能 (`configUSE_TIMERS`) ,那么除了用户自定义的任务外还会自动建立两个特殊的后台进程——空闲(idle) 和 定时器(timers)。 - **启动调度机制**:通过调用 `vTaskStartScheduler()` 来正式开启多任务环境下的资源分配流程。值得注意的是这一步骤在整个应用生命周期只会发生一次,并且一旦开始便不会结束直到整个系统关闭为止。 ```c // 示例代码展示如何创建并启动第一个任务 void vAFunction( void ) { // 创建一个新的任务... xTaskCreate( prvSetupHardware, /* Task function */ "SETUP", /* String with name of task */ configMINIMAL_STACK_SIZE,/* Stack size in words, not bytes */ NULL, /* Parameter passed into task */ tskIDLE_PRIORITY, /* Priority at which the task is created */ &xHandle ); /* Used to pass out the created task's handle */ // 启动任务调度器 vTaskStartScheduler(); } ``` 在这个过程中,开发者需要注意合理规划各个子模块间的交互逻辑以确保整体架构稳定可靠的同时也能够充分利用有限计算能力达到预期性能指标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值