嘉立创筑基派FreeRTOS 点灯demo | Notes / STM32 | 氵工的博客

嘉立创筑基派FreeRTOS 点灯demo

发表于 2026-04-02 22:48 592 字 3 min read

This post is not yet available in English. Showing the original.
嘉立创筑基派FreeRTOS点灯DEMO,使用筑基板自带PB8 LED,板载PB2 LED

实验教程:FreeRTOS 多任务基础与 GPIO 控制

0. 实验概述

本实验是嵌入式实时操作系统 (RTOS) 的入门必修课。通过构建两个不同优先级的任务,控制两颗 LED 以不同频率闪烁,直观地展示 FreeRTOS 的多任务调度优先级抢占以及时间管理机制。

💡 学习目标

  1. 理解 FreeRTOS 中“任务 (Task)“的概念及其与裸机 while(1) 的区别。
  2. 掌握使用 STM32CubeMX 配置 FreeRTOS 任务的方法。
  3. 深入理解 osThreadNew 创建任务时各参数的含义。
  4. 学会分析不同优先级任务的调度行为。

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 全局变量区,定义了任务的“身份证”