Взаимодействие
Взаимодействие между кодом на 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 |
|---|---|---|
String | CString | char * |
&str | CStr | const char * |
() | c_void | void |
u32 или u64 | c_uint | unsigned 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.