Evgenii Legotckoi
01 вересня 2015 р. 07:00

Макро Ассемблер на прикладі AVR

Макрос — це набір команд та інструкцій, які групуються в єдину команду для автоматизації завдань програмування, прискорення часто виконуваних дій редагування та форматування.

Також Макроси можуть використовуватись для прискорення розробки програмного забезпечення для мікроконтролерів мовою програмування Assembler . У процесі компіляції Макроси замінюються на послідовності команд мікроконтролера. Подібний підхід до програмування дозволяє полегшити сприйняття програмного коду, зменшити розмір вихідних джерел, а також наблизити програмування на Assembler на вигляд до мови програмування C .


Запис Макроса

Макрос мовою програмування Assembler складається з наступних частин:

  1. .macro - директива початку макросу, після оголошення макросу у тому рядку оголошується ім'я цього макроса;
  2. .endm – директива закінчення макросу;
  3. @0 - запис змінної;
  4. Тіло макросу .

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

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up