#cfs #space #ffi #sys #bindgen

sys cfs-sys

为NASA的cFE、cFS和OSAL提供的绑定,用Rust编写CFS应用!

1个不稳定版本

使用旧的Rust 2015

0.1.0 2018年12月16日

#47 in #sys

MIT 许可证

13KB
93

Rust中的CFS应用

此crate提供了Rust绑定到NASA的核心飞行执行程序(CFE)操作系统抽象层(OSAL)。这些提供了一组核心软件组件,用于构建飞行软件系统,以及一种通过称为核心飞行软件(CFS)应用来扩展系统的机制。使用cfs-sys crate,您可以在Rust中编写您的CFS应用!

这是由bindgen生成的基本绑定。可以编写一个Rust接口来包装所有调用的不安全FFI和原始指针。

目的是通过一个集成到CFS构建过程中的Rust crate生成这些绑定。此构建过程将设置必要的环境并启动使用cargo构建CFS应用的过程,这将在当时生成必要的绑定。这确保了Rust绑定与其运行的CFS版本。

我正在开发一个示例CFS系统,该系统使用这些绑定来包含用Rust编写的CFS应用,以展示您如何将Rust包含在CFS系统中。该项目是一个正在进行中的项目,但可以在这里找到。

构建

此项目的目的是将其包含在集成到CFS构建过程中的CFS应用中。在这种情况下,生成的绑定将特定于CFS的安装,包括某些项目和板级特定定义。这还将提供指向CFS安装的环境变量,如下所述。

目标

该项目已通过使用POSIX版本的OSAL构建i686-unknown-linux-gnu目标进行测试。

要使用rustup获取此目标,请输入

rustup target add i686-unknown-linux-gnu

我尚未尝试使用Rust应用为嵌入式系统交叉编译CFS。

环境变量

要构建此项目,您需要定义以下环境变量

  • OSAL_DIR
  • PSP_DIR
  • CFE_FSW
  • CFE_CORE_SRC
  • CFS_MISSION
  • CFS_MISSION_INC

定义这些变量的最简单方法是克隆cFE github存储库及其子模块(至少OSAL - 应用目录中的子模块不是必需的)。

然后转到您克隆的cFE存储库,并输入以下命令以设置必要的环境变量

. ./setvars.sh

在此阶段,Rust应用将能够构建cfs-sys绑定。

关于共享对象大小的说明

当使用cfs-sys crate编写CFS应用时,我注意到我默认得到一个3MB的.so文件,其中lto=true和panic='abort'。剥离后降至约200KB。

为了参考,其他CFS应用的大小在8KB到20KB左右。这在某些环境中运行良好,但在空间上,如果能够拥有小型的对象文件,将有助于通过缓慢、间歇性的连接上传新的代码会更好。

使用xz压缩可以将大小减少到79KB,这已经不错了,但仍然不如C模块。

CFS中的宏

在特定的CFE模块中使用了带参数的宏(也称为内联函数)。Bindgen没有翻译这些,因此它们在绑定中缺失。它们可以作为C中的函数或在Rust中添加,但当前它们只是简单地缺失。以下列出了这些宏

  • ccsds.h
  • cfs_es.h
  • cfs_evs.h
  • cfs_tbl_filedef.h
  • cfs_sb.h
  • common_types.h
  • cfe_platform_cfg.h
  • cfe_psp_module.h

无运行时依赖

~0–2MB
~40K SLoC