- BrainTools - https://www.braintools.ru -

LLM уверенно врёт про ваш микроконтроллер

Embedded-development (или разработка встраиваемых систем) – это такая сфера, где паяльник и IDE находятся ближе всего. Естественно, туда пришёл ИИ: попросишь модель написать прошивку – выдаёт аккуратный код. Компилируется с первого раза, заливается без ошибок. Но внезапно, экран показывает цветной шум.

И код тут ни при чём. Внутри этого дисплея стоит контроллер ST7789, рассчитанный на матрицу 240×320, а стекло на плате обрезанное, 172×320: тот же чип, но видимые пиксели занимают только центральную часть его памяти [1]. Поэтому драйвер обязан смещать область записи на 34 пикселя – без этого картинка уезжает вбок, треть контента уходит за край стекла, а с другого края лезет мусор. Плюс панель требует инверсии цвета и порядок от старшего к младшему байту. Этого нет ни в одном туториале: это припрятано в вики производителя между двумя предупреждениями мелким текстом. Модель туда не заглядывала.

Знакомо? Проблема не в том, что LLM глупые. Проблема в том, что знание о конкретной плате размазано тонким слоем по даташиту на стопицот страниц, мануалу на алике на китайском и вечеру отладки, который вы на это потратили. И у модели этого всего нет.

И как видите: плат на текущий момент целый зоопарк

И как видите: плат на текущий момент целый зоопарк

Зоопарк молчаливых фейлов

  • У Waveshare ESP32-C6-LCD-1.47 дисплей и слот microSD сидят на одном SPI – MOSI (GPIO6) и SCLK (GPIO7) общие. Модель, не знающая этого, спокойно разведёт их по разным шинам и получит конфликт [2] на шине, который будет выглядеть как плохой контакт или дохлая карта памяти.

  • На Raspberry Pi Pico пины GPIO23, 24, 25 и 29 – самые настоящие GPIO в коде, но их физически нет на 40-пиновом разъёме. Проект с ними компилируется, заливается, “работает”, а на макетке ничего не происходит, и вы часами ищете проблему в прошивке c красными глазами.

  • У ESP32 канал ADC2 полностью занят Wi-Fi, пока радио работает просто возвращает таймаут. Схема с аналоговыми датчиками на ADC2 не работает без единого объяснения – и узнать это из кода невозможно.

  • Частота на 100 МГц (нужно 96 МГц) молча убивает USB самого STM32F411, а HAL_Delay() вешает плату, потому что кто-то должен был вручную определить SysTick_Handler – но об этом почти нигде не написано.

    И много чего ещё…

Как это решать?

Я начал собирать открытую коллекцию скиллов [3] для Claude Code – по одному скиллу на плату. Добавляю пока те, что у меня есть у меня коллекции (на фото выше). Скилл – это каталог с несколькими файлами, который Claude Code подгружает сам, когда вы работаете с соответствующей платой. Внутри только то знание, которого у модели нет, в трёх слоях:

  • SKILL.md – выжимка, которая читается всегда: карта пинов, характеристика чипа и правила, предотвращающие дорогие ошибки [4];

  • reference/ – глубокие детали, подгружаются по необходимости: полная разводка пинов с альтернативными функциями, периферия, таблица подводных камней;

  • template/ – полностью рабочий проект, который собирается и шьётся. Каждая строчка вытащена из него, а не написана по памяти.

По сути, это проблема нехватки контекста. Агент неплохо знает семейство микроконтроллеров – даташиты у него есть, но про вашу конкретную плату не знает ничего: как разведены пины, какое тактирование реально заводится, какие вызовы HAL молча не работают. Идея репозитория: собрать это знание – из даташитов, вики вендора и самостоятельной отладки на живом железе и запаковать в скиллы для агентов. Web Search MCP частично спасает, но гуглить на каждый чих – это сжечь контекст, а в довесок ещё и наловить туториалов для соседней ревизии платы.

Сейчас в репозитории 8 плат: два STM32, четыре ESP32, классический любимый всеми Arduino Nano на ATmega328P и Raspberry Pi RP2040.

Как этим пользоваться

git clone https://github.com/alexex1993/mcu-skills.git
cd mcu-skills
./scripts/install.sh --list
./scripts/install.sh stm32f411-blackpill

