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

Глава 7. Система команд АVR 1 69 Команда brlo при этом полностью эквивалентна команде brcs (перейти, если флаг с установлен), а команда brsh - уже встречавшейся нам в предыдущей главе коман­ де brcc (перейти, если флаг с сброшен). Причем эти эквивалентные пары команд имеют также идентичные коды операций и по сути представляют собой синонимы одной команды, введенные для удобства мнемонического восприятия . Мало того, если внимательно изучить коды операций для команд условного пере­ хода (а их порядка 20-ти), то окажется, что все они являются разными синонимами всего двух команд: brbs s , k и ьrьс s , k, где s - номер бита в регистре SREG (а k - адрес перехода). Как мы видим, эти команды более универсальны, однако их упот­ ребляют редко, - для любого из флагов регистра SREG есть свои команды, которые употреблять удобнее. Важная особенность команд типа ьrхх состоит в том, что они могут адресовать метку, отличающуюся от исходного адреса в последовательности команд не более чем на 63 позиции вперед или на 64 позиции назад, т. е. пригодны только для пере­ хода «поблизости» . Второй важный нюанс в работе всех команд перехода также заключается в том, что они могут занимать разное количество тактов: один или два, в зависимости от того, выполняется условие или нет. В АVR используется про­ стейший конвейер команд, который «тупо» полагает, что следующей будет выпол­ няться команда сразу после команды перехода. Естественно, если ветвление необ­ ходимо, конвейер останавливается на один лишний такт, в течение которого проис­ ходит выборка адреса перехода. Однако этот недостаток с лихвой компенсируется тем, что за счет конвейера почти все остальные команды выполняются за один такт. Наконец, нужно учитывать, что регистр SREG не сохраняется при переходе к обра­ ботке прерывания, и если в прерывании встречаются команды, его модифицирую­ щие, то содержимое этого регистра может быть испорчено. Поэтому, если есть тео­ ретическая возможность, что прерывание «вклинится» между командой сравнения (или другой, устанавливающей биты SREG ) и командой условного перехода, то SREG нужно сохранять и восстанавливать принудительно. Проще всего это делать через стек - командами push и рор в начале и в конце обработчика прерывания (лис­ тинг 7.4) . TIMERl : ; прерывание от таймера push temp ; сохраняем в стеке рабочую переменную in temp , SREG push temp ; сохраняем в стеке SREG <процедура прерывания> pop_int : рор temp ; извлекаем SREG out SREG , temp рор temp ; извлекаем рабочую переменную reti ; возврат из прерывания

RkJQdWJsaXNoZXIy MTExODQxMg==