Как перестать писать на Asm и начать использовать C++ для STM32?
Суть проблемы в том, что мне в наследство достался достаточно большой архив ПО на Asm для микроконтроллеров семейства AVR8. В дальнейшем борьба за микросекунды привела нас к миграции на STM32 с использованием всё того же ассемблера. Во-первых, специфика работы подразумевает сокращение времени исполнения основного кода до минимума, во-вторых, ассемблер субъективно мне понятней и ближе. В данный момент задач становится всё больше, логика запутывается всё сильнее, обслуживать разросшийся код становится всё сложнее.
Хотелось бы надеяться, что плавный переход на C, C++ и дальнейшее использование RTOS и кусков ассемблерного кода изменят ситуацию, но тут-то и возникает основная проблема. В данный момент ST предлагает использовать для разработки CubeIDE с применением HAL. Помимо этого существуют StdPeriph, CMSIS и, подозреваю, целая куча других библиотек (QnA два года назад предлагали LibOpenCM3, например). Что же всё-таки выбрать в данной ситуации? Хочется и быстрого кода, и удобного управления кучей событий и прерываний, и читаемости.
Если слишком много "узких" мест - возможно надо не тратить время на оптимизации и счет тактов, а взять FPGA или SoC и сделать специальную периферию под задачу? А в ядре или внешнем контроллере уже крутить алгоритмы, не требующие такой жесткой привязки к реальному времени. Опишите подробнее задачу, может подскажу как это можно решить.
Да, такой вариант рассматривался, но из-за малых серий устройства и трудностей внесения правок в документацию (согласующих и оформляющих сильно больше, чем разработчиков) менять конструктив не очень хочется. В данный момент основная проблема - параллельное использование всех трёх SPI микроконтроллера, с разными скоростями и размерами слов. Это, скажем так, основная задача. Помимо этого в фоновом режиме необходимо анализировать два-три АЦП, посматривать на некоторые внешние пины и т.п.
DMA вам в помощь. По крайней мере точно SPI и скорее всего АЦП можно пустить через него. Чтоб привязать все ко времени - надо запустить таймер и все прерывания привязать к нему. Ну а пины можно либо тоже прерываниями сделать, либо читать таймером.
В данный момент примерно так и происходит процесс оптимизации. Проблема больше в том, что при использовании большого количества периферии, часто параллельном использовании, код становится мало того, что не читаемым (ещё более не читаемым, чем обычно на ассемблере), но и трудноуправляемым. Кажется логичным перейти на язык более высокого уровня и, в конечном итоге, использовать RTOS.
unk1500, Основная проблема с С++ в микроконтроллерах это неопределенное или слишком большое время вызова некоторых конструкций. Так что навороченный код только добавить головной боли.
С++ как раз таки очень хорошо подходит микроконтроллерам и узким местам, особенно с шаблонами и constexpr. У меня у самого есть подобные проекты где очень важна скорость и с++ идеально туда вписывается. Так же у CubeMX есть параметр чтобы вместо HAL генерировался LL, методы которого, по сути, сразу компилируются в чтение/запись без всего лишнего
Жаль, что так много людей этого не понимают и почему-то считают плюсы оверхедом