Ревич, Ю.В. Программирование микроконтроллеров 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 ; возврат из прерывания
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==