
资源介绍
任务基础(英文版电子书)
本书是针对 ESP32-Arduino 平台的 FreeRTOS 实用指南,专注于多任务处理的基础原理与实践应用。它详细讲解了如何在 ESP32 微控制器上利用 FreeRTOS 实现高效的多任务管理,适合从初学者到进阶开发者的各类用户。
核心章节与主要内容
第 1 章:引言
实时操作系统(RTOS)的需求:解释了在复杂项目中,传统轮询方式的局限性,以及引入 RTOS 通过任务拆分简化复杂应用的优势。
FreeRTOS 工程基础:介绍 FreeRTOS 的设计优势,如队列的优先级管理、互斥锁的优先级继承机制等。
硬件与开发板:聚焦 ESP32 平台,说明其支持 FreeRTOS 的原因(足够的 SRAM、支持抢占式调度等),推荐使用开发板(如带 OLED 的 ESP32 Lolin)及相关硬件注意事项(如 GPIO 的输入输出限制、电压特性)。
FreeRTOS 约定:详解变量名、函数名、宏名的命名规则(如变量前缀表示类型,函数前缀包含返回类型和定义文件),以及头文件的使用。
Arduino 环境设置:指导如何在 Arduino IDE 中配置 ESP32 支持,包括添加开发板 URL、安装相关组件等。
第 2 章:任务
抢占式调度:讲解单核心 MCU 中任务如何通过硬件定时器实现时间片轮转,以及双核心 ESP32 的并行执行能力。
Arduino 启动流程:分析 Arduino 环境中默认任务(loopTask)的创建与执行过程,以及系统启动时的其他后台任务(如定时器服务任务、空闲任务)。
任务创建与管理:
任务创建函数(xTaskCreatePinnedToCore)的参数说明,包括任务函数、名称、栈大小、优先级等。
任务的栈大小设置与栈使用监控(通过 uxTaskGetStackHighWaterMark 函数)。
任务的删除、挂起与恢复操作。
时间片与任务切换(taskYIELD 函数的作用)。
示例程序:通过控制多个 LED 闪烁的示例,展示多任务独立运行的效果,说明任务如何通过参数传递实现代码复用。
第 3 章:队列
队列特性:介绍队列的基本概念,包括到达模式(阻塞、非阻塞)、容量、服务规则(FIFO)等。
队列 API:详解队列的创建(静态与动态)、入队(xQueueSendToBack)、出队(xQueueReceive)、重置、删除等操作。
任务调度与阻塞:说明任务在队列满 / 空时的阻塞行为,以及阻塞超时的设置。
示例应用:
按键消抖任务与 LED 控制任务通过队列通信,展示队列在任务间安全传递数据的作用。
液压机模拟控制,通过队列处理多个按键事件,强调安全相关事件的处理(如队列满时的重置策略)。
第 4 章:定时器
定时器分类:区分 Arduino API 定时器、ESP 硬件定时器与 FreeRTOS 软件定时器。
软件定时器:
定时器回调函数的限制(执行时间短、不可阻塞)。
定时器类型(一次性、自动重载)与状态(休眠、运行)。
定时器的创建、激活、停止等操作。
任务定时器 API:介绍 vTaskDelay、xTaskGetTickCount、xTaskDelayUntil 等函数的使用,对比相对延迟与绝对延迟的差异。
示例:通过 AlertLED 类实现 LED 警报闪烁功能,展示定时器在资源受限场景下的优势(相比多任务更节省内存)。
第 5 章:信号量
信号量类型:
二进制信号量:用于任务同步,如事件通知。
计数信号量:用于资源计数,控制并发访问数量。
示例与问题:
超声波传感器(HC-SR04)的测距任务与同步任务,展示二进制信号量的同步作用。
哲学家就餐问题,说明死锁的产生与预防(通过计数信号量限制并发数量)。
第 6 章:邮箱
问题与解决方案:针对全局变量在多任务中共享的原子性问题,介绍邮箱(队列深度为 1 的队列)的作用。
邮箱操作:创建邮箱(xQueueCreate)、写入(xQueueOverwrite)、读取(xQueuePeek)等操作。
示例:通过读取 I2C 传感器(Si7021 温湿度传感器、HMC5883L 指南针)数据并写入邮箱,展示邮箱在数据共享中的应用。
第 7 章:任务优先级
调度器:vTaskStartScheduler 函数的作用,以及抢占式调度、时间片轮转的原理。
ESP32 任务优先级:优先级范围(0-24),高优先级任务对低优先级任务的抢占规则。
任务状态:就绪、运行、阻塞、挂起状态的转换。
示例:通过三个 "蠕虫" 任务在 OLED 上移动的演示,展示不同优先级对任务执行的影响,以及双核心调度的特性。
第 8 章:互斥锁
互斥原理:与二进制信号量的区别,重点讲解优先级继承机制(防止优先级反转)。
互斥锁操作:创建(xSemaphoreCreateMutex)、获取(xSemaphoreTake)、释放(xSemaphoreGive)。
递归互斥锁:允许同一任务多次获取锁,解决嵌套锁问题。
示例:通过两个 I2C 扩展芯片(PCF8574)控制 LED,展示互斥锁在共享总线资源中的作用。
第 9 章:中断
中断特性:中断服务程序(ISR)的异步性、栈限制、不可阻塞等特点。
ESP32 中断处理:GPIO 中断的配置,ISR 中使用 FreeRTOS API 的限制(需使用 FromISR 后缀的函数)。
示例:频率计数器项目,通过中断计数脉冲,结合队列将数据传递给任务处理,展示中断与任务的协作。
第 10 章:队列集
问题与解决方案:当任务需要等待多个队列事件时,队列集可实现同时阻塞在多个队列上。
队列集操作:创建队列集(xQueueCreateSet)、添加队列(xQueueAddToSet)、等待事件(xQueueSelectFromSet)。
示例:三个按键通过各自队列发送事件,任务通过队列集同时监听所有队列,实现多事件源的处理。
第 11 章:任务事件
任务通知:每个任务内置 32 位事件字,用于轻量级的任务间通知,替代信号量或队列。
通知操作:等待通知(ulTaskNotifyTake、xTaskNotifyWait)、发送通知(xTaskNotifyGive、xTaskNotify)。
示例:多任务通知单个任务、中断通过通知唤醒任务等场景,展示任务通知的高效性。
第 12 章:事件组
事件组特性:32 位(有效 24 位)事件标志,支持多任务等待多个事件组合。
事件组操作:设置事件(xEventGroupSetBits)、等待事件(xEventGroupWaitBits)。
示例:WiFi 就绪事件通知多个服务任务(HTTP 服务器、UDP 广播),展示事件组在多任务同步中的作用。
适用人群
Arduino 用户,希望在 ESP32 上实现多任务处理。
嵌入式开发者,学习 FreeRTOS 在实际项目中的应用。
对 ESP32 硬件与 FreeRTOS 结合感兴趣的爱好者。