ARM GCC编译器“;童车;转换 问题
我正在使用STM32F051的闪存优化。据透露,ARM GCC编译器“;童车;转换 问题,gcc,memory,compiler-construction,unsigned,stm32f0,Gcc,Memory,Compiler Construction,Unsigned,Stm32f0,我正在使用STM32F051的闪存优化。据透露,float和int类型之间的转换会消耗大量闪存 深入研究后发现,到int的转换需要大约200字节的闪存;而转换为无符号int大约需要1500字节 众所周知,int和unsigned int的区别仅仅在于对“符号”位的解释,因此这种行为对我来说是一个巨大的谜 注意:执行两级转换float->int->无符号int也仅消耗约200字节 问题 分析这一点,我有这样的问题: 1) 将float转换为unsigned int的机制是什么。为什么它需要这么多的
float
和int
类型之间的转换会消耗大量闪存
深入研究后发现,到int
的转换需要大约200字节的闪存;而转换为无符号int
大约需要1500字节
众所周知,int
和unsigned int
的区别仅仅在于对“符号”位的解释,因此这种行为对我来说是一个巨大的谜
注意:执行两级转换float
->int
->无符号int
也仅消耗约200字节
问题
分析这一点,我有这样的问题:
1) 将float
转换为unsigned int
的机制是什么。为什么它需要这么多的内存空间,而在同一时间转换float
->int
->无符号int
占用这么少的内存?也许它与IEEE 754标准有关
2) 当使用转换浮点
->整数
->无符号整数
代替直接的浮点
->整数
时,是否会出现任何问题
3) 是否有任何方法可以包装浮点
->无符号整数
转换以保持较低的内存占用
注意:这里已经提出了熟悉的问题(),但仍然没有明确的答案,我的问题是关于内存使用的
技术数据
- 编译器:ARM-NONE-EABI-GCC(GCC版本4.9.3 20141119(发布))
- MCU:STM32F051
- MCU核心:32位ARM CORTEX-M0
float
->int
(~200字节的闪存)
float
->unsigned int
(~1500字节的闪存)
float
->int
->unsigned int
(~200字节闪存)
从
float
到unsigned int
的转换应该大于从float
到signed int
的转换,这没有根本原因,实际上,float
到unsigned int
的转换可以小于float
到signed int
的转换
我使用GNU Arm嵌入式工具链(版本7-2018-q2)和
据我所知,大小问题是由于gcc运行库中的一个缺陷造成的。出于某种原因,该库没有为Arm V6m提供专门版本的_aeabi_f2uiz函数,而是采用了更大的通用版本 谢谢,这给了我一些线索。注意,我已在禁用优化的情况下进行了所有闪存大小测量。@drkr在我的回答中使用“优化”与编译代码时使用的编译器设置无关,而是与编译器运行库的内容有关。我把答案改为“专业化”。我认为这更正确,更少误导。@drkr即使在这种情况下,答案似乎是一样的,未优化代码的质量也不值得担心,您应该只关心优化代码的质量(大小、性能等等)。
int main() {
volatile float f;
volatile int i;
i = f;
return 0;
}
int main() {
volatile float f;
volatile unsigned int ui;
ui = f;
return 0;
}
int main() {
volatile float f;
volatile int i;
volatile unsigned int ui;
i = f;
ui = i;
return 0;
}