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

Организация проекта

Крейты 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 параметры, такие как размер стека, уровень логирования и т. д.