2个版本

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

#121 in #maps

自定义许可证

20KB
297

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。

依赖项

~1.5MB
~41K SLoC