Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
61
Добавлен:
20.03.2015
Размер:
273.92 Кб
Скачать

7.2. Прерывания

В примере на рис. 7.4 программа выполняет цикл ожидания, постоянно проверяя состояние устройства. В течение этого времени процессор не делает никакой по­лезной работы. Однако во многих случаях в течение времени ожидания готовно­сти устройства ввода-вывода процессор мог бы выполнять другие задачи. Для этого нужно так организовать совместную работу процессора и внешнего устрой­ства, чтобы это устройство само оповещало процессор о своей готовности к пере­сылке данных. Такое оповещение выполняется с помощью специального сигнала, называемого прерыванием. Для прерываний обычно выделяется как минимум од­на управляющая линия шины, называемая линией запроса прерывания. Посколь­ку при использовании прерываний процессору не нужно постоянно проверять состояние внешних устройств, он может использовать периоды ожидания для выполнения других полезных функций. Благодаря этому процессор никогда не простаивает.

Пример 7.2______________________________________

Рассмотрим задачу, для выполнения которой нужно произвести некоторые вы­числения и напечатать результаты на принтере, затем произвести другие вычис­ления и снова распечатать результаты — и так несколько раз. Предположим, что выполняющая эту задачу программа состоит из двух подпрограмм, COMPUTE и PRINT. Подпрограмма COMPUTE генерирует n выходных строк, которые долж­ны быть напечатаны подпрограммой PRINT.

Для реализации указанной задачи программа может многократно выполнять подпрограмму COMPUTE, а затем подпрограмму PRINT. Принтер за один раз принимает только одну строку текста. Поэтому подпрограмма PRINT должна ото­слать одну строку текста, подождать, пока он будет напечатан, отослать следую­щую строку и т. д. Недостатком этого подхода является то обстоятельство, что про­цессор тратит немало времени в ожидании готовности принтера. Общую скорость выполнения программы можно значительно увеличить путем чередования про­цессов печати и вычисления, то есть за счет выполнения во время печати подпро­граммы COMPUTE. Делается это следующим образом. Сначала выполняется подпрограмма COMPUTE, которая генерирует n первых строк текста, затем — подпрограмма PRINT, отправляющая первую строку на принтер. Однако вместо того чтобы дожидаться окончания процесса печати строки, подпрограмма PRINT может временно приостановить свое выполнение и передать управление програм­ме COMPUTE. Когда принтер будет готов к печати следующей строки, он оповес­тит об этом процессор, выдав сигнал запроса прерывания. В ответ процессор пре­рвет выполнение подпрограммы COMPUTE и передаст управление подпрограмме PRINT. Подпрограмма PRINT отправит на принтер вторую строку и снова при­остановит свою работу. Прерванная программа COMPUTE продолжит работу с точки прерывания. Этот процесс может продолжаться до тех пор, пока не будут напечатаны все n строк и подпрограмма PRINT не закончит свою работу. Когда следующие n строк будут готовы для печати, выполнение подпрограм­мы PRINT начнется сначала. И если на формирование подпрограммой COM­PUTE n строк текста понадобится больше времени, чем на их печать, процессор все время будет занят полезными вычислениями.

Этот пример иллюстрирует концепцию прерываний. Программа, выполняе­мая в ответ на запрос прерывания, называется программой обработки прерыва­ний. В нашем случае роль таковой выполняет подпрограмма PRINT. Прерывания очень похожи на вызовы подпрограмм. Предположим, что запрос прерывания по­ступает во время выполнения команды i (рис. 7.5). Процессор завершает выпол­нение этой команды, а затем загружает в счетчик команд адрес первой команды программы обработки прерываний. Для упрощения задачи предположим, что этот адрес аппаратно закреплен в процессоре. После выполнения программы об­работки прерываний процессор должен вернуться к команде i + 1. Для этого пе­ред вызовом программы обработки прерывания содержимое регистра PC должно быть временно сохранено в памяти. Команда возврата из прерывания, располо­женная в конце программы обработки прерывания, загрузит этот сохраненный адрес в регистр PC, в результате чего выполнение будет продолжено с команды i + 1. Во многих компьютерах адрес возврата сохраняется в стеке процессора. Но он может быть сохранен и в другом месте, например, в специально для него пред­назначенном регистре.

Рис. 7.5. Передача управления через прерывания

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

Получается, что программа обработки прерывания очень похожа на обычную подпрограмму. Однако между ними имеются очень важные различия. Подпро­грамма выполняет функцию, необходимую той программе, из которой она вызвана, тогда как программа обработки прерываний может не иметь ничего общего с вы­полняемой программой — эти две программы обычно даже принадлежат разным пользователям. Таким образом, перед вызовом программы обработки прерывания необходимо сохранить всю информацию, которая может быть изменена в ходе ее выполнения. Перед выходом из программы обработки прерывания эта информа­ция должна быть восстановлена. После этого исходная программа может продол­жить свое выполнение так, словно оно и не прерывалось (конечно, если не считать времени задержки). К числу сохраняемой и восстанавливаемой информации обыч­но относятся значения флагов условий и содержимое всех тех регистров, которые используются и прерванной программой, и программой обработки прерывания.

Задача сохранения и восстановления информации может автоматически вы­полняться процессором или же командами программы. Большинство современных процессоров сохраняют только минимальное количество информации, необходи­мое для обеспечения целостности программ. Дело в том, что процесс сохранения и восстановления регистров включает обмен данными с памятью, увеличивающий время задержки между получением запроса прерывания и вызовом программы его обработки. Такого рода задержка называется задержкой обработки прерыва­ния. Для некоторых приложений слишком большая задержка обработки преры­ваний неприемлема. Поэтому-то количество сохраняемой и восстанавливаемой процессором информации и должно быть сведено к минимуму. Как правило, про­цессор сохраняет только содержимое счетчика команд и регистра состояния про­цессора. Любая дополнительная информация должна сохраняться программным путем в начале работы программы обработки прерывания и восстанавливаться перед ее завершением.

Некоторые ранние процессоры, и в первую очередь те, в которых было неболь­шое количество регистров, при получении запроса прерывания автоматически со­храняли содержимое всех своих регистров (без программного участия). Процедура восстановления регистров была включена в реализацию команды возврата из про­цедуры обработки прерывания. Некоторые процессоры поддерживают два типа прерываний: одни вызывают автоматическое сохранение регистров, а другие — нет. Конкретное устройство ввода-вывода может использовать любой из типов преры­ваний в зависимости от необходимого времени ответа. Другой интересный подход к решению этого вопроса заключается в использовании двух дублирующих друг друга наборов регистров процессора. Это позволяет программе обработки преры­вания использовать второй набор регистров, поэтому сохранять и восстанавли­вать их не требуется.

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