Организация проекта
Крейты esp-rs
В отличие от большинства других встраиваемых платформ, Espressif поддерживает стандартную библиотеку Rust. В частности, это значит, что в вашем распоряжении будут коллекции произвольного размера, например Vec или HashMap, а также универсальное хранение в куче через Box. Вы также можете свободно создавать новые потоки и использовать примитивы синхронизации, такие как Arc и Mutex, чтобы безопасно разделять данные между ними.
Тем не менее память — ограниченный ресурс во встраиваемых системах, поэтому нужно следить, чтобы её не хватило: особенно дорогими могут быть потоки.
Такие сервисы, как Wi-Fi, HTTP-клиент и сервер, MQTT, OTA-обновления, логирование и т. д., предоставляются через открытый фреймворк IoT от Espressif — ESP-IDF. Он в основном написан на C, поэтому в Rust его открывают по классической схеме разделения на крейты:
- крейт
sys, предоставляющий собственноunsafe-биндинги (esp-idf-sys); - крейт более высокого уровня с безопасными и удобными абстракциями на Rust (esp-idf-svc).
Последняя часть головоломки — низкоуровневый доступ к железу, который тоже предоставляется в разделённом виде:
- esp-idf-hal реализует не зависящие от железа трейты embedded-hal, такие как аналого-цифровое преобразование, цифровые выводы ввода-вывода или связь по SPI. Как следует из названия, он тоже использует ESP-IDF в качестве основы;
- если нужна прямая работа с регистрами, esp32c3 предоставляет крейт доступа к периферии, сгенерированный с помощью
svd2rust.
Подробнее — в главе об экосистеме книги The Rust on ESP Book.
Тулчейн сборки
🔎 В процессе сборки проекта esp-idf-sys загружает ESP-IDF — основанный на C набор инструментов Espressif. Каталог загрузки можно настроить. Чтобы сэкономить место на диске и время загрузки, все примеры и упражнения в репозитории практикума используют один общий (global) экземпляр этого набора, установленный в ~/.espressif (в Windows — %USERPROFILE%\.espressif). Другие варианты см. в описании параметра ESP_IDF_TOOLS_INSTALL_DIR в README esp-idf-sys.
Структура пакета
Помимо обычного содержимого проекта Rust, созданного командой cargo new, нужны несколько дополнительных файлов и параметров. Примеры и упражнения в этом практикуме уже полностью настроены, а для создания новых проектов рекомендуется пользоваться мастером на базе cargo-generate.
🔎 Остаток этой страницы — необязательные сведения, которые могут пригодиться, если вы захотите изменить некоторые аспекты проекта.
Нужно задать некоторые build-зависимости:
[build-dependencies]
embuild = "=0.31.2"
anyhow = "=1.0.71"
Дополнительные конфигурационные файлы
build.rs— скрипт сборки Cargo. Здесь задаются переменные окружения, необходимые для сборки..cargo/config.toml— задаёт целевую архитектуру, пользовательский раннер для прошивки и мониторинга устройства и управляет деталями сборки. Здесь же при необходимости переопределяетсяESP_IDF_TOOLS_INSTALL_DIR.sdkconfig.defaults— переопределяет специфичные для ESP-IDF параметры, такие как размер стека, уровень логирования и т. д.