Два примера работы метапрограммы из недавних проектов: 1. Конфигурирование ножек на AVR. Тут задействовано 9 ног на трёх портах. Класс рассортировал все ножки по портам, добавил к ним те которые остаются неизменными, вычислил значения для регистров DDRx и PORTx и сделал запись только в те которые меняют своё значение относительно начального значения (PORTB он решил не трогать). Одной командой фактически 8*3 ножек задано.
![](/files/1388924/lmpb6.png)
Пример с AVR простенький для понимания происходящего.
Вот посложнее.
2. Конфигурирование ножек на STM32F777. Тут точно так же одной командой конфигурируется 5 портов по 16 ног (56 явно и 34 дефолтными значениями)
![](/files/1388924/4x3p7.png)
Логика примерно та же, но проверок и оптимизаций больше: отсортировать пины по портам, добавить незадействованные пины, вычислить значения регистров GPIO (названия даже помнить не хочу, пусть компилятор этим занимается), в зависимости от режимов определить только необходимые для записать регистры, оптимизировать 8/16/32-битный доступ к регистрам. Ну и записать всё это одним разом без всяких R-M-W. Ни один HAL такого не сделает. Можно повторить ручками, но умумукаешься считатать. А если что поменял - пересчитывай заново. Компилятор же не устаёт и делает это всё за доли секунды. К тому же ещё и ошибки проверит, например, не копипастнул ли я где одну ножку два раза. Листинг результата.
![](/files/1388924/uh490.png)