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

Глава 7. Система команд АVR 1 65 самые безусловные переходы на метку, но отличаются от команд безусловного пе­ рехода тем, что в момент перехода к процедуре контроллер автоматически сохра­ няет в стеке адрес текущей команды, чтобы потом знать, куда вернуться (потому длительность выполнения этих команд на такт больше, чем для простого перехо­ да, - об этом рассказано далее). А как МК «узнает», когда именно нужно возвра­ щаться? Для этого каждая процедура-подпрограмма заканчивается специальным образом - не отличаясь сначала ничем от любого другого участка программного кода, обозначенного меткой, в месте возврата она содержит команду ret (от retum, возврат). По этой команде МК извлекает из стека сохраненное содержимое счетчика команд и продолжает выполнение прерванной основwой программы. ПОДРОБНОСТИ Кстати , хочу обратить ваше внимание, что никто не запрещает записать команду rjmp о , передав тем самым управление самой первой команде программы, находящейся по нулевому адресу. Вы уже сообразили , что это полный аналог того , что называется программной («горячей») перезагрузкой , - запуска программы на выполнение заново . В отличие от аппаратного сброса Reset (по включению питания, внешнему импульсу или по срабатыванию сторожевого таймера) , программная перезагрузка , во-первых, происходит без задержек, во-вторых, сохраняет все регистры (и РОН , и РВВ) , а также память SRAM, в неприкосновенности - в том состоянии , в котором их застал момент перехода. Я с трудом могу себе представить случай , когда такой прием может пона­ добиться в простой однозадачной системе, - возможно, как простой вариант выхода из ситуации с недопустимым сочетанием каких-то условий (в результате, например, ошибочных действий пользователя) . В обычных случаях (при зависании программы, например) все равно выручает только аппаратная перезагрузка . Но возможность эту надо иметь в виду. Аналогично обрабатываются прерывания - только специальной команды, как вы знаете, там нет, вызов производится обычным переходом rjmp (или jmp), но по­ скольку он осуществляется с определенного адреса (там, где стоит вектор прерыва­ ния), то контроллер делает то же самое - сохраняет в стеке адрес командного счетчика, на котором выполнение основной программы было грубо нарушено, начинает выполнять прерывание и ожидает команды возврата - только здесь она записывается как reti (retum interrupt) - в отличие от ret, эта команда еще и вос­ станавливает состояние флага прерываний r в регистре SREG. Укажем еще, что простой переход r jmp выполняется за 2 такта ( jmp за 3), вызов rcall - за 3 такта (call за 4), возвраты ret и reti - за 4 такта. В самой обширной группе команд передачи управления названия начинаются с символов br (от слова branch, ветка). Это команды условного перехода, которые считаются одними из самых главных в любой системе программирования, посколь­ ку позволяют организовывать циклы - базовое понятие программистских наук. По смыслу все эти команды сводятся к банальному i f . . . then (если . . . то) . Мы будем пользоваться лишь некоторыми командами, потому что они во многом взаимозаме­ няемы. Смысл остальных вам будет понятен из их описания . Наиболее часто употребляется пара: brne (Branch if Not Equal - перейти, если не равно) и breq (Branch if Equal - перейти, если равно). Уже из смысла этих команд понятно, как они пишутся, - после команды следует метка, на которую нужно

RkJQdWJsaXNoZXIy MTExODQxMg==