sprintf代码占用大量空间(嵌入式)

时间:2015-01-05 05:54:43

标签: c embedded printf

我为sprintf编写了以下函数

#include <reg52.h>

char output_arr[7];

void print_to_arr(float val)
{
  int integer, fractional, temp = 0, i, ni = 2;
  float fract;

  integer = (int)val;

  fract = val - (float)integer;
  fract = fract *1000;
  fractional = (int)fract;

  for(i=0; i<=2; i++)
  {
    temp = integer%10;
    integer = integer/10;
    output_arr[ni - i] = temp+48;
  }
  temp = 0;

  output_arr[3] = '.';

  for(i=0; i<=2; i++)
  {
    temp = fractional%10;
    fractional = fractional/10;
    output_arr[(ni+4) - i] = temp+48;
  }
  temp = 0;
}

为此,代码大小为

Program Size: data=36.0 xdata=0 code=1112

有人可以帮我解释一下如何将代码大小减小到最小可能值吗?

1 个答案:

答案 0 :(得分:3)

在没有浮点硬件的设备上执行浮点运算,尤其是8位设备本身会引入大量代码(每个操作必须由函数支持而不是单个指令)。对于受约束的嵌入式目标,大多数stdio实现都可以选择省略浮点支持。

即使没有浮点,在8位目标整数模(%)和除(/)上通常也很昂贵。在这种情况下,8051仅具有8位除法运算,因此对于较大类型,除法是从多个指令合成的。

如果您确实必须具有浮点支持,则以下内容可能对大小产生很小影响。这些变化包括浮点运算的最小化,根除不必要的变量,使用初始化而不是赋值变量初始值,以及去除循环不变ni + 4运算。这些可能没有任何影响,或者它们可能使优化器更容易生成更小的代码 - 它们可能会使事情变得更糟;你必须要做实验。

void print_to_arr(float val)
{
  int integer = (int)val ;
  int fractional = (int)(val * 1000.0f) - (integer * 1000) ;
  int i ;

  for( i = 0; i < 3; i++, integer /= 10 )
  {
    output_arr[2 - i] = integer % 10 + '0' ;
  }

  output_arr[3] = '.';

  for( i = 0; i < 3; i++, fractional /= 10 )
  {
    output_arr[6 - i] = (fractional % 10) + '0' ;
  }
}

请注意,实现不会对最终的小数位进行舍入,而对于负值则完全失败。修复这些问题需要更多代码。

相关问题