Збірка, прошивання та налагодження
Коли код вже написаний, є три різні дії: перевірити його, зібрати ELF і записати на пристрій. А якщо запуск планується через Keira — ще перетворити ELF в application .bin. Це не одна й та сама команда.
Спочатку перевірка
З теки потрібного прикладу:
check швидший, але остаточне компонування прошивки не перевіряє. Помилка лінкера може з'явитись тільки під час build. Тому перед запуском потрібна повна збірка.
У workspace ELF лежить у спільному target/xtensa-esp32s3-none-elf/release/. У власному окремому проєкті — в його target/. ELF без розширення .bin містить ще й інформацію, потрібну інструментам налагодження.
Пряме прошивання
У готових прикладах runner налаштований на probe-rs:
Це вже запис на пристрій, а не симулятор. Для підключення потрібні доступ до відповідного USB debug-інтерфейсу та права на нього. У Linux проблеми прав вирішуються правилами udev для встановленого інструмента; постійно запускати всю збірку через sudo не треба.
Якщо прошивальник взагалі не бачить пристрій, перевірте кабель з передачею даних, USB-порт і режим завантаження. Якщо запис проходить, але програма падає, це вже інша проблема — дивіться panic та boot-лог.
Application bin для KeiraOS
Потрібен встановлений cargo-espflash:
З теки пакета, наприклад examples/basics/:
Команда збирає та конвертує програму у файл. Окремий скрипт для цього не потрібен. Не додавайте --merge: для Keira MultiBoot потрібен застосунок, без bootloader та таблиці розділів.
Якщо встановлений тільки звичайний espflash, можна зберегти вже зібраний ELF. Для examples/basics/ у цьому workspace:
Скопіюйте .bin на microSD й запустіть його через Keira. Це окрема прошивка: MultiBoot записує її в OTA-розділ і перезапускає ESP32-S3. Вона не виконується поряд з Keira як процес і не може просто викликати її C++-об'єкти.
Саме тому RTC успадковується через збережений апаратний стан, а SD, дисплей та кнопки застосунок ініціалізує власним SDK. Умови для часу описані окремо.
Логи та panic
У прикладах використовується esp-println, а залежності мають defmt. Залиште відповідні features та defmt.x у build.rs, якщо не плануєте свідомо змінити спосіб логування.
Друкуйте не тільки «щось зламалось», а й етап: початок main, завершення ініціалізації, монтування карти, початок запису, результат закриття. Це допомагає відрізнити проблему файлової системи від падіння ще до запуску вашого коду.
Велика кількість логів у циклі теж уповільнює програму. Для частих подій краще друкувати тільки зміни стану або зводити статистику раз на секунду.
Типові помилки
Немає тулчейна esp або Xtensa GCC. Перевірте espup install і підключення shell-оточення, яке створив espup. Для Linux це часто пропущений крок після встановлення, а не проблема SDK.
Конфлікт blocking та async. Перевірте default-features = false і що ви збираєте один пакет. Коли треба зрозуміти, звідки прийшов feature, виконайте cargo +esp tree -e features -i lilkaoxide з теки цього пакета.
Немає global allocator. Сам build-std = ["alloc", "core"] його не створює. Зокрема, поточний SD-драйвер безумовно підключає alloc, навіть коли виконуваний код не виділяє пам'ять. Це вимога компонування, а не доказ потреби SD у heap. Можна використати звичайний allocator з ініціалізованим heap, як у прикладах, або allocator, який відмовляє в алокаціях, якщо весь виконуваний код обходиться без них. Докладніше — пояснення SD та alloc.
Переповнення RAM або стека. Перевірте великі локальні масиви, framebuffer та кількість задач. Зменшення зображення до смуги іноді дає більше, ніж довге налаштування оптимізатора. Детальніше — пам'ять.
Дисплей працює, SD ні. Перевірте lilka.sd, частоту SPI, MBR і FAT16/FAT32. Успішний Lilka::init не означає, що карта обов'язково є.
Перевірка самої документації
З кореня репозиторію:
python3 -m venv .venv-docs
.venv-docs/bin/pip install -r requirements-docs.txt
.venv-docs/bin/mkdocs serve
Для остаточної перевірки — .venv-docs/bin/mkdocs build --strict. Код навчальних програм вставляється прямо з examples/, тому після його зміни треба перевірити і збірку прошивки, і сторінку. На Windows executables цього venv лежать у .venv-docs\Scripts\.