
Здесь о том, как с помощью Copilot перенести проект управляемой по CAN светодиодной матрицы с коммерческого ПО Keil uVision IDE и RTX RTOS на бесплатный Visual Studio Code с FreeRTOS. На борту — микроконтроллер STM32F103C4T6A с 6 КБ RAM и 16 КБ Flash.
Проект был сделан достаточно давно, но вот понадобилось его портировать на новые средства разработки в связи с моральным устареванием старых. Именно здесь мы и проверим, важна ли чистота кода, архитектура и прочие требования к «чистому коду» в современных реалиях, когда повсеместно торжествует ИИ.
Схема нашего устройства:

Устройство предназначено для промышленной автоматики, поэтому питается от 24 В. По CAN оно получает команды о том, какие символы отображать. DIP-переключателями настраивается адрес устройства на шине CAN и ориентация изображения на матрице.
Так выглядит плата:

Старый софт был написан «грязно», на скорую руку, с прямым обращением к регистрам, магическими константами и битами, игнорируя HAL. Компилятор Keil 6-й версии уже не компилировал этот проект.
Неделю назад у VS Code c Copilot появился новый агент — Claude Sonnet 4. Он сразу показал исключительные способности: гораздо лучше понимал исходники, чем все остальные шесть агентов, доступные по подписке Pro в GitHub. Внимание зацепило то, что Claude Sonnet 4 лучше остальных понимал систему сборки, правильно запускал сборку с Ninja и хорошо парсил лог сборщика. Затем он сам исправлял по полученному лог-файлу ошибки, вновь запускал сборку и продолжал работу.
Сразу остужу энтузиастов, которые хотят писать прошивку, не освоив основы программирования микроконтроллеров: Claude Sonnet 4 не напишет проект такого уровня, как наш, с нуля. Он может просто зависнуть, когда ему предлагают слишком большой контекст: чем больше файлов нужно сгенерировать, тем больше итераций требуется. При этом итерации тратят квоту, и Claude Sonnet 4 начинает останавливаться с предупреждением о превышении лимита запросов. То есть проблема не в квалификации разработчика, а в том, что пока такая разработка «с нуля» выходит очень медленной и дорогостоящей. Не знаю, как долго эта ситуация останется актуальной.
Итак, был выбран следующий план портирования:
Выполнить всю конфигурацию периферии в STM32CubeMX. От старого проекта конфигурацию не брать. Добавить FreeRTOS к проекту. Сгенерировать CMake проект.
Удалить исходники RTX и старого BSP.
Если в STM32CubeMX непонятно, как задавать, например, константы биттайминга CAN, то сделать скриншот и передать его ChatGPT o3. Он точно рассчитывает все константы. Копировать их в STM32CubeMX.
Из STM32CubeMX сгенерировать проект для CMake. В CMake я, конечно, ничего не понимаю, но Claude Sonnet 4 знает, как работать с CMake идеально: он подсказал, что нужно скачать STM32Cube CLT и какие расширения добавить в VS Code.
В VS Code по подсказкам Claude Sonnet 4 настроить файл cmake/gcc-arm-none-eabi.cmake и всё такое (о чём у меня было смутное представление), а также таски и конфигурации для запуска сборки (как же всё запутано в этом опенсорсе).
По подсказкам Claude Sonnet 4 заменить в коде вызовы API RTOS RTX на вызовы FreeRTOS.
Спустя 11 часов работы всё было сделано. Был сгенерирован подробный отчёт по развертыванию, запуску и модификации проекта. За это время руками писать код не пришлось ни разу! Несколько раз я просто перемещал код из одного места в другое, потому что в то время Claude Sonnet 4 отказывался работать из-за превышения лимита запросов.
По поводу отладки.
Да, Claude Sonnet 4 несколько раз делал логические ошибки. Например, когда он перенёс API семафоров с RTX на FreeRTOS, он забыл вставить освобождение семафоров в нескольких ветках обработки ошибок, что вызывало deadlock. Но он сам его позже и нашёл. Также случалось, что он сбрасывал регистр, а в следующей функции снова пытался что-то прочитать из обнулённого регистра. После указания на эту проблему он тоже всё исправлял. Очень помогает тщательное документирование и дотошные комментарии, которые Claude Sonnet 4 может автоматически вставить в исходники. В целом отладка заняла рекордно мало времени для проектов такого уровня: даже с базовыми средствами отладки VS Code победить все баги удалось быстро.
Как бонус: Claude Sonnet 4 сгенерировал дополнительные символы и нужные ремаппинги для отображения символов, необходимых в разных регионах.

Весь проект включая дизайн платы здесь - https://github.com/Indemsys/LedMatrix_8x8_Control
Комментарии (7)
bsv581
01.06.2025 15:52И в чем тут профит от использования ИИ? Нормальный разработчик за один рабочий день выполнит такое портирование.
А вы, получается, так и не изучите cmake с такими помощниками.
Indemsys Автор
01.06.2025 15:52Сами же и ответили. Не пришлось искать нормального разработчика. Был только ненормальный без знания cmake. И все получилось.
BobovorTheCommentBeast
Проект "такого" уровня? Но это же энтерпрайз физбаз от мира эмбеддеда. Без обид разработчикам и со всем уважением к ним - это просто слейв с одной задачей.Виноват, не так прочитал.
Не страшно, что некоторые очевидные при написании, но неочевидные при переносе вещи, вроде той же работы с семафорами за ним можно проглядеть?
Indemsys Автор
Я думаю, что ошибка с семафором осталась только от того что была маленькая квота на запросы. И приходилось пока не пройдет заданное время ожидания самому глазами проверять код. Я не мог просто последовательно ему командовать перепроверить все функции. Да и файл инструкций не применял. На скорую руку все делал.
Семафоры, кстати, мне потом Coipilot предложил убрать и убрал. А это, как понимаете, замах на архитектуру. Сэкономил намного Flash памяти.