在使用430G2231的时候发现使用printf函数时会大大增加编译后生成的代码量,注意,我的printf是将putchar改成5110液晶的显示一个字符的函数后的printf,而不是在调试时从console里输出信息的printf。
猜测原因应该是使用printf的话就会调用sprintf函数,必然需要大量代码实现,因此导致代码段不够用(G2231只有2k flash)。
然后我使用keil编译了如下程序
#include <REGX51.H>
#include <math.h>
void main()
{
int a;
a=sin(2.1);
}
将sin函数注释掉和不注释掉的区别如下:
注释掉:Program Size: data=9.0 xdata=0 code=16
不注释掉:Program Size: data=15.1 xdata=0 code=1384
可见sin函数在keil里使用了6.1个ram和1272个rom
再回到IAR编译器里来:
我将一段程序编译,其中用到printf函数的编译结果如下:
6 116 bytes of CODE memory
82 bytes of DATA memory (+ 18 absolute )
585 bytes of CONST memory
用到sin函数的编译结果如下:
2 946 bytes of CODE memory
84 bytes of DATA memory (+ 18 absolute )
552 bytes of CONST memory
什么都没用的:
498 bytes of CODE memory
82 bytes of DATA memory (+ 18 absolute )
552 bytes of CONST memory
可见IAR使用这些标准库里的函数跟CCS消耗的ram和rom量是不一样的
在之前的使用中,2553在IAR中是可以使用sin函数的,而在CCS中则不可以,下面这段测试程序
#include "msp430g2553.h"
#include "math.h"
void main(void) {
volatile int a;//必须用volatile,不然看不到效果的,会被优化掉
a=sin(1.2);
}
报错如下:
"../lnk_msp430g2553.cmd", line 56: error #10099-D: program will not fit into
available memory. run placement with alignment fails for section ".bss"
size 0x304 . Available memory ranges:
RAM size: 0x200 unused: 0x90 max hole: 0x90
error #10010: errors encountered during linking; "justlookwhathappen.out" not
built
.bss段是用来放置未初始化变量的,查看lnk_msp430g2553.cmd", line 56: 其分配在ram区域。
初步得出结论是因为sin函数需要大量ram,是ram不够大导致,既然如此,我就换个大单片机来试试。
继续论证:
将型号换成430f5638
编译一个没有sin函数的程序,打开工程目录Debug目录下的.map文件,里面是编译后的所有地址分配信息,注意查看生成时间,是不是你刚刚生成的。
Linked Sat Dec 08 20:32:57 2012
结果如下:
------------------------------length
.bss 0 00002400 00000010 UNINITIALIZED
然后加入sin函数:
.bss 0 00002400 00000390 UNINITIALIZED
可见猜测正确。
因此可得出结论,CCS里的sin函数使用了大量的未初始化变量(约912Byte),g系列的单片机没一个受得了。。。
而IAR则消耗较多的ram,一般的单片机flash都挺大的,所以,还是IAR好用。。 |