2 个版本

0.1.1 2020 年 8 月 23 日
0.1.0 2020 年 8 月 23 日

#1045嵌入式开发

自定义许可证

19KB
285

lvbitfile2rust

crates.io docs.rs CI

lvbitfile2rust 从 lvbitx 文件生成静态寄存器映射。

通过命令行调用

cargo install lvbitfile2rust
lvbitfile2rust-cli /boot/user.lvbitx | rustfmt > rio.rs

作为宏调用

mod rio {
    use lvbitfile2rust_macros::lvbitfile2rust;
    lvbitfile2rust!("/boot/user.lvbitx");
}

生成的代码

lvbitfile2rust 生成的代码与由 svd2rust 生成的代码具有类似的接口。生成的代码包含一个名为 Peripherals 的结构体以及一个名为 take 的关联函数。调用 take 将尝试打开 FPGA 会话并返回一个 Peripherals 实例。该 Peripherals 实例包含由输入位文件描述的每个寄存器的字段。这些字段包含与每个寄存器对应的结构体实例,具有 read 和可能的 write 方法。实际上,接口使用起来相当直观

use ni_fpga::fxp::UnsignedFXP;

mod rio {
    use lvbitfile2rust_macros::lvbitfile2rust;
    lvbitfile2rust!("/boot/user.lvbitx");
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Turn PWM on if the RSL is on!
    // My scope tells me the RSL blinks at 5Hz in teleop mode!
    let peripherals = rio::Peripherals::take("RIO0")?;
    loop {
        let leds = peripherals.LEDs.read()?;
        peripherals.PWM_Hdr0.write(&{
            if leds.RSL {
                UnsignedFXP::max_value()
            } else {
                UnsignedFXP::min_value()
            }
        })?;
    }
}

如果输入位文件使用 Clusters 或 Enums,则生成的代码将依赖于 ni-fpga 和 ni-fpga-macros。

依赖关系

~2MB
~43K SLoC