如何在 STMCubeIDE 工作环境中安装新版本的 CMSIS 以支持 PKHBT 和 VMAXNM/VMINNM?我注意到 STMCubeIDE 1.9.0 版本引用了 2019 年 5 月发布的较旧 CMSIS V5.2.0,而 ARM 目前已经发布了 5.8.0 版本。有没有办法在现有项目中安装新版本的 CMSIS?
我在时序关键的中断例程中有两类代码:
mergedVal = ((uint16_t) maxVal << 16) | (uint16_t) minVal;
if(x < minVal) {
minVal = x;
} else if(x > maxVal) {
maxVal = x;
}
有三条完全匹配的汇编指令 PKHBT、VMAXNM.F32 和 VMINNM.F32 正好可以实现这些功能。然而,在 5.2.0 版本的 cmsis_gcc.h 文件中,__PKHBT 的实现很差,实际上没有利用这个汇编指令的优势。因此我通过宏实现了它:
#define PKHBT(ARG1, ARG2, ARG3) \
({ \
uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
__ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
__RES; \
})
这个宏在 cmsis_gcc.h 中实际上被注释掉了。
VMAX 和 VMIN 甚至没有出现在这个文件中。我不知道 CMSIS 5.8.0 版本是否已经将它们作为 __builtin_pkhbt、__builtin_vmaxnm 和 __builtin_vminnm 提供,所以我需要弄清楚。
当我尝试按以下方式实现 VMAXNM 和 VMINNM 的指令时:
这个宏在 cmsis_gcc.h 中实际上被注释掉了。
VMAX 和 VMIN 甚至没有出现在这个文件中。我不知道 CMSIS 5.8.0 版本是否已经将它们作为 __builtin_pkhbt、__builtin_vmaxnm 和 __builtin_vminnm 提供,所以我需要弄清楚。
当我尝试按以下方式实现 VMAXNM 和 VMINNM 的指令时:
#define VMAXNM(ARG1, ARG2) \
({ \
float __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
__ASM ("vmaxnm.f32 %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \
__RES; \
})
我收到以下编译器错误:
Error: VFP single, double or Neon quad precision register expected -- `vmaxnm.f32 r3,r3,r2'
总结来说:
我的首选方案是安装最新版本的 CMSIS,希望这些汇编指令能得到利用。
如果上述方案不可行,我会使用自己的宏,但想了解我设置这个宏的方式有什么问题。
|
|