嵌入式RTOS就业级项目入门与实战(基于FreeRTOS) | 已完结

1 阅读8分钟

FreeRTOS 特性

  1. 可移植性强:能适配多种硬件平台,从常见的 ARM Cortex-M 系列微控制器,到其他各类架构芯片,均可轻松移植,降低了跨平台开发成本。在智能家居设备开发中,无论是采用 STM32 芯片还是 ESP32 芯片,都能快速将 FreeRTOS 移植到相应平台。
  1. 可裁减:系统可根据项目资源限制,灵活裁剪不必要的功能模块,如任务管理、时间管理、通信机制等,从而在有限的硬件资源下实现高效运行,适用于资源紧张的小型嵌入式系统,像智能手环等可穿戴设备。

( 嵌入式RTOS就业级项目入门与实战(基于FreeRTOS) | 已完结)---“夏のke”---weiranit---.---fun/14693/

  1. 调度策略灵活:支持优先级调度和时间片轮转调度两种主要方式。优先级调度下,高优先级任务优先执行,确保关键任务的实时性;时间片轮转调度则用于处理同等优先级任务,保证各任务公平执行。在同时包含数据采集与紧急报警处理的嵌入式系统中,报警任务可设置高优先级,确保在紧急情况时能及时响应。

(三)FreeRTOS 核心功能模块

  1. 任务管理:任务是 FreeRTOS 中最基本的调度单位。每个任务都有独立的优先级、堆栈空间及任务函数。可通过不同方式创建任务,一种使用动态内存分配,方便快捷;另一种适用于对内存使用严格,需静态分配内存的场景。任务状态包括运行、就绪、阻塞、挂起等,系统根据任务状态及调度策略进行任务切换与调度。在智能交通灯控制系统中,可设置交通灯状态切换任务、车辆检测任务等,每个任务负责特定功能,通过任务管理实现协同工作。
  1. 时间管理:FreeRTOS 提供了精确的时间管理功能,包括系统时钟、任务延时、软件定时器等。任务延时功能可使任务暂停执行指定时间,常用于控制任务执行周期,如控制 LED 灯闪烁频率。软件定时器可设置定时周期及到期执行的回调函数,用于周期性任务或定时触发事件,例如在环境监测系统中,可通过软件定时器定时采集温湿度数据。
  1. 同步与通信机制
  • 信号量:分为二进制信号量和计数信号量。二进制信号量用于任务间同步或资源访问控制,如多个任务竞争使用一个串口资源时,可通过二进制信号量确保同一时刻只有一个任务能使用串口。计数信号量则可用于控制多个资源的访问数量。
  • 队列:用于任务间数据传输,支持不同数据类型,可实现任务间的异步通信。在图像采集与处理系统中,采集任务可将采集到的图像数据通过队列发送给处理任务。
  • 互斥量:专门用于保护共享资源,防止多个任务同时访问导致数据冲突。其具有优先级继承特性,可有效避免优先级反转问题。例如在多个任务同时访问共享内存区域时,互斥量可确保数据一致性。

二、FreeRTOS 项目搭建

(一)开发环境准备

  1. 硬件选择:可选用常见的开发板,如 STM32 系列开发板(如 STM32F4 Discovery)或 ESP32 开发板。STM32 系列凭借丰富的资源、强大的性能及广泛的社区支持,适合各类嵌入式项目开发;ESP32 则以其集成的 Wi-Fi 和蓝牙功能,在物联网项目中应用广泛。
  1. 软件工具
  • 编译器:常见的有 Keil MDK、IAR Embedded Workbench 和 GCC 编译器。Keil MDK 具有友好的开发界面和强大的调试功能,在 STM32 开发中应用普遍;IAR Embedded Workbench 则以其高效的代码生成能力著称;GCC 编译器开源免费,支持多种硬件平台,具有良好的可扩展性。
  • 开发框架:若使用 STM32 开发板,可借助 STM32CubeMX 工具进行初始化配置。它能图形化配置芯片引脚、时钟、外设等参数,并自动生成初始化代码,同时支持 FreeRTOS 中间件添加与配置,大大简化了开发流程。对于 ESP32 开发板,可使用 ESP-IDF 开发框架,它提供了丰富的 API 和工具,方便进行基于 FreeRTOS 的开发。

