在编程的过程中,遇到了下列问题,从此走上了百度的不归路。百度到的信息很多,但比较乱,整理一下,方便后续查阅。
..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching malloc.o(.bss).产生问题的背景是把一个RCT6上的程序移植到了C8T6上,由于C8T6空间不够产生报错。 到底是什么空间不够后续继续分析。
既然空间不够,首先先查看程序占用了多少空间。 移植后的程序由于无法通过编译,所以先查看移植前的程序。 在编译结果栏里面可以看到。 也可以通过查看map文件 我的路径是…\project\USER\Listings
或者双击工程的跟目录 .map文件的最后显示如下信息
============================================================================== Code (inc. data) RO Data RW Data ZI Data Debug 12520 1378 1028 140 41964 316036 Grand Totals 12520 1378 1028 140 41964 316036 ELF Image Totals 12520 1378 1028 140 0 0 ROM Totals ============================================================================== Total RO Size (Code + RO Data) 13548 ( 13.23kB) Total RW Size (RW Data + ZI Data) 42104 ( 41.12kB) Total ROM Size (Code + RO Data + RW Data) 13688 ( 13.37kB) ==============================================================================数据和上面的编译结果是一致的。
下面对程序占用的空间进行分析。 首先是下面几个名称分别是什么含义。
Code (inc. data) RO Data RW Data ZI Data Debug据网友所言, Code为程序代码部分 RO-data 表示 程序定义的常量const temp; RW-data 表示 已初始化的全局变量 ZI-data 表示 未初始化的全局变量 据网友所说,最后两行分别是RAM和ROM。 下一个问题来了,RCT6和C8T6的RAM和ROM又分别是多少呢? 查看了数据手册。
CPU:STM32F103RCT6,LQFP64,FLASH:256K,SRAM:48K; CPU:STM32F103C8T6,LQFP48,FLASH:64K, SRAM:20K; //FLASH:闪存名称有点对不上。 RAM、ROM、FLASH、SRAM之间有什么关系呢? 根据观察法、排除法和网友言论,SRAM是RAM,FLASH是ROM。
解决问题的最好方法当然是换一块芯片,然而现实往往没有那么简单,确切的说,总是受到限制。 想想办法吧。 C8T6,FLASH:64K,SRAM:20K,而程序RAM42K,ROM13K,ROM是远远满足需要的,问题在于RAM的大小是实际的两倍还多。 下一步的方向是想办法减小RAM的大小。 RAM是由RW Data和ZI Data两部分组成的。相较ZI Data,RW Data可以忽略不计。 下一步分析ZI Data的构成。ZI-data 表示 未初始化的全局变量。 这条路走到了死胡同。
看到了另外一篇文章,stm32程序编译后,rom和ram出奇的大。这篇文章在参考文献有链接。
stm32f103系列,使用里malloc函数,导致编译后,.map文件显示的ram和rom容量增加
巧的是我也用了malloc函数,于是把相关内容改成正常定义。编译结果如下: ZI Data骤降到3880。
一切正常。
关于空间的介绍: 查看stm32程序占用的ROM和RAM 一篇很好的博客:STM32运行程序到底ROM快还是RAM快? 分析内容的博客:基于STM32分析栈、堆、全局区、常量区、代码区、RAM、ROM 解决问题的关键:stm32程序编译后,rom和ram出奇的大