4个版本 (重大变更)

0.4.0 2023年4月20日
0.3.0 2023年4月19日
0.2.0 2023年4月8日
0.1.0 2023年4月8日

机器人类别中排名第80

每月下载量37

Apache-2.0

2MB
20K SLoC

C 15K SLoC // 0.2% comments Rust 4.5K SLoC // 0.0% comments Assembly 183 SLoC // 0.2% comments Shell 131 SLoC // 0.2% comments Batch 70 SLoC Bitbake 5 SLoC // 0.7% comments

包含(静态库,1MB)lib/librobotcontrol.a,(ELF可执行文件/库,37KB)am335x-pru0-rc-encoder-fw,(ELF可执行文件/库,36KB)am335x-pru1-rc-servo-fw

librobotcontrol-sys 文档

BeagleBone板上机器人相关功能的底层库。你可能希望将你使用的功能子集封装在更自然/更安全的Rust代码中。

请参阅最新版本的rust API文档。还可以参阅librobotcontrol API文档和示例。大部分内容相同。例如,在C/C++中你会调用

rc_button_init(...)

在rust中你会调用

unsafe { librobotcontrol_sys::rc_button_init(...) }

示例

示例请见examples/heading.rs。这可以通过连接你的BeagleBone进行交叉编译并运行来部署。

# Add the target for cross-compilation
rustup target add armv7-unknown-linux-musleabihf
# Build, deploy & run on BeagleBone
make deploy-heading-example

实现细节

弄清楚所有这些细节非常痛苦。在研究时,似乎其他人也经历了类似的挑战,所以也许详细说明一部分细节将有助于他人。只想使用这个库的人不需要知道所有这些细节。

与默认的librobotcontrol设置不同,这个版本使用musl而不是glibc,这使得交叉编译过程变得直接。但是这样做有点棘手。使用librobotcontrol的构建设置需要大量修改,并在主机系统上强制使用一些非常具体且难以设置的工具链。使用cc crate创建自定义构建设置可以避免前者的问题,但仍然会遭受后者的困扰。经过几天尝试使用这两种策略中的任何一种来解决问题后,我放弃了——即使我解决了它,它也绝对不具有良好的可移植性。

为了避免上述问题,我们通过docker BuildKit在alpine上构建librobotcontrol。但是,较新版本的alpine使用musl 1.2.x,它在32位机器上使用64位时间,而由libc crate静态链接的musl 1.1.x在32位机器上使用32位时间,导致链接错误。有一个兼容性补丁可以解决这个问题,但似乎使用较旧版本的alpine(该版本包含musl 1.1.x)更容易也更安全。假设你已经安装了docker BuildKit和相应的VM设置(这是一个很大的假设!),重新生成库就像这样简单:make lib/librobotcontrol.a。通常情况下,你不必这样做,因为库已经包含在内。

我们还想提前构建bindgen绑定,因为这样做需要安装库,但在主机机器上不太可能这样做。然而,较旧的alpine版本没有为rust提供apk软件包,而rustup也没有提供为armv7-unknown-linux-musleabihf安装的方式——这有点令人惊讶,因为我们可以很好地为它交叉编译rust代码。所以为了构建绑定,有一个使用较新版本的alpine的单独alpine容器,该版本有一个为rust提供的apk软件包。

该版本的alpine还有一个rustfmt软件包,但不知何故,与bindgen-cli一起使用会导致后者永远无法完成。所以我们只是在代码从容器中复制出来后,在主机机器上格式化代码。重新构建这些绑定应该就像这样简单:make src/bindings.rs。但同样,通常情况下你不必这样做,因为绑定已经提交。

librobotcontrol导出的大多数内容都没有包含在bindings.rs中,因为库重新导出了所有各种东西,这些都有更安全、等效的rust版本,例如libm函数。我可能过分热情地进行了筛选,所以请随意提交PR以包含您需要的缺失项。

此库的早期版本使用c2rust将librobotcontrol转换为Rust,而不是尝试上述所有花招。但我担心不完美的转换会导致错误。令我震惊的是,许多东西(包括#include甚至libc类型)都是按模块进行转换的。例如,每个模块中都有一个FILE类型的副本,它们在Rust看来并不兼容。早期的c2rust通过其“重构”支持来防止这个问题[通过支持重构],但在更近的版本中被移除,以便更容易地将其现代化以适应新的Rust、LLVM等版本。我尝试手动重构,但这会导致我患上腕管综合症。

依赖项