Skip to content

00 · FreeRTOS入门与我想说的话

这里不仅记录FreeRTOS知识,也记录我从学生思维走向嵌入式工程思维的过程。

1. 为什么建立这个网站

当下各行各业的竞争都非常激烈,嵌入式行业也不例外。以我现在准大三的认知来看,想要真正进入这个行业,仅仅学会使用单片机、调用外设库和完成几个课程项目是远远不够的,持续学习和长期积累会越来越重要。

因此,我建立这个网站的首要目的,是系统记录自己在嵌入式方向的学习过程,把零散的知识、实验现象、调试经验和项目思考逐渐连接成完整的技术体系。

我认为,目前网上关于嵌入式入门的资料很多,但真正面向进阶和工程实践的优质内容仍然比较分散。这里所说的“进阶嵌入式”,并不只是完成简单的单片机开发、外设驱动或通信协议调用,而是逐渐具备与企业真实需求接轨的能力。

在我目前的理解中,进阶嵌入式至少包括以下几个方面:

  • 调试与故障定位能力
  • 软件架构和代码规范
  • MCU、寄存器、中断和内存等底层能力
  • 硬件接口、电源和信号分析能力
  • 实时系统与并发设计能力
  • 完整嵌入式产品的系统设计能力

“只有学生更懂学生遇到的困难”。因此,我想先把自己的学习过程真实记录下来,包括理解错误、实验失败、调试过程和最终结论。

如果这些内容未来能够帮助到一些和我一样迷茫、想进入嵌入式行业的大学生,那么这个网站就有了额外的价值。同时,它也为我以后分享技术内容、制作课程或从事技术教育保留一种可能。

最后做一个必要说明:我目前只是一名普通大学生,并不是什么嵌入式大佬。网站中的内容可能存在理解不准确或表述错误的地方。如果发现问题,欢迎指正,我也会随着学习深入持续修订。

2. 为什么学习FreeRTOS

嵌入式开发经常面对两个核心约束:

  • 空间约束:有限的Flash、RAM、栈空间和外设资源
  • 时间约束:任务必须在规定时间内完成,并且响应时间应当尽可能可预测

我以前在裸机逻辑调度中使用过“时间片轮询 + 消息队列”的设计方式。这类设计可以完成很多功能,如果架构合理,裸机系统同样可以具备很好的实时性。

但是,随着系统功能增加,裸机工程往往会逐渐面临一些问题:

  • 多个功能之间的执行顺序越来越复杂
  • 某个函数执行时间过长会影响其他功能
  • 不同模块之间容易产生阻塞和耦合
  • 定时、通信、资源共享和异常处理越来越难管理
  • 系统问题难以观察、复现和定位

因此,我希望通过学习FreeRTOS,理解一个实时操作系统内核是如何组织和管理这些问题的。

这里必须明确:实时不等于同时,也不等于单纯追求速度快。

我当前使用的STM32F407VET6是单核MCU。在任意一个时刻,CPU实际只能执行一个任务的指令。FreeRTOS通过任务调度和上下文切换,让多个任务在宏观上表现为并发运行。

所谓实时,更重要的是:

当一个事件发生后,系统能够在可以预测和接受的时间范围内作出响应。

例如,当一个高优先级任务进入就绪状态时,抢占式调度器可以暂停当前低优先级任务,保存它的运行现场,然后让高优先级任务优先执行。等重要任务处理完成后,再恢复之前被暂停的任务。

FreeRTOS并不会让CPU“真正同时执行多个任务”,也不会自动解决所有系统问题。它提供的是一套任务调度、时间管理、通信同步和资源管理机制,帮助开发者更清晰地设计并发系统。

学习FreeRTOS的目标也不能只是会调用几个API。我希望真正理解:

  • 任务为什么存在
  • 调度器如何选择下一个任务
  • TCB和任务栈保存了什么
  • 上下文切换为什么需要PendSV
  • 队列、信号量、互斥锁和任务通知分别解决什么问题
  • 中断、DMA和任务应该如何协作
  • 如何把RTOS机制应用到真实机器人和嵌入式产品中

3. 我目前的基础

  • 使用过STM32、ESP32和GD32
  • 接触过I²C、ADC、RS485、BLE等外设和通信模块
  • 做过一些传感器采集、通信和嵌入式项目
  • 正在补充寄存器、中断、内存和任务调度等底层知识
  • 正在学习嵌入式软件架构和工程化设计
  • 对电机控制、机器人系统和Linux仍在持续学习

4. 当前学习平台

项目配置
MCUSTM32F407VET6
配置工具STM32CubeMX
外设库HAL
开发环境Keil MDK
操作系统FreeRTOS

本阶段固定使用STM32F407VET6学习FreeRTOS原理。GD32F470裸机工程主要作为后续的真实工程迁移训练场,不把它作为RTOS入门平台。

5. 网站内容规划

当前网站以FreeRTOS为第一主线,主要记录以下内容:

  1. FreeRTOS任务、状态和调度器
  2. TCB、任务栈与上下文切换
  3. SysTick、PendSV和SVC
  4. 优先级、抢占和时间片轮转
  5. 队列、信号量、互斥锁和任务通知
  6. 中断、DMA与任务之间的协作
  7. 内存管理与任务栈分析
  8. STM32F407最小验证实验
  9. 调试器中的任务、栈、寄存器和内存观察
  10. 从裸机工程迁移到FreeRTOS的架构实践

每个机制尽量按照下面的顺序学习:

内核原理 → 最小实验 → 调试观察 → 真实工程迁移

后续真正开始学习电机控制、机器人系统、Linux、C++和ROS 2时,再增加相应模块,而不是提前建立一堆没有内容的空栏目。

6. 写给未来的自己

希望一年后的自己,不只是学会了更多API、完成了更多项目,而是真正具备了分析问题、定位故障和设计系统的能力。

希望那时的自己能够清楚解释一段代码为什么这样写,理解它在底层如何运行,也能够判断一个功能应该被设计成任务、普通函数、软件定时器还是服务模块。

现在的学习可能很慢,很多知识也会反复忘记,但只要持续记录、实验、思考和修正,一年后的自己一定会比现在走得更远。

这个网站,就是我为这段成长过程留下的工程记录。

                                                              时间:2026年8月20日 实验室

FreeRTOS 内核与工程实践