互操作性

Rust 和 C 代码之间的互操作性始终依赖于在两种语言之间转换数据。为此,stdlib 中有一个专门的模块,称为 std::ffi

std::ffi 提供了 C 基本类型的类型定义,例如 charintlong。它还提供了一些实用程序来转换更复杂的类型,例如字符串,将 &strString 都映射到更容易且更安全的 C 类型。

从 Rust 1.30 开始,std::ffi 的功能在 core::ffialloc::ffi 中可用,具体取决于是否涉及内存分配。 cty crate 和 cstr_core crate 也提供了类似的功能。

Rust 类型中间C 类型
字符串CStringchar *
&strCStrconst char *
()c_voidvoid
u32u64c_uintunsigned int
等等......

C 基本类型的值可以用作相应的 Rust 类型之一,反之亦然,因为前者只是后者的类型别名。例如,以下代码在 unsigned int 为 32 位长的平台上编译。

fn foo(num: u32) {
    let c_num: c_uint = num;
    let r_num: u32 = c_num;
}

与其他构建系统的互操作性

在嵌入式项目中包含 Rust 的一个常见要求是将 Cargo 与您现有的构建系统(例如 make 或 cmake)结合使用。

我们正在我们的问题跟踪器中收集有关此方面的示例和用例,在 问题 #61 中。

与 RTOS 的互操作性

将 Rust 与 FreeRTOS 或 ChibiOS 等 RTOS 集成仍在进行中;特别是从 Rust 调用 RTOS 函数可能很棘手。

我们正在我们的问题跟踪器中收集有关此方面的示例和用例,在 问题 #62 中。