编个平衡小车程序却发现hex文件足足128KB,这真让人摸不着头脑,毕竟STM32F103C8T6的芯片flash才64KB啊。为了解开这个“容量迷思”,咱们直接看Keil的编译报告。在Keil编译完的界面上,红线框里的四组数字藏着程序的真相: 首先是Code,这是要执行的机器码,所有函数都在这里面。接着是RO-data,也就是只读数据,全局常量和字符串都归它管。然后是RW-data,存放已初始化的读写变量。最后是ZI-data,负责记录那些定义了但没赋初值的静态局部变量和全局变量。 把这四个数据块加起来看看:39546加上5862再加上12428,总共大约是56.48KB。这跟烧录软件显示的128KB相差这么大,问题就出在Windows资源管理器或者Keil进度条显示的是完整镜像的大小。这个128KB的文件里包含了真正写入flash的Code、RO-data、RW-data,还夹杂着调试信息、符号表、段描述符这些辅助信息,甚至还有编译器自动插入的填充字节(Padding)。 所以啊,单片机实际执行的只有可执行部分。你看这56.48KB的可执行代码完完全全可以塞进64KB的flash里。烧录软件看到的128KB其实只是镜像的总大小,并不是真正写入的空间。 如果遇到功能复杂空间不够的情况该怎么办?简单点的话可以用压缩算法把RO段缩到最小,或者把大数组拆成几段按需加载。还能把能放到RAM里的数据就放到RAM中去利用64KB的RAM做缓存。要是这些都不管用,那就换个芯片吧。STM32F1系列里还有128KB、256KB甚至512KB flash的型号呢。 最后总结一下:遇到hex文件远大于flash容量的情况别慌。先把编译报告里的Code、RO-data、RW-data加起来算实写大小;再看看烧录进度条确认哪些是辅助信息;最后对照芯片手册看看剩余空间够不够装下这些实写内容。掌握这三步就不怕容量焦虑了!