Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Для моделей, имеющих аппаратный стек (ATtinylx, ATtiny28), эти строки включать в программу не нужно, но для них следует учитывать ограничение: т. к. аппаратный стек имеет три уровня, то вызов более чем трех вложенных подпрограмм (в том числе прерываний) попросту "обрушит" программу, которая уже не сможет "вспомнить", куда нужно вернуться в конечном итоге.

Заканчиваться процедура-обработчик должна командой выхода из прерывания reti. По этой команде восстанавливается содержимое счетчика команд и устанавливается опять общий флаг разрешения прерываний. Если во время обработки прерывания произошли еще какие-то прерывания, то их флаги окажутся установленными, и процедуры их обработки начнут выполняться незамедлительно (точнее, после выполнения одной команды основной программы, см. далее), в том порядке, в каком они расположены в таблице векторов прерываний. При такой системе "потерять" прерывание можно только при большой загрузке МК, когда события следуют чаще, чем успевают обрабатываться. Отметим, что иногда обработка прерываний может мешать выполнению каких-то длинных процедур, которые нельзя прерывать (например, не допускается возникновение прерывания во время записи в EEPROM).

В этом случае прерывания всегда можно временно запретить командой cli (отметим, что при вызове таких длительных процедур изнутри обработчика прерывания проблема снимается, если, конечно, не разрешены вложенные прерывания). Кроме того, в любой программе почти всегда имеются глобальные "рабочие" переменные (в наших программах такую переменную мы будем обозначать, как temp), использование которых следует отслеживать, т. к. они могут быть "испорчены", если между операциями с этими переменными "вклинится" прерывание, в котором они также задействованы. В этом случае можно временно сохранять содержимое переменной в стеке командой push и затем восстанавливать командой pop (заметьте, что для моделей с аппаратным стеком команды push и pop не работают, см. главу б).

Не следует также забывать, что содержимое регистра флагов SREG при переходе к обработке прерывания не сохраняется, SREG, кроме флага разрешения прерываний, содержит другие флаги, задействованные, например, в арифметических операциях, командах сравнения и др. Поэтому если прерывание "вклинится", например, между командой сравнения и командой перехода в зависимости от его результата, то при наличии в обработчике команд, модифицирующих SREG, выполнение этой последовательности команд может оказаться некорректным. При опасности такого развития событий регистр SREG также следует сохранять в стеке.

При вызове прерывания сохранение счетчика команд в стеке (как и возврат его состояния по окончании обработки) требует четыре такта. Еще два такта занимает переход по команде rjmp (или три для команды jmp) к процедуре-обработчику. Переход всегда осуществляется по окончании выполнения текущей команды (даже если она занимает несколько тактов), а при выходе из прерывания всегда выполняется, по крайней мере, одна команда основной программы, прежде чем контроллер перейдет к выполнению следующего прерывания.

Разновидности прерываний
Всего в различных моделях AVR существует от 6-8 (младшие Tiny) до нескольких десятков прерываний (например, в ATmega2560 их 57). Как и в ПК, прерывания в микроконтроллерах бывают двух видов. Но если в ПК прерывания делятся на аппаратные (например, от таймера или клавиатуры) и программные (фактически не прерывания, а подпрограммы, записанные в BIOS, — с распространением Windows это понятие почти исчезло из программистской практики), то в МК, естественно, все прерывания аппаратные, а делятся они на внутренние и внешние.

Внутренние прерывания могут возникать от любого устройства, которое является дополнительным по отношению к ядру системы: таймеров, аналогового компаратора, последовательного порта и т. п. Внутреннее прерывание — это событие, которое возникает в системе и прерывает выполнение основной программы. Внутренних прерываний в AVR довольно много и в совокупности они служат для взаимодействия устройств с ядром системы, и мы еще к этому вопросу будем неоднократно возвращаться при рассмотрении конкретных устройств.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru