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 选项包括 libm 或 micromath,各有不同的权衡。使用以下命令之一进行占位:
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