Підготовка проєкту та код
Я сподіваюсь ви встановили все необхідне. Тепер треба отримати заготовку, яку можна спокійно скомпілювати, а потім вже дописувати своє. Одного main.rs тут недостатньо, адже no_std потребує ще налаштування target, лінкера та точки входу.
З чого зараз краще почати
У репозиторії є маленькі самостійні приклади. Для першого запуску беріть examples/basics/: дисплей, кнопка A і нічого зайвого.
З кореня своєї копії LilkaOxide:
Збірка не прошиває пристрій. Якщо все пройшло, подивіться повний код і очікуваний результат, а вже потім запускайте cargo +esp run --release --locked.
Чому саме з теки прикладу
Cargo шукає .cargo/config.toml від поточної теки вгору. У прикладах там заданий Xtensa target та лінкер. --manifest-path з кореня сам по собі не змушує Cargo прочитати конфігурацію всередині пакета.
А генератор шаблону?
Він є:
Але поточний шаблон ще має розбіжності з API, зокрема для async-ініціалізації та allocator без heap. Тому як перевірену початкову точку зараз використовуйте examples/basics/ або examples/async-counter/. Обрані в генераторі опції не означають, що це default features самого SDK.
Як зробити свій окремий проєкт
Можна скопіювати цілу теку прикладу за межі workspace та змінити name в Cargo.toml. Копіювати треба і приховану .cargo/, а не тільки src/. Для Linux/macOS, з кореня репозиторію:
У скопійованому Cargo.toml виправте залежність lilkaoxide: шлях ../../sdk-hal вже не веде в потрібне місце. Якщо вихідна тека називалась lilkaoxide, а нова лежить поряд з нею, буде path = "../lilkaoxide/sdk-hal". На Windows можна скопіювати теку звичайним файловим менеджером, включно з .cargo.
Також додайте профіль збірки, адже в репозиторії він задається спільним Cargo.toml, а в окремий проєкт сам не переїде:
Перший раз виконайте cargo +esp build --release без --locked, щоб створити власний Cargo.lock. Далі зберігайте його разом з прошивкою і використовуйте --locked, щоби випадкове оновлення залежностей не змінило результат збірки.
Що далі
Спочатку розберіться зі структурою проєкту, потім з features та конфігурацією. Після цього можна переходити до пам'яті, периферії та асинхронних задач.
Якщо код вже є, але щось не запускається — є окрема сторінка збірки та налагодження. Самі приклади показують завершені програми, а цей розділ пояснює, чому вони саме так влаштовані.