Как отвлечь процессор от выполняемой программы? Прерывания

December 23, 2011 by admin Комментировать »

До сих пор наши эксперименты с вводом/выводом были иллюстрацией того, как процессор опрашивает порт ввода и затем обрабатывает введенные данные в соответствии с программой. Однако в практических приложениях часто бывает необходимо предпринимать особые действия в ответ на редкие, но важные события, когда тратить время процессора на постоянно повторяющийся опрос порта ввода расточительно. Например, процессор нормально мог бы быть занят сортировкой и оценкой данных на какой-нибудь удаленной станции с телеметрической связью, куда время от времени извне поступает сигнал, говорящий о том, что следует отправить результаты его работы в центр, на базу. Для этого требуется, чтобы процессор оставил свою рутинную работу и перешел к особой процедуре вывода в ответ на команду извне. Это совершается путем использования имеющегося прямо на кристалле процессора входа прерывания, сигнал на котором уводит процессор к особому месту в памяти. А там процессор видит указатель, или вектор, отправляющий его в специально предназначенную для этого часть программы.

Обычно процессор имеет не один вход прерывания, а больше, и у них различные уровни приоритета. Если несколько прерываний приходят одновременно, то они обрабатываются строго в порядке приоритетов. У процессора 6502 два таких входа: вход немаскируемых прерываний (NMI), имеющий наивысший приоритет и используемый в аварийной ситуации, например для сохранения данных, когда пропадает напряжение питания, и вход требования пребывания (IRQ), используемый для прерываний общего назначения. По выбору программиста процессор можно сделать чувствительным или нечувствительным к сигналам на входе IRQ, установив соответствующее значение признака прерываний в регистре состояния процессора. Однако сделать процессор нечувствительным к сигналам на входе NMI нельзя. У более сложных процессоров имеется большое число аппаратно реализованных входов прерываний с различными приоритетами. Организация их работы осуществляется с помощью программируемого контроллера прерываний (Programmable Interrupt Controller, PIC), такого как используемая в персональных компьютерах ИС 8259А (аналог 580ВН59. — Примеч. перев.), допускающая восемь уровней запроса, причем это число можно увеличить за счет дополнительных ИС 8259А. Однако даже на двух входах, имеющихся у процессора 6502, можно при подходящей операционной системе организовать приоритетное обслуживание большого числа различных запросов на прерывание. При обнаружении требования прерывания программа может определить, какого оно происхождения, опрашивая различные возможные источники запросов, такие как клавиатура, таймер и др. В зависимости от приоритета, назначенного этому источнику, программа обработки данного прерывания может начать исполняться немедленно или может быть на время отложена до того, как будет закончена обработка прерывания с более высоким приоритетом. Как раз для того, чтобы избежать такого нежелательного прерывания во время обработки другого прерывания, и применяется маскирование прерывания, то есть установка нечувствительности процессора к запросам на этом входе.

Способ, посредством которого процессор обрабатывает прерывание, довольно похож на процедуру перезапуска, за исключением того, что после выполнения требуемой прерыванием подпрограммы происходит возобновление исполнения основной программы. Это означает, что перед тем, как приступить к выполнению специальной подпрограммы обработки прерывания, программа должна сохранить содержимое тех регистров, которые будут использованы в подпрограмме обработки прерывания. Это содержимое может потребоваться основной программе снова позднее, и поэтому промах в сохранении и восстановлении содержимого регистров может привести к тому, что соответствующие данные будут изменены во время исполнения программы обработки прерывания, что приведет впоследствии к ошибке, когда будет продолжена основная программа. Обычно данные из регистров сохраняют, помещая их в специальную область памяти, отведенную под «стек», откуда их можно извлечь в обратном порядке (последним пришел — первым вышел; Last-IN First-Out, LIFO) после того, как завершится подпрограмма обработки прерывания. Сам процессор в ответ на требования, поступающие на входы NMI и IRQ, сохраняет содержимое счетчика команд и регистра состояния с тем, чтобы позднее восстановить его при выполнении команды RTI («возврат из прерывания»).

Приход запроса на прерывание подобен телефонному звонку на столе у чиновника — он немедленно оставляет работу, которой был занят, чтобы ответить по телефону, аккуратно откладывая в сторону свои частично обработанные бумаги и освобождая место для блокнота, куда он записывает телефонные сообщения; но после звонка он готов вернуться к своей работе. Забавно представить себе процессор без входов прерывания, как контору, где в телефонных аппаратах нет звонков. Тогда нужно поручить кому- нибудь каждые несколько секунд поднимать трубку, чтобы проверить, не звонит ли кто, — это эквивалентно опросу порта ввода.

