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

Интероперабельность

Интероперабельность между кодом на Rust и C всегда зависит от преобразования данных между двумя языками. Для этой цели в stdlib есть специальный модуль, называемый std::ffi.

std::ffi предоставляет определения типов для примитивов C, таких как char, int и long. Также он предоставляет утилиты для преобразования более сложных типов, таких как строки, отображая как &str, так и String на типы C, которые легче и безопаснее обрабатывать.

Начиная с Rust 1.30, функциональность std::ffi доступна либо в core::ffi, либо в alloc::ffi, в зависимости от того, связано ли это с выделением памяти. Крейты cty и cstr_core также предлагают аналогичные функциональности.

Тип RustПромежуточныйТип C
StringCStringchar *
&strCStrconst char *
()c_voidvoid
u32 или u64c_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, все еще находится в стадии разработки; особенно вызов функций RTOS из Rust может быть сложным.

Мы собираем примеры и случаи использования для этого в нашем трекере задач в issue #62.