Макрос — это набор команд и инструкций, которые группируются в единую команду для автоматизации задач программирования, ускорения часто выполняемых действий редактирования и форматирования.
Также Макросы могут использоваться для ускорения разработки программного обеспечения для микроконтроллеров на языке программирования Assembler . В процессе компиляции Макросы заменяются на последовательности команд микроконтроллера. Подобный подход к программированию позволяет облегчить восприятие программного кода, уменьшить размер исходников, а также приблизить программирование на Assembler по внешнему виду к языку программирования C .
Запись Макроса
Макрос на языке программирования Assembler состоит из следующих частей:
- .macro - директива начала макроса, после объявления макроса в той же строке объявляется имя этого макроса;
- .endm - директива окончания макроса;
- @0 - запись переменной;
- Тело макроса .
Запись макроса для микроконтроллера AVR может выглядеть следующим образом:
; Макрос вывода в порт или регистр порта .macro outi ; Директива макроса с объявлением имени макроса ldi r16, @1 ; Установка значения в регистр out @0, R16 ; Вывод данных в порт или регистр порта .endm ; Окончание макроса
Применение данного Макроса будет выглядеть следующим образом:
outi DDRB, 0b01111111 ; Инициализация вывода столбцов развертки индикации outi DDRC, 0b00111111 ; Инициализация вывода строк развертки индикации outi DDRD, 0b00000001 ; Инициализация вывода для активации сигнала будильника outi PORTD, 0b11111111 ; Инициализация PD1 - PD7 в режиме PullUp
В данном случае Макрос вызывается по своему имени outi. На первом месте @0 находится регистр DDRB, а на втором @1 находится переменная 0b01111111 , которая записывается в данный регистр. То есть фактически применение макроса выглядит следующим образом:
outi @0, @1, @2 ... @N
В процессе компиляции программного кода препроцессор выполняет подстановку данных в макрос и его инкапсуляцию в программный код. Макрос в данном случае похож на функцию или подпрограмму, которая вызывается командой rcall (или иными) с тем отличием, что подпрограммы вызываемые командой rcall могут присутствовать в прошивке микроконтроллера в единственном экземпляре, тогда как макрос является просто удобной вставкой программного кода в исходник и соответственно может приводить к значительному увеличению размера прошивки микроконтроллера. Тогда как применение подпрограмм не вызывает такого увеличения прошивки, но с их применением необходимо решать другие проблемы, например, ограниченность диапазона вызова команды rcall в памяти микроконтроллера и соответственно создание островков перехода из одной области памяти микроконтроллера в другую, что может привести к усложнению программного кода.