Прерывания жизненно необходимы для многозадачной операционной системы, например для такого важного программного обеспечения, каким является «Windows», которое дает возможность процессору делать вид, что он выполняет несколько действий сразу. В действительности, все осуществляется последовательно, но за счет тщательно организованных приоритетных прерываний действия процессора кажутся пользователю фактически происходящими одновременно.

Простой пример, относящийся к микроЭВМ ВВС Micro, продемонстрирует всю мощь прерываний. Операционная система обрабатывает запросы, идущие от клавиатуры, следующим образом: прерывания используются для того, чтобы записывать вводимые с клавиатуры символы в зарезервированную для этого область памяти, называемую буфером клавиатуры, и происходит это даже в том случае, когда процессор в это время, возможно, занят выполнением какой-либо программы. Чтобы познакомиться с этим свойством, запустите следующую программу, набрав RUN:

10 FOR I = 1 ТО 5000

20 PRINT «ЗАНЯТ»

30 NEXT

Она займет процессор, и будет казаться, что он занят все время, заполняя экран словом «ЗАНЯТ». Теперь, когда эта программа работает, введите с клавиатуры слово LIST и нажмите клавишу <return>. Немехченно ничего не произойдет, но через несколько секунд, когда вывод слова «ЗАНЯТ» закончится, процессор откликнется на введенную вами команду и выведет листинг (текст) программы. Процессор, выполнявший программу, был прерван обращением с клавиатуры на время, достаточное для того, чтобы поместить слово LIST в буфер клавиатуры в ОЗУ перед тем, как возобновить вывод на экран. С точки зрения оператора все выглядело так, как если бы компьютер делал два дела сразу.

В микроЭВМ ВВС Micro сигнал прерывания нужно подавать на вход СД1 порта пользователя. Приводимая ниже программа, написанная на языке ассемблера, наглядно проиллюстрирует процедуру прерывания. Предполагается, что эта программа будет введена после программы EXPLORE. Ее основная часть — строки с 1010 по 1040 — названа «interruptroutine» (подпрограмма прерывания); она содержит фактическую программу, которую выполняет процессор после прихода извне прерывания на вход Ci?l. Записав содержимое аккумулятора в стек, подпрограмма выполняет затем свое главное действие — переносит данные с порта ввода на порт вывода и таким образом в явном виде указывает на то, что поступил запрос прерывания, независимо от чего-либо другого, что происходило в это время. Подходящий эксперимент состоит в том, чтобы, удерживая функциональную клавишу 5 в нажатом положении, заставить повторяться подпрограмму «countdown» (из программы EXPLORE. — Примеч. перев.). Если, не отпуская функциональную клавишу 5, вы на короткое время с помощью ключа подадите на вход СВ\ логическую 1, то это вызовет запуск процедуры прерывания. В этот момент независимо от того, в каком месте счета в обратном направлении окажется подпрограмма «countdown», содержимое порта вывода будет обновлено в результате записи в него новой комбинации логических 0 и 1, заданной ключами на входах порта ввода.

1000 REM эксперименты с подачей сигналов прерываний на вход СВ1 порта пользователя

1010 [

1020 .interruptroutine

1030 РНА                           \запись содержимого аккумулятора в стек

1040 LDA&FE60 \загрузка в аккумулятор данных из порта ввода

1050 STAFE&61 ^копирование содержимого аккумулятора в порт вывода

1060 PLA                            \восстановление содержимого аккумулятора из стека

1070 RTI                            \возврат в основную программу из перывания

1080 . enableinterrupt

1090 LDA#0

1100 STA&FE6C \занесение нуля в ячейку &FE6C на короткое время является командой для ИС сопряжения отреагировать на отрицательный перепад напряжения на входе СВ)

1110 LDA#&6F

1120 STA&FE6C \занесение в ячейку &FE6C значения &6F запрещает

реагировать на все прерывания, кроме поступающего со входа СВ1

1130 LDA#&90

1140 STA&FE6E \занесение в ячейку &FE6E значения &90 разрешает прерывание со входа СВ1

1150 .setvector

1160 LDA#interruptroutine MOD 256

\загрузка в аккумулятор младшего байта адреса, соответствующего метке «interruptroutine»

1170   „         Хзапись в младший байт вектора прерывания младшей

