Rust в серийной прошивке: пока нет

Меня регулярно спрашивают, почему прошивки у нас до сих пор на C, если Rust «уже готов для embedded». Попробовал всерьёз на одном небольшом проекте. Ответ получился длиннее, чем «не готов», но короче, чем хотелось бы.

Что понравилось

Embassy. Асинхронные задачи на микроконтроллере без RTOS — это действительно удобно: ожидание прерывания пишется как .await, а не как флаг и конечный автомат. Драйвер датчика на I2C получился вдвое короче, чем на C, и читается сверху вниз.

Типы для периферии. Перепутать пин или забыть включить тактирование порта компилятор не даёт. За год на C я ловил такую ошибку дважды, и каждый раз это был вечер.

Что не понравилось

Размер. Та же функциональность заняла на 30% больше флеша, пока я не включил opt-level = "z", LTO и не выкинул форматирование строк. Для STM32G0 с 64 КБ это не мелочь.

Поддержка конкретных чипов. Для популярных серий всё хорошо, для нашего промышленного радиомодуля HAL пришлось бы писать самому. А производитель отвечает на вопросы только про свой SDK на C.

Команда. Прошивку поддерживают четыре человека, и только я читал книгу по Rust. Код, который через год сможет поправить только один человек, — это риск, а не экономия.

Итог

Для личных проектов на nRF52 и RP2040 — да, уже сейчас. Для серийного устройства с длинным сроком поддержки — пока нет. Вернусь к вопросу через год: обе причины «нет» — организационные, а не технические, и они меняются быстрее, чем кажется.