Async
Асинхронное программирование позволяет задачам выполняться параллельно, не блокируя друг друга. Во встраиваемых системах это даёт микроконтроллеру возможность обрабатывать несколько задач, например считывать данные с датчиков и управлять другой периферией, не дожидаясь завершения каждой из них. Подробнее об этом можно прочитать в книге Asynchronous Programming in Rust.
Embassy
До сих пор мы работали с кодом, который выполняется в блокирующем режиме. Это значит, что когда мы просим программу что-то сделать, например подождать некоторое время или дождаться нажатия кнопки, процессор останавливается и ждёт, пока задача не завершится, и только потом продолжает работу. Это просто для понимания и хорошо работает в небольших программах, но становится ограничением, когда нужно обрабатывать несколько задач одновременно, например считывать датчик и одновременно ожидать ввода, не блокируя друг друга.
Здесь на помощь приходит Embassy. Embassy — это асинхронный рантайм, созданный для встраиваемых систем. Он позволяет писать неблокирующий код с помощью возможностей async и await языка Rust. Вместо того чтобы ждать и тратить процессорное время впустую, задачи могут приостанавливаться и давать поработать другим. Так процессор используется лучше, а приложения становятся отзывчивее и экономичнее по энергии. Embassy можно использовать с ESP32, Pico и другими микроконтроллерами.
Например, с Embassy мы можем одновременно мигать светодиодом и отслеживать сенсорный или кнопочный ввод без ручного написания сложного кода на основе прерываний.
HAL
Embassy предоставляет асинхронные Hardware Abstraction Layers (HAL) для нескольких семейств микроконтроллеров. Они предлагают безопасный и идиоматичный API на Rust, так что вы можете работать с железом, не имея дела с низкоуровневыми регистрами.
Официальные HAL включают embassy-stm32 (STM32), embassy-nrf (nRF52/53/54/91), embassy-rp (RP2040) и embassy-mspm0 (TI MSPM0). Embassy также работает с HAL от сообщества, например esp-hal (ESP32), ch32-hal (CH32V), mpfs-hal (PolarFire) и py32-hal (Puya PY32), что упрощает написание переносимого асинхронного кода для множества платформ.
Батарейки в комплекте (Batteries included)
Embassy поставляется со множеством встроенных возможностей, которые упрощают разработку встраиваемых систем. Например, в него входят embassy-time для таймеров и задержек, embassy-net для поддержки сети, embassy-usb для создания USB-устройств и многое другое.
ESP RTOS
В экосистеме esp-hal есть крейт esp-rtos, который обеспечивает интеграцию между esp-hal и асинхронным фреймворком Embassy.
Реализация RTOS (Real-Time Operating System, операционная система реального времени) для esp-hal. Этот крейт предоставляет рантайм, необходимый для выполнения асинхронного кода поверх esp-hal, и реализует возможности (потоки, очереди и т. д.), которые требуются для esp-radio.
Полезные ресурсы
- Embassy Book: книга о Embassy для всех, кто хочет использовать Embassy и понять, как он работает.
- Embassy на GitHub
- Документация esp-rtos