Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава б. Основы программирования МКАVR 135 Отметим, что иногда обработка прерываний может мешать выполнению каких нибудь длинных процедур, которые нельзя прерывать (например, не допускается возникновение прерывания во время записи в EEPROM) . В этом случае прерывания всегда можно временно запретить командой cli . Естественно, потом их следует опять разрешить командой sei (обратите внимание на то, что инструкция сразу за sei будет выполнена в любом случае до начала обработки любого прерывания) . При вызове таких длительных процедур изнутри обработчика прерывания пробле ма снимается, если, конечно, не разрешены вложенные прерывания, что еще один аргумент за перенос функциональности программы преимущественно в прерыва ния (см. далее) . Не следует также забывать, что содержимое регистра флагов SREG при переходе к обработке прерывания не сохраняется . Регистр SREG, кроме флага разрешения прерываний, содержит другие флаги, задействованные в арифметических операци ях, командах сравнения и др. Поэтому, если прерывание «вклинится», например, между командой сравнения и командой перехода в зависимости от его результата, то при наличии в обработчике команд, модифицирующих SREG, выполнение этой последовательности команд может оказаться некорректным. При опасности такого развития событий регистр SREG также следует сохранять в стеке (ну, или запрещать прерывания во время выполнения процедур выбора) . Переход в обработчик всегда осуществляется по окончании выполнения текущей команды (даже если она занимает несколько тактов), а при выходе из прерывания всегда выполняется, по крайней мере, одна команда основной программы, прежде чем контроллер перейдет к выполнению следующего прерывания . Обработчик пре рывания всегда (кроме RESET ) должен заканчиваться командой reti . Только с ее помощью программа, во-первых, снова разрешит прерывания (которые автомати чески запрещаются при переходе по вектору сбросом флага r в регистре SREG ) , во вторых, вернется в то место программы, на котором ее выполнение было прервано. Обращение к прерыванию и возврат из него (команды rjmp + reti) без учета вы полнения команд до и после добавляет 6 тактов к длительности обработки преры вания . Вообще говоря, обработчик можно вызвать в любой момент и программно, подобно обычной процедуре, но встретить ситуацию, в которой это может приго диться, мне ни разу не довелось . Подробности об обработке прерываний вы найде те далее, в конкретных примерах программ . ЗАМЕТКИ НА полях Если мы рассмотрим прерывания с точки зрения общей организации процесса выпол нения программы в контроллере, то можем заметить , что выполнение его обработчика очень похоже на вызов обычной подпрограммы. Тут уместно напомнить об одном очень важном принципе, лежащем в основе всего микропроцессорного подхода к соз данию электронной аппаратуры , о котором часто забывают упомянуть , потому что для всех он становится очевидным уже на начальных стадиях изучения микропроцессоров и программирования, - это принцип эквивалентности аппаратного и программного обеспечения. Понятные иллюстрации этого принципа представляют собой некоторые команды выполнения арифметических действий , которые мы будем рассматривать далее. Выполнение аппаратных прерываний также является ярким примером этого принципа - в основе это тот же самый вызов подпрограммы по некоторому условию, а вот оформление (и аппаратное, и программное) этих вызовов принципиально раз ное.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==