有没有办法将 "best type" 浮点常量从微处理器移植到另一个微处理器?
Is there a way to port "best type" floating-point constants from a micro to another?
在我的具体案例中,我首先在德州仪器 (Texas Instruments) 微控制器 (TMS320F28335) 中开发了一个 运行 程序。它是一个实时同步发电机模拟器,因此需要执行大量的浮点运算。我没有为浮点常量指定任何后缀,所以它们被视为双精度数(我猜 C 标准是这么说的)但是德州仪器提供的编译器将这些双精度数实现为 32 位浮点数,因此微控制器的 FPU以一种有效的方式使用(参见 compiler user's guide 中的 Table 6-1)。然后,我必须将该程序移植到带有嵌入式 linux(为实时要求打补丁)的 BeagleBone Black。当然,编译器 (GCC) 再次将所有常量视为双精度数,但在这种情况下,这并不意味着 32 位浮点数,而是 64 位浮点数。我不完全理解 ARM Cortex A8 的 FPU 是如何工作的,但据我所知(因为它是 32 位处理器),如果将这些浮点常量视为 32 位浮点数,性能将会提高.所以,所有这些让我想到了一个问题:有没有办法制作更便携的 "best type" 浮点常量?在这种情况下,我会通过向每个常量添加 "f" 后缀来解决问题,因为两个处理器都更有效(我猜)处理浮点数,但是如果我在 amd64 PC 上开发一些东西并且我想将其移植到 32 位微控制器,有没有办法添加一些后缀,对于 32 位微控制器可以更改为 "f",对于 amd64 PC 可以更改为 "l"?我想到了这样的事情(当然不行):
32 位微控制器的体系结构相关头文件:
#define BEST_TYPE f
.
.
.
amd64 PC 的体系结构相关头文件:
#define BEST_TYPE l
.
.
.
独立于体系结构的源文件:
.
.
.
a = b * 0.1BEST_TYPE;
.
.
.
澄清一下,"best type" 是指微处理器的 FPU 支持的更精确的数字数据类型。
该问题要求类似于 C 2018 7.20.4 中的宏“整数常量的宏”中的内容。这些宏,如UINT64_C(value)
,扩展为整数常量,适合初始化相应类型的对象。
如果我们查看 Xcode 11 为 macOS 10.14 提供的 <stdint.h>
,我们会看到这些实现只是附加一个指示类型的后缀(或者什么也不做,如果值将具有默认所需类型):
#define UINT8_C(v) (v)
#define UINT16_C(v) (v)
#define UINT32_C(v) (v ## U)
#define UINT64_C(v) (v ## ULL)
我们可以将其用作浮点类型的类似宏的指导,使用以下之一:
#define MyFloatType_C(v) (v ## f)
#define MyFloatType_C(v) (v)
#define MyFloatType_C(v) (v ## l)
可以通过各种编译时方法选择要使用的宏定义,例如测试预处理器宏(编译器内置以描述目标或在命令行上显式传递)。
在我的具体案例中,我首先在德州仪器 (Texas Instruments) 微控制器 (TMS320F28335) 中开发了一个 运行 程序。它是一个实时同步发电机模拟器,因此需要执行大量的浮点运算。我没有为浮点常量指定任何后缀,所以它们被视为双精度数(我猜 C 标准是这么说的)但是德州仪器提供的编译器将这些双精度数实现为 32 位浮点数,因此微控制器的 FPU以一种有效的方式使用(参见 compiler user's guide 中的 Table 6-1)。然后,我必须将该程序移植到带有嵌入式 linux(为实时要求打补丁)的 BeagleBone Black。当然,编译器 (GCC) 再次将所有常量视为双精度数,但在这种情况下,这并不意味着 32 位浮点数,而是 64 位浮点数。我不完全理解 ARM Cortex A8 的 FPU 是如何工作的,但据我所知(因为它是 32 位处理器),如果将这些浮点常量视为 32 位浮点数,性能将会提高.所以,所有这些让我想到了一个问题:有没有办法制作更便携的 "best type" 浮点常量?在这种情况下,我会通过向每个常量添加 "f" 后缀来解决问题,因为两个处理器都更有效(我猜)处理浮点数,但是如果我在 amd64 PC 上开发一些东西并且我想将其移植到 32 位微控制器,有没有办法添加一些后缀,对于 32 位微控制器可以更改为 "f",对于 amd64 PC 可以更改为 "l"?我想到了这样的事情(当然不行):
32 位微控制器的体系结构相关头文件:
#define BEST_TYPE f
.
.
.
amd64 PC 的体系结构相关头文件:
#define BEST_TYPE l
.
.
.
独立于体系结构的源文件:
.
.
.
a = b * 0.1BEST_TYPE;
.
.
.
澄清一下,"best type" 是指微处理器的 FPU 支持的更精确的数字数据类型。
该问题要求类似于 C 2018 7.20.4 中的宏“整数常量的宏”中的内容。这些宏,如UINT64_C(value)
,扩展为整数常量,适合初始化相应类型的对象。
如果我们查看 Xcode 11 为 macOS 10.14 提供的 <stdint.h>
,我们会看到这些实现只是附加一个指示类型的后缀(或者什么也不做,如果值将具有默认所需类型):
#define UINT8_C(v) (v)
#define UINT16_C(v) (v)
#define UINT32_C(v) (v ## U)
#define UINT64_C(v) (v ## ULL)
我们可以将其用作浮点类型的类似宏的指导,使用以下之一:
#define MyFloatType_C(v) (v ## f)
#define MyFloatType_C(v) (v)
#define MyFloatType_C(v) (v ## l)
可以通过各种编译时方法选择要使用的宏定义,例如测试预处理器宏(编译器内置以描述目标或在命令行上显式传递)。