Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава б. Основы программирования МКAVR 129 (теперь) они позволяют писать универсальные программы, например, для разных контроллеров . Но я этого делать не советую, потому что логика таких программ бывает слишком запутанная, разобраться в них сложно, а наделать ошибок легко. В некоторых простых случаях, однако, эти директивы бывают полезны - пример использования условной компиляции для выбора из двух вариантов вы найдете в главе 16. Рассматривать другие директивы мы здесь не будем, т. к. без них в большинстве случаев можно обойтись (интересующихся отсылаю к описанию АVR-ассемблера [3 ,4] или к пособию [ 1 1 ] ) . Подведем некоторый итог: мы уже узнали многое о структуре типовой ассемблер ной программы для AVR. Текст должен начинаться с директивы . include, ссылаю щейся на файл с определениями имен для конкретного процессора, далее обычно идут пользовательские определения переменных (директива . def ) и констант (директива . equ ) , а программа должна начинаться с безусловного перехода на мет ку RESET. Начало собственно программы будет располагаться сразу после этой мет ки где-то в другом месте программы. А почему так странно - нельзя ли начать прямо сразу с нулевого адреса, строка за строкой, зачем нужны какие-то переходы? Можно, отвечают нам авторы описаний АVR. Простейшая программа может начинаться с нулевого адреса, и никаких пере ходов не потребуется, но только в одном случае : если мы обязываемся отказаться от прерываний. Мы далее встретим несколько примеров программ, которые совсем не используют прерываний, и увидим, что нередко они все равно начинаются с пе рехода на метку RESET - так просто удобнее . Оформление вызова подпрограмм Это, наверное, самая простая тема во всем введении в ассемблер, потому что со держит очень немного оговорок, касающихся особенностей разных типов АVR. В общем виде это выглядит примерно так: если у вас есть какой-либо повторяю щийся участок кода, то вместо того, чтобы его копировать много раз, следует запи хать его в подпрограмму (процедуру), а потом вызывать каждый раз, когда потре буется. Пусть у нас есть некая программа, которая требует несколько раз в разных местах осуществить задержку на строго определенное время . Тогда саму задержку целесо образно оформить в виде подпрограммы (как это реализовать в действительности, мы рассмотрим далее) и вызывать, когда потребуется (листинг 6 . 3) . ; процедура Delay Delay : <код, осуществляющий задержку> ret
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==