Дальше скилл подхватывается сам, когда вы работаете с этой платой в Claude Code (или по явному вызову, например /stm32f411-blackpill). Можно поставить и в область конкретного проекта просто скопировать каталог в .claude/skills/ внутри проекта с прошивкой.

Для старта нового проекта не надо собирать всё руками. В шаблоне есть готовые примеры на которых удобно собрать проект.

Теперь юзает скилл

Теперь юзает скилл

А теперь про длинный проект

Настоящая боль [5] embedded-разработки – проекты длиной в месяцы, где архитектура разрастается: FreeRTOS с кучей задач, свои драйверы, датчики на трёх шинах, и всё это делит между собой пины, таймеры, DMA-каналы и прерывания. Вот тут знание контекста решает больше, чем умение писать код.

Проблема: у ИИ амнезия, а у вас – нет. Каждая сессия с ассистентом начинается с чистого листа. На второй неделе проекта вы уже помните, что таймер 2 отдан под ШИМ подсветки, SPI2 делят дисплей и карта памяти, а A0/A1 заняты под аналоговый фронтенд. Модель – нет. И вы либо заново объясняете это в каждом диалоге (полчаса ритуалов перед каждой задачей), либо узнаёте о конфликте, когда свежесгенерированный драйвер спокойно перехватывает пин у рабочего модуля – и всё выглядит как будто само сломалось.

Скилл ломает этот цикл, потому что живёт не в чате, а в репозитории:

1. Знание переживает сессии. Скопируйте скилл в .claude/skills/ внутри проекта и каждая новая сессия, каждая задача, каждый вопрос начинается не с нуля, а с базы знаний о железе.

2. Знание версионируется вместе с кодом. Файлы скилла лежат в git рядом с прошивкой. Нашли новую граблю на шестой неделе проекта – дописали правило в скилл (можно кстати агента попросить это сделать), закоммитили. Теперь это знание доступно каждому в команде и каждому новому диалогу. Знание перестаёт жить в голове у одного человека и в логах мессенджеров оно становится артефактом проекта, как код.

3. Знание задаёт контракт с железом. Сложная встроенная архитектура – это в первую очередь разделение конечных ресурсов между модулями. Конфликты за эти ресурсы – особый класс багов: компилятор их не ловит, проявляются они далеко от причины. Скилл фиксирует, что чем занято и модель перестаёт предлагать код, нарушающий раздачу. Фактически это односторонний интерфейс между вашей архитектурой и платой: как API, только про железо.

4. Контекст расходуется осознанно. Скилл устроен как матрёшка: короткая выжимка читается всегда, тяжёлые справочники подключаются только когда задача их касается. На длинных проектах, где в контексте и так много вашего кода, это критично: туда не тащат огромный даташит, туда тащат ответ на конкретный вопрос.

5. Онбординг ускоряется – людей и сессий. Агент читает и делает так как это задумал производитель в даташите.

Честная оговорка: скилл хранит знание о плате, а не об архитектуре вашего приложения – проектные конвенции живут отдельно, в AGENTS.md репозитория. Но граница проходит ровно там, где должна: скилл – это контракт с железом, и его можно развивать вместе с проектом – скопировали, дописали свои занятые ресурсы и найденные грабли, и база знаний растёт вместе с прошивкой.

Мои любимые те что с экранчиками

Мои любимые те что с экранчиками

Планы и как помочь проекту

Планы расширять количество плат и скиллов в репозитории.

Хочется контрибьюторов. Пайплайн описан в репозитории: найдите спеку (даташит для платы), соберите hello world или мигалку, реально запускаемую на железе, и пишите скилл с того, что узнали (или попросите агента написать). Лучшие скиллы – про платы, на которых вы уже обжигались.

Автор: Alexex14

Источник [6]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/34887

URLs in this post:

[1] памяти: http://www.braintools.ru/article/4140

[2] конфликт: http://www.braintools.ru/article/7708

[3] скиллов: https://github.com/alexex1993/mcu-skills

[4] ошибки: http://www.braintools.ru/article/4192

[5] боль: http://www.braintools.ru/article/9901

[6] Источник: https://habr.com/ru/articles/1076082/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1076082

www.BrainTools.ru

Rambler's Top100