Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

138 Часть 11. Программирование микроконтроллеров АVR на ассемблере дельно, указанием разновидности используемой платы через меню. А вот далее все так же: сначала идут включаемые файлы через директиву #include , потом определе­ ния имен переменных (в немного отличающейся форме, потому что обязательно ука­ зывается тип) и констант. В последнем случае применяется либо та же директива (псевдооператор) #de fine , либо специальное служебное слово const. У нас не встре­ тишь только одного почти обязательного компонента Агdui по-программы - в случае использования библиотек С++ их надо инициализировать , создавая экземпляры объ­ ектов, а у нас такие библиотеки отсутствуют. Потом в Aгduino обычно идут тексты ис­ пользуемых функций (которые здесь у нас носят более корректное название подпро­ грамм или процедур) - и у нас далее будет точно так же. Среди этих функций есть две главные, которые встречаются практически в любой Агdui по-программе : setup ( ) и loop ( ) . В случае АVR-ассемблера все начальные установки будут делаться в начале программы (после метки Reset , так что эту метку можно считать неким аналогом setup ) , а заканчиваться программа будет также бесконечным циклом , пустым или со­ держащим выполняемые команды. Вообще любая законченная программа в мире, которая должна работать сколько­ нибудь продолжительное время , представляет собой подобный бесконечный цикл, в который она переходит после некоторой начальной инициализации при включении. Примеры на виду: скажем, и вся ОС Windows в целом, и каждое из ее приложений в отдельности представляют собой такой цикл . Исключением являются однократно выполняемые алгоритмы , которые срабатывают один раз после включения и потом останавливаются . Примеров таких программ тоже не счесть : это, скажем , стиральная машина, которая с точки зрения математика является автономным конечным автома­ том 1 - она выполняет заданную последовательность действий и останавливается . Все подпрограммы (процедуры , функции) также относятся к таким примерам, незави­ симо от того, автономный конечный автомат они собой представляют или нет, - во втором случае подпрограмма просто имеет несколько (иногда даже очень много) ва­ риантов действий в зависимости от каких-то внешних событий . Но чтобы программа в целом могла выполнять что-то полезное долгое время , все такие процедуры-под­ программы обычно связаны с неким главным циклом , где по нужным событиям вызы­ ваются те или иные алгоритмы их обработки . Причем в простейшей программе такой вызов осуществляется просто переходом по некоему условию (вспомните прямо­ угольнички-ромбики в типовых блок-схемах программ) , а в реальности их часто проще и надежнее делать с помощью прерываний - по сути это то же самое, но проверка условий и сам переход осуществляются аппаратно , оставаясь для основной програм­ мы «за кадром» . Именно в этом моменте будут отличаться наши ассемблерные про­ граммы от обычно предлагаемого подхода в Aгduino - там все в основном предлага­ ется делать в главном цикле, а у нас - по большей части в прерываниях. И спользование макросов Макросом н аз ывается средство, которое позволяет упаковать в единую конструк­ цию сразу несколько команд или действий пользователя и вызывать их одной командой или действием. Макросы широко распространены в профессиональных программах и в компьютерных играх. Как то л ько кто-то преодолевает свою при- 1 Чтобы не запутать читателя, следует пояснить, что здесь термин «конечный автомат» используется в абстрактно-математическом смысле, как синоним понятия алгоритма (известная машина Тьюринга есть пример такого конечного автомата). В программировании этим термином часто называют просто один из способов создания программ, реализующих некую сложную логическую функцию с различ­ ными действиями для различных состояний входа.

RkJQdWJsaXNoZXIy MTExODQxMg==