Макрос — це набір команд та інструкцій, які групуються в єдину команду для автоматизації завдань програмування, прискорення часто виконуваних дій редагування та форматування.
Також Макроси можуть використовуватись для прискорення розробки програмного забезпечення для мікроконтролерів мовою програмування 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 в пам'яті мікроконтролера і створення острівців переходу з однієї області пам'яті мікроконтролера в іншу, що може призвести до ускладнення програмного коду.