1 个不稳定版本
0.1.0 | 2023年10月23日 |
---|
#1072 在 硬件支持
64KB
909 行
ni-fpga-interface
为 Rust 提供的 NI FPGA 接口
此 crate 旨在简化与 LabVIEW FPGA 的通信。
要求
- C 接口需要以没有空格的“前缀”导出,我们期望有一个包含 NiFpga C 和 H 文件的单一目录。
入门
- 使用可从 https://www.ni.com/en/support/downloads/drivers/download.fpga-interface-c-api.html#477242 下载的生成器生成 FPGA C 接口
- 将
ni-fpga-interface-build
crate 作为构建依赖项添加,并将ni-fpga-interface
作为正常依赖项添加。 - 为您的项目创建一个构建脚本,并将构建器添加到脚本中。例如
fn main() { let mut fpga_c_interface = ni_fpga_interface_build::FpgaCInterface::from_custom_header( "../fpga_c_interface/NiFpga_Main.h", ); fpga_c_interface.build(); }
- 将生成的 Rust 模块包含在您的应用程序中的一个模块中。
mod fpga_defs { include!(concat!(env!("OUT_DIR"), "/NiFpga_Main.rs")); }
- 使用
ni-fpga-interface
API 访问 FPGA。
示例
查看示例文件夹,其中包含一些完整的示例,包括构建支持。
支持的功能
以下是支持的和计划中的功能。
原生类型是标准的整数类型以及单精度和双精度浮点数。
功能 | 支持 |
---|---|
原生类型的寄存器 | ✅ |
FXP 数字寄存器 | 计划中 |
集群寄存器 | 待定 |
原生类型的 DMA | ✅ |
DMA FIFO 控制 | ✅ |
中断请求 (IRQ) | ✅ |
会话控制 | ✅ |
多线程 | ✅ |
多 FPGA 支持的模式 | 计划中 |
多 FPGA 支持的动态接口 | 计划中 |
架构
此方法的原理是尽可能使用生成的 C 代码,而不是预先针对预期的接口构建。
这应该使我们尽可能版本独立,并减少 NI 在生成的 C 代码中已解决的问题的复杂性。
这可能需要时间,但将通过 3 层抽象构建
- NI 生成的 C 调用。
- Rust 中的 C 调用的安全包装。
- 为提供的特定 FPGA 位文件/接口生成的 Rust 接口。
flowchart
subgraph LabVIEW
C[FPGA C Interface]
LV[LabVIEW FPGA] --generates--> C
end
subgraph Build Support
C --bindgen--> Types[FPGA Definitions]
C --cc--> Obj[Compiled NI FPGA Interface]
end
Obj --links--> Wrapper[Safe Generic Wrapper]
Types --mod import--> Direct[Your Code with Direct interface]
Wrapper --mod import--> Direct
Types --generator--> Specific[FPGA Interface Module]
Wrapper --generator--> Specific
Specific --> App[Your Code Using Custom Interface]
此图显示了关键组件和目标工作流程。名称可能会更改。
本项目的关键组件有3个
- 构建支持,以便轻松将FPGA生成的C接口集成到您的Rust项目中。
- 安全包装,让您无需直接调用不安全函数。
- FPGA接口生成器,它将在Rust中生成一个结构体,提供对特定FPGA接口的轻松访问。
自定义类型支持
我们需要支持固定点和集群,这些在C中以自定义类型的形式出现。
这需要生成一些代码作为构建支持的一部分,以便为这些类型启用安全包装。
交叉编译
交叉编译应被视为首要考虑事项,以确保轻松针对compactRIO目标使用。
我已经测试了针对x64和armv7 LinuxRT目标的示例构建。
计划方法
- 解决构建支持问题。
- 让标准类型的安全包装工作。
- 让自定义类型的安全包装工作。
- 解决单个位文件的API生成问题。
- 看看是否有合理的方法来抽象多个位文件之间的接口(类似于LabVIEW中的动态接口)
我打算将其作为一个单独的crate开始,但后来可能需要将其拆分。
依赖项
~46KB