单片机开发工具篇:(十三)为什么 keil 点编译 Build Output 的结果和生成的 .map 文件中占 flash 大小不一样?

单片机开发工具篇:(十三)为什么 keil 点编译 Build Output 的结果和生成的 .map 文件中占 flash 大小不一样? 上一篇下一篇在 keil 中添加垂直右边距线为什么 keil 点编译 Build Output 的结果和生成的 .map 文件中占 flash 大小不一样比如我有个 keil 工程点全部编译的结果是Program Size:Code107940RO-data4316RW-data1736ZI-data29128这样算出来占 flash 是 113,992 字节而在编译生成的 .map 文件中显示Total ROMSize(CodeRO DataRW Data)112924(110.28kB)两者竟然不一样这是为什么呢⟶ \longrightarrow⟶是因为ARM 编译器默认对 RW 数据进行了压缩。ARM 工具链armcc / armclang默认会启用 RW 数据压缩以前也叫 “RW compression”。这样 ROM 里存放的初始化数据是压缩后的上电后由启动代码__scatterload解压到 RAM 供程序使用。因此.map给出的Total ROM Size才是真正占用的 Flash 大小而编译窗口的简单加和只是一个参考。如何在 .map 中查看压缩了多少在.map末尾找这几行Grand TotalsELF Image Totals (compressed)或ELF Image TotalsROM TotalsTotal RO SizeTotal ROM Size如果开启了 RW 压缩常见.map会像这样Code(inc.data)RO Data RW Data ZI Data Debug xxxx xxxx xxxx xxxx xxxx xxxx Grand Totals xxxx xxxx xxxx xxxx xxxx xxxx ELF ImageTotals(compressed)xxxx xxxx xxxx xxxx xxxx xxxx ROM Totals这里看第 4 个数值列也就是RW DataGrand Totals里的RW Data RAM 里实际需要的 RW 初值大小未压缩视角ELF Image Totals (compressed)和ROM Totals里的RW Data 实际存进 Flash 的压缩后大小例如