一、标准向量表源码
__Vectors DCD __init_msp ; 向量0:栈顶初始地址,占用0x00~0x03 DCD __start ; 向量1:复位程序入口,占用0x04~0x07 SPACE 0x400 ; 偏移0x08起预留整片中断向量空白区汇编指令说明:
DCD:写入 4 字节 32 位常量,专门存放地址;SPACE N:伪指令后数字单位固定为字节,仅占用地址区间,Flash 镜像填充 0,不存放有效代码 / 地址。
二、SPACE 0x400 空间容量计算
- 数值进制换算:十六进制数
0x400换算为十进制数字是 1024; - 结合 SPACE 语法规则:SPACE 后跟数值单位为字节,因此
SPACE 0x400代表预留 1024 字节空间; - 单个异常 / 中断向量固定占 4 字节,1024 ÷ 4 = 256 个向量空位;
- 完整向量容量拆分
- 两行 DCD:占用向量 0、向量 1,共 2 个槽位;
- SPACE 0x400:覆盖向量 2 ~ 向量 257,共 256 个槽位; 整张向量表合计支持 258 路中断 / 异常入口。
- 内存边界划分 0x00~0x07:已定义 SP、复位向量;
- 0x08~0x407:SPACE 预留专属向量区;
- 0x408 之后:才是程序代码段,向量区与代码完全分隔,互不重叠。
三、删除 SPACE 的简要危害
- 任意中断、硬件异常触发时,内核会读取代码或空白 Flash 数值作为跳转地址,直接进入 HardFault 死机;
- 向量表段长度不满足芯片规范,编译告警、烧录校验异常;
- 后续新增中断需要重新计算预留空间,极易因长度不足覆盖代码,出现随机故障。
四、直接使用 SPACE 0x400 的核心优势
虽小容量 MCU 会多出 1KB 空白 Flash,但综合开发收益更高:
- 启动文件通用,同系列芯片无需修改预留长度;
- 无需手动查手册计算向量长度,避免换算出错;
- 添加外设中断只需在 SPACE 前新增一行
DCD xxx_Handler,操作极简; - 1KB 存储开销极低,远低于调试故障、多版本维护的时间成本。
五、极致省 Flash 精简方案(特殊场景)
仅 Flash 容量极度紧张时按需缩减预留空间:
- 查芯片手册得到最大中断号 N;
- 总向量数 = N + 1;
- 需要预留向量数 = 总向量数 − 2;
- SPACE 参数 = 预留向量数 × 4。
示例:最大中断号 100,需预留 99 个向量,99 × 4 = 0x18C,替换为SPACE 0x18C。
六、总结
常规嵌入式项目直接使用SPACE 0x400是最优方案,用极小 Flash 开销换取向量表稳定、通用、易维护;仅存储资源极度受限的极简产品,才按需缩小 SPACE 预留长度。