互操作性

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 类型
StringCStringchar *
&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)结合使用。

我们正在 issue #61 的问题跟踪器上收集这方面的示例和用例。

与 RTOS 的互操作性

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

我们正在 issue #62 的问题跟踪器上收集这方面的示例和用例。