• 1
    回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

解决keil中编译代码内存不足问题

今天编译一个程序,

这个是一个FFT的项目,这个单片机的内存是20k,原来编译正常,后来添加了1024个float数组后,出现编译错误

老是出错,截图如下

出现这种情况大多数是因为开辟空间不规范,导致存储区域空间用完,所以在这里提醒大家,开辟变量空间的时候结合实际情况,不要随随便便就开辟一个挺大的空间,浪费;这里呢,解决办法有三种

第一种就是增加RAM或ROM的空间

注意这里是说的增加空间依然是在芯片空间大小范围内(1)点击魔法棒–>点击target;如图,适当增加最下方方框内RAM,ROM大小

第二种是优化,节省下一些空间

点击魔法棒–>点击C++;(优化等级越高,程序优化的就越多)

第三种是优化程序,节省下一些空间

主要是RAM这块,减少全局变量的使用。

简单说下keil编译后的程序占用的rom和ram大小

可以通过 .map 查看占用的 Flash 和 RAM 大小,很明显RAM都大于20K了。

Code 是代码占用的空间大小。

RO-data (Read Only)  :是只读常量的大小,如const型。

RW-data (Read / Write)  :是已初始化(但初始化值不为零)的可读写变量。

ZI-data (Zero Initialize) :未初始化的static变量和全局变量以及堆栈所占的空间。              (keil编译器默认是把你没有初始化的变量都赋值一个0)

RAM 和 ROM 的使用情况RAM = RW-data + ZI-data

ROM(Flash) = Code + RO-data + RW-data

bin文件占用内部Flash的大小程序占用的ROM的字节总数,就是bin文件占用内部Flash的大小。

为什么ROM中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在ROM中的

为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

MCU执行过程MCU执行过程是先将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。

然后将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。

ROM中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。

优化变量后小了3K多字节。

全部回复(1)
正序查看
倒序查看
2022-10-21 10:32

第一种方法不太可取吧,实际硬件RAM和rom没有增加,还是得考虑程序优化

0
回复