第2章:硬件平台准备——选择合适的MCU与开发板,搭建交叉编译环境
好,咱们正式开始动手了。
做RTOS移植,第一步不是写代码,而是选对硬件。我见过太多人一上来就对着STM32F103猛干,结果发现Flash不够、RAM太小,折腾半天连个基础任务都跑不起来。说白了,选硬件就像选房子——地基没打好,后面装修再漂亮也白搭。
2.1 选MCU的核心指标
我个人习惯,选MCU先看三个硬指标:
- Flash容量:至少64KB起步。RTOS内核本身不大,但加上你的应用代码、中间件,很快就吃完了。我建议128KB以上比较稳妥。
- RAM大小:至少16KB。每个任务需要独立的栈空间,任务多了RAM就紧张。你想想看,一个任务栈给512字节,10个任务就是5KB,再加上内核数据结构、中断栈...嗯,16KB其实只是及格线。
- 中断控制器:必须支持嵌套中断。这是RTOS实现任务切换的基础。Cortex-M系列的NVIC就做得很好,这也是为什么市面上大部分RTOS移植都基于ARM Cortex-M。
核心建议:新手入门,首选ARM Cortex-M3/M4内核的MCU。资料多、社区活跃、踩坑了也有人拉你一把。
2.2 我推荐的三款开发板
我在项目中用过不下20种开发板,下面这三款最适合咱们课程:
| 开发板 | MCU型号 | Flash/RAM | 适合理由 |
|---|---|---|---|
| STM32F4 Discovery | STM32F407VGT6 | 1MB / 192KB | 资源充裕,带FPU,调试方便 |
| NUCLEO-F103RB | STM32F103RBT6 | 128KB / 20KB | 经典入门款,价格便宜 |
| GD32F350开发板 | GD32F350G8U6 | 64KB / 8KB | 国产替代,性价比高 |
我个人最推荐STM32F4 Discovery。为什么?因为它的资源足够你折腾,而且板载ST-Link调试器,一根USB线就能搞定下载和调试。我记得第一次用这块板子跑FreeRTOS时,从烧录到看到LED闪烁,只花了15分钟。
2.3 搭建交叉编译环境
好,板子选好了,接下来搭环境。说白了,交叉编译就是在PC上编译出能在MCU上运行的代码。
2.3.1 工具链选择
ARM Cortex-M系列,我推荐用GNU Arm Embedded Toolchain。这是ARM官方维护的免费工具链,稳定可靠。
下载地址:developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain
安装完成后,验证一下:
arm-none-eabi-gcc --version
如果看到版本号输出,说明装好了。我曾经遇到一个学员,装完发现命令找不到,最后发现是环境变量没配——嗯,这种坑我踩过不止一次。
小技巧:Windows用户建议用MSYS2或者WSL,Linux/macOS用户直接装就行。我个人习惯用Ubuntu,包管理直接sudo apt install gcc-arm-none-eabi,省事。
2.3.2 构建工具:Make vs CMake
这里我多说两句。很多新手纠结用Make还是CMake。
- Make:简单直接,适合小项目。写个Makefile,几条规则就能编译。
- CMake:跨平台,适合大型项目。但学习曲线陡一点。
咱们课程里,我选择Make。为什么?因为RTOS移植本身代码量不大,Makefile足够应付。而且Make的语法更直观,你能清楚地看到编译、链接、烧录每一步在干什么。
一个最小化的Makefile示例:
CC = arm-none-eabi-gcc
CFLAGS = -mcpu=cortex-m4 -mthumb -O2 -Wall
LDFLAGS = -T linker.ld -nostartfiles
all: firmware.elf
firmware.elf: main.o startup.o
$(CC) $(LDFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f *.o *.elf
你看,就这么几行。我刚开始学的时候,也是从这种最简单的Makefile起步的。
2.3.3 烧录与调试
编译出.elf文件后,怎么烧到板子上?
我推荐OpenOCD + GDB的组合。OpenOCD负责和调试器通信,GDB负责调试。
烧录命令示例:
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg -c "program firmware.elf verify reset exit"
调试的话,先启动OpenOCD:
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
再开一个终端,启动GDB:
arm-none-eabi-gdb firmware.elf
(gdb) target remote localhost:3333
(gdb) load
(gdb) continue
注意:OpenOCD的配置文件要根据你的调试器和MCU型号选择。ST-Link用interface/stlink.cfg,J-Link用interface/jlink.cfg。我曾经因为选错配置文件,折腾了整整一个下午才发现问题。
2.4 验证环境是否搭建成功
环境搭好了,怎么知道对不对?写个最简单的程序跑一下:
#include "stm32f4xx.h"
void delay(volatile uint32_t count) {
while(count--);
}
int main(void) {
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
GPIOD->MODER |= GPIO_MODER_MODER12_0;
while(1) {
GPIOD->BSRR = GPIO_BSRR_BS_12;
delay(500000);
GPIOD->BSRR = GPIO_BSRR_BR_12;
delay(500000);
}
}
编译、烧录,如果板子上的LED开始闪烁,恭喜你——环境搭建成功了!
我记得第一次点亮LED时,那种成就感真的难以形容。虽然只是让一个灯闪起来,但背后是整个工具链的打通,是交叉编译环境的验证。这一步走稳了,后面移植RTOS内核才有底气。
2.5 避坑指南
最后,分享几个我踩过的坑:
- 链接脚本(Linker Script):一定要确认Flash和RAM的起始地址和大小。STM32F407的Flash从0x08000000开始,RAM从0x20000000开始。写错了程序根本跑不起来。
- 启动文件(Startup File):不要自己手写,直接用厂商提供的。我之前手写过一次,结果中断向量表偏移搞错了,调试了三天才发现。
- 调试器驱动:Windows下ST-Link需要装驱动,Linux下一般免驱。但有些山寨调试器需要手动配置,买的时候注意选正规渠道。
好,硬件平台准备就到这里。下一章,咱们开始分析RTOS内核的源码结构。准备好了吗?