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

64 Часть /. Общие принципы устройства и функционирования Аtте/ АVR рывания автоматически устанавливаются некие биты-флаги, сигнализирующие о наступлении определенного события . Но если в первом случае отслеживание зна­ чений этих флагов и реагирование на событие возлагается на программиста, то при возникновении аппаратного прерывания переход к его обработке осуществляется автоматически, - программисту надо лишь установить условия для возникновения нужного прерывания и написать правильно оформленную процедуру обработки. Во время обработки каждого прерывания другие прерывания произойти не могут (если вы это специально не разрешите - о чем рассказано далее), но установленный автоматически флаг никуда не денется, и отложенное прерывание произойдет по окончании обработки предыдущего. П орядок выполнения прерывани й Для надлежащего управления процессом возникновения прерываний флаги разре­ шения прерываний образуют иерархию. Во главе этой структуры стоит бит r реги­ стра флагов SREG, который разрешает (если установлен в логическую единицу) или запрещает (если установлен в логический ноль) аппаратные прерывания вовсе. Как правило, непосредственно с этим битом (как и вообще с регистром SREG ) програм­ мисту дело можно не иметь - для общего разрешения (запрещения) прерываний предусмотрены специальные команды: sei (разрешить) и cli (запретить), устанав­ ливающие этот бит в нужное состояние (аббревиатуры sei/cli и означают set 1/clear !) . Отметим, что по умолчанию бит I регистра флагов SREG сброшен, т. е. прерывания при запуске МК запрещены. Для того чтобы их разрешить, необходимо в процедуре начальной инициализации, выполняющейся по сбросу МК, разместить команду sei . Кроме общего флага прерываний, для каждого конкретного прерывания имеется свой разрешающий/запрещающий бит, расположенный в соответствующем регист­ ре (например, для таймеров - это регистры т rмsк или Етrмsк, для внешних преры­ ваний - Grмsк, в более поздних моделях зачем-то переименованный в GICR 1 , и т. п. ) . При использовании прерываний эти биты необходимо устанавливать в со­ стояние логической единицы, в противном случае автоматического вызова преры­ ваний не произойдет. Если во время обработки прерывания произошли еще какие-то события, вызываю­ щие прерывания, то их флаги окажутся установленными, и процедуры их обработ­ ки начнут выполняться незамедлительно (точнее, после выполнения одной коман­ ды основной программы, - о чем рассказано далее) в том порядке, в каком они расположены в таблице векторов прерываний. Программист может нарушать этот порядок, разрешая вложенные прерывания, но делать это без крайней нужды не рекомендуется, - такая операция требует учета большого числа неочевидных фак­ торов (некоторые примеры приведены далее) и намного усложняет отладку про- 1 В файлах макроопределений (* . inc) часто стоит и то, и другое, потому в этой книге я буду пользо­ ваться преимущественно старым обозначением GIMSК, которое работает для всех «наших» моделей одинаково. Если в каких-то моделях это название будет недействительно, то ассемблер укажет на ошибку.

RkJQdWJsaXNoZXIy MTExODQxMg==