Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Interoperabilität

Die Interoperabilität zwischen Rust- und C-Code hängt stets von der Umwandlung von Daten zwischen den beiden Sprachen ab. Hierfür gibt es in der Standardbibliothek (stdlib) ein spezielles Modul namens std::ffi.

std::ffi stellt Typdefinitionen für primitive C-Datentypen bereit, wie etwa char, int und long. Zudem bietet es Hilfsmittel zur Konvertierung komplexerer Typen wie Strings, indem es sowohl &str als auch String auf C-Typen abbildet, die sich einfacher und sicherer handhaben lassen.

Seit Rust 1.30 stehen die Funktionalitäten von std::ffi wahlweise in core::ffi oder alloc::ffi zur Verfügung, je nachdem, ob Speicherreservierungen erforderlich sind oder nicht. Auch die Crates cty und cstr_core bieten vergleichbare Funktionalitäten an.

RusttypDazwischenliegendC-Typ
StringCStringchar *
&strCStrconst char *
()c_voidvoid
u32 or u64

, c_uint, unsigned int, tr(( en: [etc], de: [usw.], ja: [他], )), […], […], ) )

Ein Wert eines primitiven C-Datentyps kann als Wert des entsprechenden Rust-Datentyps verwendet werden und umgekehrt, da der erstere lediglich ein Typalias des letzteren ist. Beispielsweise lässt sich der folgende Code auf Plattformen kompilieren, auf denen unsigned int 32 Bit lang ist.

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

Interoperabilität mit anderen Build-Systemen

Eine häufige Voraussetzung für die Einbindung von Rust in Embedded-Projekte ist die Kombination von Cargo mit Ihrem bestehenden Build-System, beispielsweise Make oder CMake.

Wir sammeln Beispiele und Anwendungsfälle hierzu in unserem Problem-Verfolgungswerkzeug unter Issue #61.

Interoperabilität mit RTOS

Die Integration von Rust in ein RTOS wie FreeRTOS oder ChibiOS befindet sich noch in der Entwicklung; insbesondere der Aufruf von RTOS-Funktionen aus Rust heraus kann sich als schwierig erweisen.

Derzeit unterstützen die folgenden Projekte öffentlich die Interoperabilität zwischen Rust und RTOS:

Wir sammeln hierfür Beispiele und Anwendungsfälle in unserem Problem-Verfolgungswerkzeug unter Issue #62.