您的位置:控制工程论坛网论坛 » 嵌入式系统 » 如何节省ROM空间

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

如何节省ROM空间

xilinxue  发表于 2009/6/28 23:41:25      1067 查看 2 回复  [上一主题]  [下一主题]

手机阅读

偶啊,也做了一回葛朗台,不过为此我觉得荣幸之至,要问为何,还是慢慢往下看吧
觉得不错的话,点左上角帮忙顶下噢,谢谢。
通常我们在做串口打印函数时,会通过库函数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了吧。
1楼 0 0 回复
  • xilinxue

    xilinxue   |   当前状态:在线

    总积分:16186  2024年可用积分:0

    注册时间: 2008-06-26

    最后登录时间: 2020-03-22

    空间 发短消息加为好友

    xilinxue   发表于 2009/1/14 18:31:13

      大家可以把你们的一些心得也发出来,大家一起交流下。。
    2楼 回复本楼

    引用 xilinxue 2009/1/14 18:31:13 发表于2楼的内容

  • jhlu3

    jhlu3   |   当前状态:离线

    总积分:0  2024年可用积分:0

    注册时间: 0001-01-01

    最后登录时间: 0001-01-01

    空间 发短消息加为好友

    jhlu3   发表于 2009/6/28 23:41:25

    ico
    3楼 回复本楼

    引用 jhlu3 2009/6/28 23:41:25 发表于3楼的内容

总共 , 当前 /