📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉 📢:内容若有错误,敬请留言 📝指正!原创文,转载注明出处
文章目录
FPU介绍启用FPU的优势配置步骤开启和关闭FPU的区别1. 指令集差异2. 代码大小差异3. 寄存器使用差异
FPU介绍
在Keil中,“floatingpoint hardware”指的是浮点运算硬件,也就是硬件浮点运算单元(FPU,Floating - Point Unit)。 硬件浮点运算单元是集成在处理器芯片内的专门用于处理浮点运算的硬件电路。与通过软件模拟实现浮点运算不同,硬件FPU能够以更高的速度和效率执行,诸如加法、减法、乘法、除法等浮点运算操作。
启用FPU的优势
项目配置选项 在Keil的项目配置中,通常会有关于“floatingpoint hardware”的相关设置选项。例如,当你使用支持硬件FPU的ARM Cortex - M系列处理器(如Cortex - M4、Cortex - M7等)时,在Keil的工程选项中可以选择是否启用硬件FPU。 ● 启用硬件FPU:选择启用后,编译器会生成能够充分利用硬件FPU的代码,从而提高浮点运算的性能。例如,在进行大量浮点数据处理的应用中,启用硬件FPU可以显著缩短运算时间。 ● 不启用硬件FPU:若不启用,编译器会采用软件模拟的方式来实现浮点运算,这会导致运算速度变慢,但适用于一些对性能要求不高或者硬件不支持FPU的场景。代码生成与优化 ● 当在Keil中启用“floatingpoint hardware”时,编译器会针对硬件FPU进行代码优化。它会生成专门的指令来调用硬件FPU执行浮点运算,这些指令能够充分发挥硬件FPU的并行处理能力和高速运算特性。 ● 相反,如果未启用硬件FPU,编译器会使用一系列的整数运算指令来模拟浮点运算,这不仅会增加代码的执行时间,还可能会占用更多的内存空间。
配置步骤
以下是在Keil中针对支持硬件FPU的ARM Cortex - M处理器启用硬件FPU的一般步骤:
打开Keil项目,右键点击项目名称,选择“Options for Target”。在弹出的对话框中,选择“C/C++”选项卡。在“Target”区域中,找到“Floating point hardware”选项,选择相应的硬件FPU类型(如“Use Floating point hardware”)。点击“OK”保存配置。 通过以上设置,Keil编译器会根据所选的硬件FPU类型生成相应的代码,从而充分利用硬件FPU的性能优势。
开启和关闭FPU的区别
在Keil中开启和未开启FPU(浮点运算单元)硬件,生成的反汇编文件会存在显著区别,下面从指令集、代码大小、性能相关指令等方面为你详细分析:
1. 指令集差异
开启FPU硬件 当在Keil中开启FPU硬件支持时,编译器会生成使用硬件FPU指令集的代码。这些指令专门用于处理浮点运算,具有较高的执行效率。例如,Cortex - M4和Cortex - M7内核支持单精度(VFPv4 - SP)或双精度(VFPv4 - DP)浮点运算指令,常见的硬件FPU指令包括: ● VMOV:用于在浮点寄存器和通用寄存器之间移动数据。 ● VADD.F32:执行单精度浮点加法运算。 ● VMUL.F32:执行单精度浮点乘法运算。 以下是一个简单的C代码示例及其开启FPU硬件后可能对应的反汇编代码:
float add_floats(float a, float b) {
return a + b;
}
开启FPU硬件后,反汇编代码可能包含类似如下的FPU指令:
VMOV S0, R0 ; 将参数a从通用寄存器R0移动到浮点寄存器S0
VMOV S1, R1 ; 将参数b从通用寄存器R1移动到浮点寄存器S1
VADD.F32 S0, S0, S1 ; 执行单精度浮点加法运算
VMOV R0, S0 ; 将结果从浮点寄存器S0移动到通用寄存器R0
BX LR ; 返回
未开启FPU硬件 若未开启FPU硬件,编译器会使用软件模拟的方式来实现浮点运算。此时,反汇编代码中不会出现硬件FPU指令,而是使用一系列的整数运算指令来模拟浮点运算。这些整数运算指令通常需要更多的步骤和周期来完成相同的浮点运算任务,执行效率较低。例如,可能会使用乘法、除法、移位等整数运算来模拟浮点运算的指数和尾数操作。
2. 代码大小差异
开启FPU硬件 由于使用了专门的硬件FPU指令,代码可以更简洁地实现浮点运算,因此生成的反汇编代码通常会相对较小。硬件FPU指令能够直接完成复杂的浮点运算操作,无需使用大量的整数运算指令来模拟。 未开启FPU硬件 软件模拟浮点运算需要使用大量的整数运算指令来实现浮点运算的各个步骤,如指数计算、尾数调整等。这会导致生成的反汇编代码规模增大,占用更多的程序存储空间。
3. 寄存器使用差异
开启FPU硬件 会使用专门的浮点寄存器(如Cortex - M系列中的S0 - S31)来存储和处理浮点数据。反汇编代码中会频繁出现对这些浮点寄存器的操作指令。 未开启FPU硬件 主要使用通用寄存器(如R0 - R15)来模拟浮点运算,通过整数运算指令在通用寄存器之间进行数据处理。