实验教程:FreeRTOS 多任务基础与 GPIO 控制
0. 实验概述
本实验是嵌入式实时操作系统 (RTOS) 的入门必修课。通过构建两个不同优先级的任务,控制两颗 LED 以不同频率闪烁,直观地展示 FreeRTOS 的多任务调度、优先级抢占以及时间管理机制。
💡 学习目标
- 理解 FreeRTOS 中“任务 (Task)“的概念及其与裸机
while(1)的区别。- 掌握使用 STM32CubeMX 配置 FreeRTOS 任务的方法。
- 深入理解
osThreadNew创建任务时各参数的含义。- 学会分析不同优先级任务的调度行为。
1. 预备知识
1.1 什么是 FreeRTOS 任务?
在裸机程序中,我们通常在一个死循环 while(1) 中顺序执行代码。而在 RTOS 中,程序被拆分为多个独立的“任务”。每个任务看起来像是在独占 CPU,但实际上操作系统内核(Scheduler)会根据优先级和时间片快速切换任务,实现宏观上的“并行”。
1.2 硬件基础
- 主控: STM32F407 (Cortex-M4)
- LED 连接:
- LED1 -> PB2 (推挽输出)
- LED2 -> PB8 (推挽输出)
- 时钟: 系统主频 168MHz,SysTick 或 TIM14 提供心跳节拍。
2. 原理解析
2.1 任务优先级与调度
本实验创建了兩個任务:
- Task PB2: 优先级
Normal(较高) - Task PB8: 优先级
Low(较低)
调度规则: FreeRTOS 采用基于优先级的抢占式调度。
- 当高优先级任务就绪时,CPU 会立即执行高优先级任务。
- 只有当高优先级任务进入阻塞状态(如调用
osDelay)时,低优先级任务才有机会运行。 - 在本实验中,两个任务大部分时间都在
osDelay阻塞中,因此它们会交替运行,互不干扰。
2.2 时间延迟 (osDelay)
osDelay(1000):表示任务挂起 1000 个系统节拍(Tick)。- 假设系统节拍频率为 1000Hz (1ms),则延迟时间为 1 秒。
- 关键点:在延迟期间,该任务不占用 CPU 资源,CPU 可以去执行其他就绪的低优先级任务。这是多任务高效运行的核心。
3. 代码深度解析
以下基于 Core/Src/main.c 进行教学拆解。
3.1 任务属性定义
在 main.c 全局变量区,定义了任务的“身份证”