相互運用性

RustとCとの相互運用性は、常に2つの言語間のデータ変換に依存しています。 そこで、2つの専用モジュールがstdlib内にあります。 std::ffistd::os::rawと呼ばれるものです。

std::os::rawは、コンパイラによって暗黙的に変換される低レベルのプリミティブ型を扱います。 RustとCとの間で、これらのプリミティブ型のメモリレイアウトは十分似ているか、同じだからです。

std::ffiは、文字列のようなより複雑な型を変換し、&strStringの両方を、 より扱いやすく安全なCの型にマッピングするためのユーティリティを提供します。

これらの2つのモジュールは、どちらもcoreでは利用できませんが、 #![no_std]互換バージョンのstd::ffi::{CStr,CString}が、cstr_coreクレートにあります。 そして、ほとんどのstd::os::rawの型は、ctyクレートにあります。

Rustの型 中間表現 Cの型
String CString *char
&str CStr *const char
() c_void void
u32 or u64 c_uint unsigned int
... ...

上述の通り、プリミティブ型は、コンパイラによって暗黙的に変換されます。

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

他のビルドシステムとの相互運用性

組込みプロジェクトにRustを組み込むための共通の要件は、Cargoとmakeやcmakeのような既存のビルドシステムとを組み合わせることです。

issue #61でこれに関する事例とユースケースを集めています。

RTOSとの相互運用性

RustをFreeRTOSやChibiOSといったRTOSに統合することは、まだ作業を進めている状態です。 特に、RTOSの関数をRustから呼び出すことはトリッキーです。

issue #62でこれに関する事例とユースケースを集めています。