打印

CCS不能用MACH.H函数的一点问题

[复制链接]
4073|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
u880|  楼主 | 2013-5-27 08:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用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好用。。

相关帖子

沙发
u880|  楼主 | 2013-5-27 08:55 | 只看该作者
开始遇到这个问题一直以为是CCS由于是TI拿eclipse改装的编译器,做得不专业,事实证明是我不专业了。。。

使用特权

评论回复
板凳
横刀轩辕| | 2014-3-20 18:24 | 只看该作者
那在CCS中应该怎么使用啊?求解释

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

252

主题

1795

帖子

3

粉丝