|
||||||||||
Макросы в Ассемблере AVR Studio
Время создания: 02.12.2021 17:33
Раздел: Компьютер - Программирование - Ассемблеры - Архитектура AVR - Ассемблер в AVR Studio
Запись: xintrea/mytetra_syncro/master/base/1638455613yte5hn7rd4/text.html на raw.github.com
|
||||||||||
|
||||||||||
По своей сути макрос является обыкновенным шаблоном для подстановки исходного кода. Применение макросов оправданно в тех случаях, когда в программе часто встречается похожие последовательности команд, но при этом имеющие различные параметры. Каждый макрос нужно предварительно объявить в разделе описания переменных. Объявление макроса имеет вид типа:
В дальнейшем макрос можно будет использовать неограниченное число раз, простой подстановкой его имени в текст программы. За именем макроса через запятую могут последовать несколько параметров (до 10). В самом теле макроса ссылка на параметры производится через символ “@”, после которого идет порядковый номер (@0…@9). Так, например, может выглядеть макрос, реализующий вычитание содержимого регистровой пары с 16-разрядным числом
На месте употребления в программе макроса
будет сгенерирован следующий код подстановки:
В макросах часто применяются директивы условной компиляции, такие как .else, elif, .endif и т.д., а также .message, .warning и .error. С их помощью можно производить подстановку различных фрагментов кода в зависимости от начальных значений входных параметров, а также выявлять ошибки, выдавать сообщения и предупреждения в ходе компиляции программы. На листинге ниже показан макрос pulse_low, формирующий на одном из выводов импульс низкого уровня.
Макрос принимает 3 значения: адрес регистра данных порта (PORTB, PORTC или PORTD), номер линии ввода-вывода (0…7) и двухбайтовую константу, определяющую длительность задержки (0…65535). В нутрии макроса производится проверка адреса порта. Если в качестве порта был задан PORTC (адрес регистра PORTС = 0x18), то будет выдано сообщение о том, что в модели ATmega8 этот порт содержит только 7 линий ввода-вывода. И если, кроме этого, будет выбрана линия 7 (произойдет попытка обратиться к несуществующему биту) – из-за ошибки сборка проекта будет приостановлена. Дополнительную проверку на переполнение проходит, и параметр задержки времени. В случае если его значение превышает 0xFFFF, будет выдано предупреждение. Все метки в теле макроса, как, например, метка loop в макросе pulse_low, являются локальными. Область их видимости ограничена директивами .macro и .endm. В ассемблере AVR допускается использование макросов в макросе (до 8 уровней вложения). |
||||||||||
Так же в этом разделе:
|
||||||||||
|
||||||||||
|