【转载】RISC-V IDE MRS2 代码编译 : 通过配置FPU提升浮点运算性能

发布时间:2026/8/5 9:11:29
【转载】RISC-V IDE MRS2 代码编译 : 通过配置FPU提升浮点运算性能 本文介绍嵌入式中的浮点数与青稞系列芯片的FPU硬件浮点单元并说明如何使用MRS2配置FPU提升浮点性能以及串口打印浮点数。一、单精度浮点数与双精度浮点数嵌入式处理器使用的浮点数遵循 IEEE 754 标准。这套标准规定了一种将实数编码为有限位二进制的方式其核心思想是把一个数分解为三个独立的字段符号位Sign、指数位Exponent和尾数位Mantissa。这三个字段在内存中是紧密排列的。值 (−1)^S × 2^(E − bias) × (1 Mantissa)浮点数一般根据其占用的位宽度分为单精度浮点数float与双精度浮点数double。其在内存中的布局如下所示。单精度float的位布局S符号Exponent指数Mantissa尾数1 位8位 · bias12723位双精度double的位布局S符号Exponent指数Mantissa尾数1 位11位 · bias102352位单精度float占用 4 字节能够提供约 7 位有效十进制数的精度数值范围覆盖 ±3.4×10³⁸。双精度double则占用 8 字节精度提升到约 1516 位范围扩展到 ±1.7×10³⁰⁸。从数学上看double显然更精确但在嵌入式领域精度优势无法弥补它花费的巨大开销优先使用float才是更好的选择。二、浮点数常量嵌入式开发中浮点数有一个非常容易被忽视的细节。C 语言里所有不带后缀的浮点字面量比如0.01、3.14其类型默认是double而不是float 。例如一个简单的浮点计算并赋值的代码float x 3.14 * 2.0;3.14和2.0都没有f后缀所以编译器会把这两个常量都当作double来处理。由于赋值给float变量因此在以double运算后编译器会进行一次截断将64位运算结果截断为32位的float。还有一种混合的情况float x 3.14f * 2.0;3.14添加了f后缀显式定义为float常量2.0未加f后缀依然默认为double常量。C 语言规定当 float 和 double 混合运算时float 那一方会被隐式提升为 double然后以 double 精度完成乘法最后再截断回 float。也就是说只要包含一个未加后缀的操作数表达式就会以double进行运算。建议给所有浮点数添加后缀f显式声明其为float常量。float x 3.14f * 2.0f;此时由于全部操作数都为float表达式会以float进行运算。在使用软件浮点库中的函数进行运算时似乎与使用double没有太大差别但当芯片内置支持单精度运算的硬件浮点单元FPU时float运算会有巨大的提升。三、FPU 硬件浮点单元FPUFloating Point Unit浮点运算单元是处理器中专门用于执行浮点数运算的硬件模块。利用软件浮点库进行浮点运算时调用相关的浮点运算函数进行模拟一般需要十几到几十条指令才能完成。而在FPU的帮助下加法、乘法等基础浮点运算可以在单个时钟周期内完成极大提高浮点运算效率。WCH部分芯片支持FPU例如青稞V3F\V5F内核芯片(CH32H416、CH32H415、CH32H417)和青稞V4F内核芯片(CH32V303、CH32V305、CH32V307、CH32V317)。以上型号支持RISC-V F指令集拥有F0-F31共32个浮点寄存器用于存储单精度浮点指令所需数据。使用MRS2开发时通过几步配置即可使用芯片的FPU提高浮点运算性能。1.勾选浮点扩展与ABI打开工程配置Build Settings-Tool Settings-Target Processor页面Floating point选择Single precision extension(RVF)单精度浮点扩展Floating point ABI选择Single precision(f)单精度浮点。2.勾选浮点优化选项打开工程配置Build Settings-Tool Settings-Optimization页面勾选Single precision constants(-fsingle-precision-constant)选项。开启这个选项之后会将源码里所有不带后缀的浮点常量强制当作float来处理效果等同于在每一个浮点常量后手动加了f。可确保浮点运算为单精度充分利用FPU硬件浮点单元提高浮点运算性能。四、浮点数打印嵌入式开发环境一般默认使用裁剪过的C库如newlib-nano出于代码体积考虑printf的实现删去了浮点格式化的支持。如果直接调用printf(%.2f, val) 串口浮点数输出为空。若需通过串口打印浮点数需要链接相应的浮点打印库。MRS2中通过勾选链接选项选择合适的浮点打印库即可在串口打印浮点数。打开工程配置Build Settings-Tool Settings-GNU RISC-V Cross Linker-Miscellaneous页面。勾选Use float with nano printf(-u _printf_float)会使用标准库newlib-nano中的浮点打印函数支持更全面的输出格式相应的链接库体积会稍大勾选Use wchprintfloat(-lprintfloat)会使用MRS提供的精简浮点打印函数仅保留常用的输出格式能够有效减小代码体积。同时Use wchprintfloat(-lprintfloat)还可支持64位数据打印。根据自身需求选择合适的选项即可。推荐使用Use wchprintfloat选项基本可满足常见浮点打印格式需求且代码体积优势较为明显。————————————————版权声明本文为CSDN博主「MounRiver_Studio」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。原文链接https://blog.csdn.net/qq_36353650/article/details/163241703