(二)创建 FreeRTOS 工程

  1. 基于 STM32 开发板
  • 使用 STM32CubeMX 创建工程,选择对应的芯片型号。配置系统时钟、外设(如 GPIO、USART 等)。在中间件选项中选择 FreeRTOS,进行任务堆栈大小、任务优先级等基本参数配置。例如,为控制 LED 闪烁的任务分配合适的堆栈空间,设置优先级。生成工程代码后,在 IDE(如 Keil MDK)中打开工程,即可开始编写应用代码。
  1. 基于 ESP32 开发板
  • 安装 ESP-IDF 开发框架,按照官方文档指引,在 Linux 或 Windows 系统下完成安装过程,配置好开发环境变量。使用 ESP-IDF 提供的项目模板创建 FreeRTOS 工程,在配置文件中设置 FreeRTOS 相关参数,例如,选择基于优先级的抢占式调度策略,配置堆内存大小 。编写应用代码,利用 ESP-IDF 提供的 API 进行任务创建、外设驱动等开发工作,如创建一个连接 Wi-Fi 网络的任务。

三、FreeRTOS 任务管理实战

(一)任务创建与删除

在实际项目中,需根据功能需求创建多个任务。任务创建时,需要确定任务函数、任务名称、堆栈大小、任务参数、优先级等关键要素。不同的任务根据其功能需求,分配相应的资源和优先级。例如,在一个智能家居控制系统中,创建控制灯光的任务,可分配较小的堆栈空间,因为其功能相对简单;而处理复杂传感器数据融合的任务,则需较大堆栈空间和较高优先级。当某个任务完成其使命后,可将其删除,释放占用的系统资源。如在设备完成一次数据升级任务后,删除升级任务,避免资源浪费。

(二)任务优先级调整

在 FreeRTOS 中,可根据任务实时性需求动态调整任务优先级。在同时进行数据采集和数据处理的系统中,当采集到紧急数据时,提升数据处理任务的优先级,确保数据能及时处理,保障系统的高效运行。通过调用相应的 API 函数,即可实现任务优先级的动态调整,提高系统应对不同场景的能力。

(三)任务挂起与恢复

任务挂起可使任务暂时停止执行,不参与调度,直到被恢复。在系统进入低功耗模式时,可挂起非必要任务,降低系统能耗;在合适的时候再将任务恢复,使其继续执行。例如,在智能手表的待机状态下,挂起屏幕刷新任务、数据传输任务等,当用户操作手表时,再恢复这些任务,保证系统的正常交互功能。

四、FreeRTOS 任务同步与通信实战

(一)信号量应用

  1. 二进制信号量实现任务同步:在多任务协作的项目中,常需任务间同步执行。例如,一个任务负责从传感器采集数据,另一个任务负责处理数据。只有当采集任务完成数据采集后,处理任务才能开始工作。此时可使用二进制信号量,采集任务完成数据采集后释放信号量,处理任务在获取到信号量后开始处理数据,从而实现任务间的同步。
  1. 计数信号量控制资源访问数量:假设有多个任务需要访问一个打印机资源,打印机同一时间只能处理有限个任务的打印请求,可使用计数信号量进行控制,确保资源合理分配,避免冲突。例如,将计数信号量初始值设为 3,表示打印机可同时处理 3 个打印任务,当一个任务要使用打印机时,先获取计数信号量,若获取成功则可使用打印机,使用完后释放信号量,供其他任务使用。

(二)队列应用

在数据传输频繁的系统中,队列发挥着重要作用。如在一个视频监控系统中,视频采集任务将采集到的视频帧数据通过队列发送给视频编码任务,编码任务从队列中读取数据进行编码处理,再将编码后的数据通过队列发送给网络传输任务。通过队列,实现了任务间高效、稳定的数据传输,且队列具有数据缓冲功能,可应对任务处理速度不一致的情况。