1 个不稳定版本
0.1.0 | 2021年1月28日 |
---|
#1627 在 算法
每月499 次下载
505KB
11K SLoC
CMSIS-DSP 绑定
CMSIS-DSP 库提供“一套常见的信号处理函数,用于 Cortex-M 和 Cortex-A 处理器基于的设备。”
此包为 Cortex-M0、M0+、M3、M4、M7、M23 和 M33 设备提供 CMSIS-DSP 的 Rust 绑定。
支持的功能
目前为基本函数和快速傅里叶变换提供高级绑定。CMSIS-DSP 库还有其他功能,但还没有人为其编写 Rust 绑定。
限制
内联函数
一些 CMSIS-DSP 函数,如 arm_sqrt_f32
,在头文件中定义为内联,但在编译库中缺失。此包目前不提供这些函数。
基本 C 数学函数
一些 CMSIS-DSP 函数依赖于 C 标准库中的数学函数,如 sqrtf
。这些 C 标准库数学函数不包括在 CMSIS-DSP 库中。这可能会导致链接错误,如下所示
= note: rust-lld: error: undefined symbol: sqrtf
>>> referenced by arm_math.h:6841 (../../Include/arm_math.h:6841)
>>> arm_cmplx_mag_f32.o:(arm_cmplx_mag_f32) in archive /path/cmsis_dsp_sys/ARM.CMSIS.5.7.0/CMSIS/DSP/Lib/GCC/libarm_cortexM4lf_math.a
>>> referenced by arm_math.h:6841 (../../Include/arm_math.h:6841)
>>> arm_cmplx_mag_f32.o:(arm_cmplx_mag_f32) in archive /path/cmsis_dsp_sys/ARM.CMSIS.5.7.0/CMSIS/DSP/Lib/GCC/libarm_cortexM4lf_math.a
>>> referenced by arm_math.h:6841 (../../Include/arm_math.h:6841)
>>> arm_cmplx_mag_f32.o:(arm_cmplx_mag_f32) in archive /path/cmsis_dsp_sys/ARM.CMSIS.5.7.0/CMSIS/DSP/Lib/GCC/libarm_cortexM4lf_math.a
>>> referenced 4 more times
修复此问题的最简单方法是启用 cmsis_dsp
包上的 libm
或 micromath
功能。这将添加对 libm 或 micromath 的依赖,并实现一些 C 标准库数学函数。
libm
库实现的函数比 micromath
多。其实现可能更精确,但占用更多的代码空间。
如果同时启用了 libm
和 micromath
功能,则将使用 libm
的实现。
或者,您可以选择实现您需要的函数,例如使用您选择的实现
#[no_mangle]
pub extern "C" fn sqrtf(value: f32) -> f32 {
// Implementation goes here
}
配置绑定
将根据代码运行的处理器的类型链接不同的库版本。您可能需要根据目标启用一些 Cargo 功能
- Cortex-M7:启用功能
cortex-m7
。另外,如果处理器具有双精度浮点单元,请启用double-precision-fpu
功能。 - Cortex-M33 (目标
thumbv8m.main-none-eabi
或thumbv8m.main-none-eabihf
): 如果处理器支持DSP指令,则启用dsp-instructions
功能
所有其他选项将根据传递给cargo的目标自动配置。如果您忘记启用某个功能,一切仍然应该正常工作,但可能运行速度较慢。
许可
ARM在Apache许可证2.0下提供CMSIS-DSP库。这个绑定包(cmsis_dsp_sys)在0条款BSD许可证下发布,这是一种非常宽松的许可证,不需要署名。这意味着在Rust中使用CMSIS-DSP不需要比在C中使用CMSIS-DSP更多的许可合规工作。
链接
依赖
~3MB
~63K SLoC