我为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
有人可以帮我解释一下如何将代码大小减小到最小可能值吗?
答案 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' ;
}
}
请注意,实现不会对最终的小数位进行舍入,而对于负值则完全失败。修复这些问题需要更多代码。