【发布时间】:2020-07-12 11:14:12
【问题描述】:
我目前正在从事一个项目,该项目包括在 stm-8 微控制器上使用 linux 中的 SDCC 编译器进行裸机编程。芯片中的内存非常低,所以我试图保持精简。我已经使用了 8 位和 16 位变量,一切都很顺利。但最近我遇到了一个问题,我真的需要一个浮点变量。因此,我编写了一个函数,该函数将 16 位值转换为浮点数,执行我需要的数学运算并返回一个 8 位数字。这导致我在 MCU 上的最终编译代码从 1198 字节变为 3462 字节。现在我明白了使用浮点是内存密集型的,并且可能需要调用许多函数来处理浮点数的使用,但是将程序的大小增加这么多似乎很疯狂。我需要一些帮助来理解为什么会这样以及到底发生了什么。
规格:MCU stm8151f2 编译器:带有 --opt_code_size 选项的 SDCC
int roundNo(uint16_t bit_input)
{
float num = (((float)bit_input) - ADC_MIN)/124.0;
return num < 0 ? num - 0.5 : num + 0.5;
}
【问题讨论】:
-
@supercat 输入的数字是无符号的,但这就是我删除评论的原因。但是,在进行减法之后,仍然可以使用类似的方法。如果
(bit_input - ADC_MIN)是>= 0,则可以通过(bit_input - ADC_MIN + 62) / 124;进行舍入。这有效地添加了一半(62 / 124)在除法之前,在负数时使用类似的操作。 -
@EugeneSh。我发现它是默认生成的地图,里面有很多很好的信息。我想这只是一件正常的事情吗?当您进行浮点运算时,它会带来很多负担吗?虽然我仍然认为超过 2K 的行李很多。
-
是的,那种包袱很正常。
-
与其问为什么 FP 如此耗费资源,不如问一下如何在不需要 FP 的情况下实现该功能不是更有用吗?完全没有必要在浮点中实现这个相当微不足道的功能。
-
我同意 Clifford 的观点:不使用浮点运算更容易编写代码。例如,使用小数类型(即几个整数)和小数运算通常比使用浮点数(在没有 FPU 的 CPU 上)更快、更轻量级。