Главная » Микроконтроллеры
Призовой фонд
на октябрь 2017 г.
1. Термометр Relsib WT51
Рэлсиб
2. 1000 руб
PCBWay
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

Макросы

По своей сути макрос является обыкновенным шаблоном для подстановки исходного кода. Применение макросов оправданно в тех случаях, когда в программе часто встречается похожие последовательности команд, но при этом имеющие различные параметры.   

Каждый макрос нужно предварительно объявить в разделе описания переменных. Объявление макроса имеет вид типа:

       .macro {имя макроса} 
        .
         текст для подстановки
        .
       .endmacro или .endm                                     

В дальнейшем макрос можно будет использовать неограниченное число раз, простой подстановкой его имени в текст программы. За именем макроса через запятую могут последовать несколько параметров (до 10). В самом теле макроса ссылка на параметры производится через символ “@”, после которого идет порядковый номер (@0…@9). Так, например, может выглядеть макрос, реализующий вычитание содержимого регистровой пары с 16-разрядным числом

         .macro add16        ;объявление макроса add16
           subi @1,low(-@2)  ;вычитаем из регистровой пары @0:@1 16-разрядное
           sbci @0,high(-@2) ;число @2 в дополнительном коде
         .endm                                   

На месте употребления в программе макроса

.
add16 XH,XL,0x1234    ;вычитание XH:XL с 16-разрядным числом 0x1234
.            

будет сгенерирован следующий код подстановки:

subi R26,0xCC ;XH:XL = XH:XL - 0xEDCC
sbci R27,0xED        

В макросах часто применяются директивы условной компиляции, такие как .else, elif, .endif и т.д., а также .message, .warning и .error. С их помощью можно производить подстановку различных фрагментов кода в зависимости от начальных значений входных параметров, а также выявлять ошибки, выдавать сообщения и предупреждения в ходе компиляции программы. На листинге ниже показан макрос pulse_low, формирующий на одном из выводов импульс низкого уровня.

.macro pulse_low      ;объявление макроса pulse_low        
     .if @0 == 0x18   ;если параметр @0 порта C, то выводим сообщение
     .message "Порт C содержит только 7 линий ввода-вывода."
      .elif @1 == 7   ;если параметр @1 линия 7, то выводим ошибку
      .error "Линия 7 порта C отсутствует в модели ATmega8!" 
     .endif
     .if @2 > 65535   ;если параметр @2 больше 2 б, то выводим предупреждение
     .warning "Слишком большая задержка времени!"
     .endif 
      cbi  @0,@1      ;устанавливаем лог.0 на линии @1 порта @0
	ldi  R24,low(@2);заносим в счетчик циклов R25:R24 значение @2
      ldi  R25,high(@2)
loop:	sbiw R24,1      ;производим цикл вычитания
      brne loop
      sbi  @0,@1      ;устанавливаем лог.1 на линии @1 порта @0
.endm
̣̣̣̣̣̣̣̣
pulse_low  PORTB,PB0,10000  ;импульс на линии 0 порта B около 40000 циклов
.

Макрос принимает 3 значения: адрес регистра данных порта (PORTB, PORTC или PORTD), номер линии ввода-вывода (0…7) и двухбайтовую константу, определяющую длительность задержки (0…65535). В нутрии макроса производится проверка адреса порта. Если в качестве порта был задан PORTC (адрес регистра PORTС = 0x18), то будет выдано сообщение о том, что в модели ATmega8 этот порт содержит только 7 линий ввода-вывода. И если, кроме этого, будет выбрана линия 7 (произойдет попытка обратиться к несуществующему биту) – из-за ошибки сборка проекта будет приостановлена. Дополнительную проверку на переполнение проходит, и параметр задержки времени. В случае если его значение превышает 0xFFFF, будет выдано предупреждение.

Все метки в теле макроса, как, например, метка loop в макросе pulse_low, являются локальными. Область их видимости ограничена директивами .macro и .endm. В ассемблере AVR допускается использование макросов в макросе (до 8 уровней вложения).

Перейти к следующей части:

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
Владимир #
Объясните почему в первом макросе параметр 2 подставленный в функции low и high написан с минусом ( -@2), а во втором без.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Конструктор для сборки: предусилитель на лампе 6N3 Металлоискатель MD3010II
вверх