olAotUzUb                                                     . , ,

части указателя на «mterruptroume»

1180 LDA#interruptroutine DIV 256

\загрузка в аккумулятор старшего байта адреса, соответствующего метке «interruptroutine»

1190 STA&0207 \запись в старший байт вектора прерывания старшей части указателя на «interruptroutine»

1200 RTS                           \возврат в Бейсик

1210 ]

1220 REM программа начинает выполняться пуском «enableinterrupt» (разрешение прерываний), за которым сразу же следует исполнение части «setvector» (установка вектора прерываний); тем самым осуществляется инициализация компьютера, в результате которой он исполняет «inter- ruptoutine» всякий раз, когда на вход СВ1 поступает импульс прерывания

1230 CALL enableinterrupt

Комментарии в программе объясняют функции различных операторов. Мы видим, что для правильной обработки прерывания необходимо не только включить сохранение и восстановление регистров (в данном случае используется только аккумулятор), но также и занести адреса начала нашей программы «interruptroutine» в ячейки памяти с адресами &206 и &207, где у операционной системы микроЭВМ ВВС Micro хранится «вектор», указывающий на подпрограмму прерывания. Когда сигнал прерывания на входе Ci?l принимает активное значение, ИС сопряжения с внешними устройствами вырабатывает импульс непосредственно на входе требования прерывания (IRQ) центрального процессора. Процессор немедленно обращается к ячейкам памяти &FFFE и &FFFF, чтобы прочесть в них адрес (это встроенное свойство процессора 6502). Размещенная в ПЗУ операционная система микроЭВМ ВВС Micro хранит в этих ячейках адрес &DC1C, так что процессор совершает безусловный переход и исполняет небольшую подпрограмму, начинающуюся с &DC1C. Эта подпрограмма путем опроса прежде всего проверяет, не пришел ли запрос на обслуживание от какого-либо из внутренних узлов системы; если обнаруживается, что никто из них не выработал требование прерывания, то управление передается по адресу, хранящемуся в ячейках &206 и &207, куда мы поместили адрес начала подпрограммы «interruptroutine». Важно отметить, что процедура переадресации процессора при прерывании по вектору прерывания включена только в версии операционной системы для микроЭВМ ВВС Micro 1.0 и выше.

Как обычно, набрав RUN, вы запустите трансляцию программы, за которой сразу же последует исполнение оператора CALL enableinterrupt в строке 1230. Это приведет к пуску подпрограммы «enableinterrupt», за которой следует подпрограмма «setvector». Первая из этих подпрограмм производит установку схемы сопряжения с внешними устройствами в режим чувствительности к прерываниям на входе Ci?l, а вторая подпрограмма помещает в ячейки &206 и &207 адрес, соответствующий метке «interruptroutine», в качестве готового вектора прерывания.

Таким образом, программирование прерываний требует внимания: для реализации простого по своей сути принципа нужно все же выполнить довольно много команд, чтобы все происходило именно так, как задумано. Однако, запустив эту простую программу, вы будете вознаграждены, убедившись в способности микропроцессора выполнять более одной задачи одновременно. Подчеркнем еще раз, что этим простым примером мы хотим подтолкнуть воображение читателя в сторону внедрения компьютеров в практические электронные системы. Подпрограмму «interruptroutine» легко приспособить к выполнению любого желаемого действия; например, в стиральной машине, где основная программа следит за выполнением необходимых операций, подпрограмму прерываний можно использовать для сигнализации о низком водяном давлении.

Прямой доступ в память

Для некоторых внешних устройств, таких как дисководы, когда необходимо переносить данные в большом количестве, даже прерывания оказываются слишком медленными. В таких случаях процессор становится узким местом, и применяется прямой доступ в память (Direct Memory Access, DMA). При этом реализуется прямая связь внешнего устройства, например жесткого диска, с памятью.

Процедура прямого доступа в память начинается с того, что внешнее устройство посылает по специальной линии DMA требование доступа к системной шине. В течение времени, пока длится обмен данными при прямом доступе в память, необходимые для памяти адреса генерируются (выставляются) самим интерфейсом внешнего устройства, а не процессором. Конец процедуры прямого доступа в память наступает тогда, когда интерфейс внешнего устройства подает на процессор сигнал прерывания в знак того, что тот может возобновить свое нормальное функционирование.

Литература: М.Х.Джонс, Электроника — практический курс Москва: Техносфера, 2006. – 512с. ISBN 5-94836-086-5

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты