ARM GCC编译器“越野车”转换

时间:2018-08-21 16:37:54

标签: gcc memory compiler-construction unsigned stm32f0

问题

我正在对STM32F051的闪存进行优化。结果表明,floatint类型之间的转换会消耗大量闪存。

深入研究发现,转换为int大约需要200字节的闪存;而到unsigned int的转换大约需要 1500 个字节!

众所周知,intunsigned int的区别仅在于对“符号”位的解释,因此这种行为对我来说是一个很大的谜。

注意:执行两阶段转换float-> int-> unsigned int也仅消耗大约200个字节。

问题

分析,我有这样的问题:

1)floatunsigned int转换的机制是什么。为什么同时转换float-> int-> unsigned int仅占用很少的内存,为什么要占用这么多的内存空间?也许它符合IEEE 754标准?

2)使用转换float-> int-> unsigned int而不是直接float-> int时是否会出现任何问题? ?

3)是否有任何方法可以包装float-> unsigned int转换,从而保持较低的内存占用?

注意:此处已经问过一个熟悉的问题(Trying to understand how the casting/conversion is done by compiler,e.g., when cast from float to int),但是仍然没有明确的答案,我的问题是关于内存使用情况。


技术数据

  • 编译器: ARM-NONE-EABI-GCC (gcc版本4.9.3 20141119(发行版))
  • MCU: STM32F051
  • MCU的核心: 32位ARM CORTEX-M0

代码示例

  1. float-> int(约200字节闪存)

    int main() {
    volatile float f;
    volatile int i;
    i = f;
    return 0;
    }
    
  2. float-> unsigned int(〜1500字节的闪存!)

    int main() {
    volatile float f;
    volatile unsigned int ui;
    ui = f;
    return 0;
    }
    
  3. float-> int-> unsigned int(约200字节闪存)

    int main() {
    volatile float f;
    volatile int i;
    volatile unsigned int ui;
    i = f;    
    ui = i;
    return 0;
    }
    

1 个答案:

答案 0 :(得分:1)

从根本上讲,从floatunsigned int的转换不应大于从floatsigned int的转换,实际上floatunsigned intfloat的转换可以更小。

我使用GNU Arm嵌入式工具链(版本7-2018-q2)和 据我所见,大小问题是由于gcc运行时库中的缺陷引起的。由于某种原因,该库未为Arm V6m提供__aeabi_f2uiz函数的专用版本,而是使用了更大的常规版本。