gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:11:50 25 4
gpt4 key购买 nike

我为 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

谁能帮我解决如何将代码大小减少到尽可能小的值?

最佳答案

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

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

如果您真的必须支持 float ,那么以下内容可能会对大小产生很小的影响。这些变化包括最小化浮点运算、消除不必要的变量、使用初始化而不是分配变量初始值,以及删除循环不变 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' ;
}
}

请注意,实现不会四舍五入最后的小数位,并且对于负值完全失败。解决这些问题需要更多代码。

关于c - sprintf 代码占用大量空间(嵌入式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27774138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com