#dsp #math #ffi

sys no-std cmsis-dsp-sys

Rust 对静态 ARM CMSIS 数学库的绑定

4 个版本 (2 个破坏性版本)

0.3.1 2021 年 5 月 8 日
0.3.0 2021 年 5 月 8 日
0.2.0 2020 年 7 月 13 日
0.1.0 2020 年 7 月 12 日

硬件支持 中排名第 1505

每月下载量 29

自定义许可证

8KB
67

cmsis-dsp-sys

预构建 cmsis-dsp 数学库的 Rust 绑定

注意:在构建阶段下载 ~100mb 的 CMSIS_5,以便选择和链接正确的 math.lib

前置要求

Rust 1.51.0 用于 resolver 2

使用方法

use cmsis_dsp_sys::{arm_sin_f32};

let sin = unsafe { arm_sin_f32(core::f32::consts::PI) };
assert_eq!(sin, 0f32);

脏细节

这很复杂。目前我并没有构建任何与 ARM DSP 库伴随的 C 文件。带来必要的 libc、libm 以及针对每个可能的架构和构建标志进行抽象似乎毫无希望。因此,您可能需要在您的端做一些工作。

当您开始进行任何复杂操作时,您可能会看到类似以下的内容:

  = 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 /home/jacob/Downloads/dsp-discoveryf4-rust/lab4/libarm_cortexM4lf_math.a

这意味着您需要携带一些 libm 类型的函数。我看到的纯 Rust 选项包括 libmmicromath,各有不同的权衡。使用以下命令之一进行占位:

use cmsis_dsp_sys::{arm_cfft_sR_f32_len16, arm_cfft_f32, arm_cfft_instance_f32, arm_cmplx_mag_f32};
use micromath::F32Ext;

//C needs access to a sqrt fn, lets use micromath
#[no_mangle]
pub extern "C" fn sqrtf(x: f32) -> f32 {
    x.sqrt()
}
...
    //your data as stored as real and imaginary pairs here
    let mut dtfsecoef = [0f32; 32];

    let mut mag = [0f32; 16];

    //Coefficient calculation with CFFT function
    unsafe {

        //CFFT calculation
        arm_cfft_f32(&arm_cfft_sR_f32_len16, dtfsecoef.as_mut_ptr(), 0, 1);

        // Magnitude calculation
        arm_cmplx_mag_f32(s.as_ptr(), mag.as_mut_ptr(), N::to_usize() as uint32_t);

    }
...

依赖项

~0–3.5MB
~62K SLoC