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 может быть непростым.

На данный момент следующие проекты публично поддерживают взаимодействие Rust и RTOS:

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