walnutcy

printf到底占用多少代码空间? ---如何节省ROM空间(原创)

0
阅读(3190)
偶啊,也做了一回葛朗台,不过为此我觉得荣幸之至,要问为何,还是慢慢往下看吧。
觉得不错的话,点左上角帮忙顶下噢,谢谢。
通常我们在做串口打印函数时,会通过库函数vsprintf来实现,代码如下:
#include <stdarg.h>
#ifdef    __SDT_COMPILER
typedef char *__va_list[1];
#else
typedef int *__va_list[1];
#endif
extern int vsprintf(char*  const char* , __va_list );
char uarttxBuf[500];
int DbgPrintf (const char* fmt,...)
{
    va_list args;
    char* p;
    int i = 0;
    va_start(args, fmt);
    i=vsprintf(uarttxBuf,fmt,args);
    va_end(args);
    p = uarttxBuf;
    MCU_REG_RW_UINT1 &= ~BIT18;
    while (*p)
    {
        UartSend(CONSOLE_UART, *p++);
    }   
    return 0;
}
这样代码简便,且出错较少,但缺点是占用RAM,ROM空间太多。且若库函数有些问题的话,便麻烦大了,这次尝试去把printf换成源码,便是由于在打印浮点数时遇到了点问题,出来的始终是错的。(ADS环境下,不知道兄弟们使用的如何?)
于是找了份printf的源码(在哪找?当然是编译器了,有的编译器是带了这个源码的),并想办法移植过去,我的移植完了就成了下边这个样子,代码如下:
int DbgPrintf (const char* fmt,...)
{
    va_list args;
    va_start(args, fmt);
    vprintf(fmt,args);
    va_end(args);
    return 0;
}
代码好看多了,编译出来的代码也少了一些,少了多少?(整整2K的BIN空间)。
满足了吗?如果空间够了可以不往下看了,毕竟下边的处理也是有条件的嘛。
这里源代码拷过来后,主要是处理函数_out,我的更改后如下:
static void _out(char c)
{
//  pbuf.outc(c);
  UartSend(CONSOLE_UART, c);   
  ++pbuf.i;
}
如果我一直没用用浮点数打印,我的vprintf为什么要处理呢? 基于这一想法,我又行动起来了,在移植的vprintf代码中,一般会有一个类似于 LIBDEF_PRINTF_FLOATING 的宏,默认一般是1,即支持打印浮点数,我这里没用,当然得学学葛朗台喽,一毛不拔,设置如下:
#define LIBDEF_PRINTF_FLOATING  0  // walter 20080829 09:55
重编译,看到了什么??
快说呀!
我的代码可是从14904 bytes变为6848 bytes,8K的空间啊!!!
加上前边的2K,我们就又多了10K的空间。
我的目的达到了,你的呢? 经过上述的小手术,想必也OK了吧。