切换主题
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. 当前学习平台
| 项目 | 配置 |
|---|---|
| MCU | STM32F407VET6 |
| 配置工具 | STM32CubeMX |
| 外设库 | HAL |
| 开发环境 | Keil MDK |
| 操作系统 | FreeRTOS |
本阶段固定使用STM32F407VET6学习FreeRTOS原理。GD32F470裸机工程主要作为后续的真实工程迁移训练场,不把它作为RTOS入门平台。
5. 网站内容规划
当前网站以FreeRTOS为第一主线,主要记录以下内容:
- FreeRTOS任务、状态和调度器
- TCB、任务栈与上下文切换
- SysTick、PendSV和SVC
- 优先级、抢占和时间片轮转
- 队列、信号量、互斥锁和任务通知
- 中断、DMA与任务之间的协作
- 内存管理与任务栈分析
- STM32F407最小验证实验
- 调试器中的任务、栈、寄存器和内存观察
- 从裸机工程迁移到FreeRTOS的架构实践
每个机制尽量按照下面的顺序学习:
内核原理 → 最小实验 → 调试观察 → 真实工程迁移
后续真正开始学习电机控制、机器人系统、Linux、C++和ROS 2时,再增加相应模块,而不是提前建立一堆没有内容的空栏目。
6. 写给未来的自己
希望一年后的自己,不只是学会了更多API、完成了更多项目,而是真正具备了分析问题、定位故障和设计系统的能力。
希望那时的自己能够清楚解释一段代码为什么这样写,理解它在底层如何运行,也能够判断一个功能应该被设计成任务、普通函数、软件定时器还是服务模块。
现在的学习可能很慢,很多知识也会反复忘记,但只要持续记录、实验、思考和修正,一年后的自己一定会比现在走得更远。
这个网站,就是我为这段成长过程留下的工程记录。
时间:2026年8月20日 实验室