Skip to content

Підготовка проєкту та код

Я сподіваюсь ви встановили все необхідне. І треба згенерувати заготовку проєкта яке можна спокійно зкомпілювати.

cargo generate --git https://gitlab.com/imbiruss/lilkaoxide.git template

При створенні з шаблону, опції будуть обиратись в своєму стандартному виборіб а саме: буфер дисплея 8092; Шина SPI RefCellBus; без Alloc; без async(тобто однопотоковий код); без ініціалізації радіо.
Це саме мінімальне що можна зробити.

І тут буде вибір важливих опцій які дадуть кінцевий результат заготовки, почнемо:

display_buffer

Буде вибір між такими розмірами програмного буферу як 512, 1024, 8192(default), це обов'язкова умова для mipi-dsi бібліотеки що дає підтримку дисплея.

Bus(тип шини SPI)

Через правила пам'яті Rust, необхідно користуватись різними запобіжниками що би не виникло проблем, і вибір реалізації шини залежить від умов в яких буде користуватись.
- RefCellBus(default) - вибирати при умові якщо код дисплею та SD карти працює в одному потоці та контексті, не використовувати коли ці два об'єкти використовуються в різних областях та контекстах, тобто при перериваннях, async та іншому ядрі не використовувати, інакше буде Runtime panic.
- CriticalSectionBus - вибирати коли вже потрібно використання девайсів на шині в перериваннях, та іноді в async. АЛЕ в асинхронних задачах якщо задовбати шину транзакціями, то може бути непрацездатність. Також якщо у вас довгі операції на SPI то можуть пропускатись інші переривання.
- AtomicBus - універсальний варіант, більш менш працює прекрасно в обох варіантах, і в теорії працює швидше CriticalSection. Також тут є помилка Busy коли шина зайнята якоюсь операцією, варто взяти цей факт до уваги.
- AsyncBus - вибирати коли не хочеться паритись і коли вам треба повний async варіант, при умові якщо весь код у вас під async середовищем.

Приблизна таблиця при яких умовах/feature треба вибирати шину:

Blocking Async
RefCell 🚫
CriticalSection Можливо
Atomic
Async 🚫

Alloc

Потрібні тільки для типів даних що потребують аллокацій та radio периферії(для неї це обов'язково). Значення false є default

Async

Використання async середовища embassy та esp-rtos. Значення false є default

Radio

Використання esp-radio та самої радіопериферії. Потребує alloc та async. Значення false є default

Після всього цього проєкт готовий, і можна писати ігрульки.