一、编译成功的标志:size 汇总
make 输出的最后一行是 size 汇总,看到它就代表编译、链接全部通过:
text data bss dec hex filename
4736 12 1644 6392 18f8 build/uart.elf
三个关键数的读法:
| 字段 | 含义 | 占用 |
|---|---|---|
| text | 代码 + 常量 | 占 Flash |
| data | 已初始化变量 | 占 Flash,启动时拷进 SRAM |
| bss | 清零变量 | 只占 SRAM |
这三个数就是程序对 512KB Flash / 64KB SRAM 的占用量。
二、elf / hex / bin / map:一次编译全出
CubeMX Makefile 的 all 目标是 elf + hex + bin 三件套一起出,编译完去 uart/build/ 目录就能看到(连同 map 共四样):
| 文件 | 是什么 | 谁用它 |
|---|---|---|
| uart.elf | 带调试符号的完整档案 | gdb(F5 调试、flash-remote.sh 烧录都吃这个) |
| uart.hex | Intel HEX 文本格式,带地址信息 | FlyMcu 等串口烧录工具 |
| uart.bin | 裸二进制镜像 | 部分烧录器 / OTA |
| uart.map | 每个符号放在哪个地址的地图 | 查内存布局 |
三、调试:F5 全流程
先编译,再调试
Ctrl+Shift+B 编译。云端 launch.json 没配 preLaunchTask,F5 不会自动编译——改了代码直接 F5、现象没变,99% 是忘了编译(烧的还是旧 elf)。
启动与自动流程
- F5 → 第一次会让你选调试配置,选 Remote openocd (frp)(之后记住选择不再问)
- 自动流程:连隧道 → 复位 → 烧录 → 停在 main 入口
常用操作
| 操作 | 方式 |
|---|---|
| 断点 | 点行号左侧出现红点;F9 切换 |
| 继续 | F5 |
| 单步跳过 | F10 |
| 单步进入 | F11 |
| 跳出 | Shift+F11 |
| 结束调试 | Shift+F5(干净退出,释放 openocd 连接) |
左侧三个面板:
- VARIABLES — 局部/全局变量实时值
- WATCH — 右键变量 → Add to Watch
- CALL STACK — 调用堆栈
DEBUG CONSOLE 里可以直接输表达式读寄存器,比如看 GPIOA 输出寄存器:
p/x *(volatile unsigned int*)0x4001080C
外设寄存器图形面板(CORTEX PERIPHERALS)目前 launch.json 还没配 svdFile,可能为空——用控制台表达式读完全够用,想图形化加一行配置即可。
两个正常现象
- 断点暂停 = 芯片被 halt,串口停发 abc;F5 继续后恢复
- 调试会话独占 openocd——F5 期间跑
flash-remote.sh会连不上,先 Shift+F5 退出