М.Х. Джонс - Электроника практический курс (1055364), страница 86
Текст из файла (страница 86)
Способ, посредством которого процессор обрабатывает прерывание, довольно похож на процедуру перезапуска, за исключением того, что после выполнения требуемой прерыванием подпрограммы, происходит возобновление исполнения основной программы. Это означает, что перед тем, как приступить к выполнению специальной подпрограммы обработки прерывания, программа должна сохранить содержимое тех регистров, которые будут использованы в подпрограмме обработки прерывания.
Это содержимое может потребоваться основной программе снова позднее, и поэтому промах в сохранении и восстановлении содержимого регистров может привести к тому, что соответствующие данные будут изменены во время исполнения программы обработки прерывания, что приведет впоследствии к ошибке, когда будет продолжена основная программа. Обычно данные из регистров сохраняют, помещая их в специальную область памяти, отведенную под «стек», откуда их можно извлечь в обратном порядке (последним пришел — первым вышел; (лзг-!Х Г!гзг-Оиг, 1.1ГО) после того, как завершится подпрограмма обработки прерывания.
Сам процессор в ответ на требования, поступающие на входы )4М! и 1КО, сохраняет содержимое счетчика команд и регистра состояния с тем, чтобы позднее восстановить его при выполнении команлы КТ! («возврат из прерывания»). Приход запроса на прерывание подобен телефонному звонку на столе у чиновника — он немедленно оставляет работу, которой был занят, чтобы ответить по телефону, аккуратно откладывая в сторону свои частично обработанные бумаги и освобождая место для блокнота, куда он записывает телефонные сообщения; но после звонка он готов вернуться к своей работе.
Забавно представить себе процессор без входов прерывания как контору, где в телефонных аппаратах нет звонков. Тогда нужно поручить кому-нибудь каждые несколько секунд поднимать трубку, чтобы проверить, не звонит ли кто — это эквивалентно опросу порта ввода. 470 МикроЭВМ и их применения Прерывания жизненно необходимы для миогозадачиой операционной системы, например, для такого важного программного обеспечения, каким является «1У1пбоаз», которое дает возможность процессору делать вид, что ои выполняет несколько действий сразу.
В действительности, все осуществляется последовательно, ио за счет тшательио организованных приоритетиых лрерываиий действия процессора кажутся пользователю фактически происходяшими одновременно. Простой пример, отиосяшийся к микроЭВМ ВВС М(его, продемоистрирует всю мошь прерываний. Операционная система обрабатывает запросы, идушие от клавиатуры, следуюшим образом: прерывания используются для того, чтобы записывать вводимые с клавиатуры символы в зарезервированную для этого область памяти, называемую буфером клавиатуры, и происходит это даже в том случае, когда процессор в это время, возможно, занят выполнением какой-либо программы.
Чтобы познакомиться с этим свойством, запустите следуюшую программу, набрав К~ЗН: 10 РОК 1 = 1 ТО 5000 20 РК1ХТ «ЗАНЯТ» 30 )ЧЕХТ Оиа займет процессор, и будет казаться, что ои занят все время, заполняя экран словом «ЗАНЯТ», Теперь, когда эта программа работает, введите с клавиатуры слово ЫБТ и нажмите клавишу <гегогп>. Немедленно ничего ие произойдет, ио через несколько секунд, когда вывод слова «ЗАНЯТ» закончится, процессор откликнется иа введенную вами команду и выведет листинг (текст) программы. Процессор, вылолиявший программу, был прерван обрашеиием с клавиатуры, иа время, достаточное для того, чтобы поместить слово Е1БТ в буфер клавиатуры в ОЗУ перед тем, как возобновить вывод иа экран.
С точки зрения оператора все выглядело так, как если бы компъютер делал два дела сразу. В микроЭВМ ВВС М(сто сигнал прерывания нужно подавать на вход СВ1 порта пользователя. Приводимая ниже программа, написанная иа языке ассемблера, иаглядио проиллюстрирует процедуру прерывания. Предполагается, что эта программа будет введена после программы ЕХР(.ОКЕ. Ее осиовиая часть — строки с 1010 по 1040 — названа «(пгеп врггошше» (подпрограмма прерывания); оиа содержит фактическую программу, которую выполняет процессор после прихода извне прерывания иа вход СВ1. Записав содержимое аккумулятора в стек, подпрограмма выполняет затем свое главиое действие — переносит данные с порта ввода иа порт вывода и таким образом в явном виде указывает иа то, что поступил запрос лрерываиия, независимо от чего-либо другого, что происходило в это время.
Подходяший эксперимент состоит в том, чтобы, удерлсивая функциональную клавишу 5 в нажатом положении, заставить повторяться подпрограмму «соцпИочгп» (из программы ЕХРЕОКŠ— Прим. перев.). Если, ие отпуская фуикциоиальиую клавишу 5, вы иа короткое время с ломошью ключа подадите иа вход СВ1 логическую 1, то это вызовет запуск процедуры прерываиия. В этот момент независимо от того, в каком месте счета в обратном Как отвлечь процессор от выполняемой программы? 471 направлении окажется подпрограмма «соцп10озчп», содержимое порта вывода будет обновлено в результате записи в него новой комбинации логических 0 и 1, заданной ключами иа входах порта ввода.
1000 КЕМ эксперименты с подачей сигналов прерываний иа вход СВ1 порта пользователя 1010 [ 1020 йпгепорггоойпе 1030 РНА '1 запись содержимого аккумулятора в стек 1040 ЕОАкГЕ60 1 загрузка в аккумулятор данных из порта ввода 1050 БТАГЕвгб! 1, копирование содержимого аккумулятора в порт вывода 1060 Р1.А ~ восстановление содержимого аккумулятора из стека 1070 КТ! '1 возврат в основную программу из перываиия 1080 .епаЫе(пгегпзр1 1090 1.РАФО 1100 БТАкГЕ6С 1 занесение нуля в ячейку 8гГЕбС иа короткое время является командой для ИС сопряжения отреагировать на отрицательный перепал напряжения иа входе СВ1 1110 1.!)АФссбГ 1120 БТАкГЕ6С 1 занесение в ячейку кГЕбС значения Або запрещает реагировать иа все прерывания, кроме поступающего со входа СВ! 1130 1.13АФй90 1140 5ТА8гГЕБЕ 1 занесение в ячейку 8гГЕ6Е значения к90 разрешает перываиие со входа СВ1 1150 ле1«есгог 1160 1.ОАФ!птегпюр1гоцг!пе МО!3 256 '1 загрузка в аккумулятор младшего байта адреса, соответствующего метке «ш1еггор1гоцйпе» 1170 БТАк0206 '1 запись в младший байт вектора прерывания младшей части указателя иа «!пгепор1гоо!пе» 1180 1.ОАФ!пгепцрггои1!пе !3! ч' 256 '1 загрузка в аккумулятор старшего байта адреса, соответствующего метке «бп1еггцр1гоцйпе» 1190 БТАк0207 '1 запись в старший байт вектора прерывания старгдей части указателя иа «шгепцр1гощше» 1200 КТБ '1 возврат в Бейсик 1210 ) 1220 КЕМ программа начинает выполняться пуском «епаЫе!пгеггцрг» (разрешеиие прерываний), за которым сразу же следует исполнение части «зегчес1ог» (устаиовка вектора прерываний); тем самым осуществляется инициализация компьютера, в результате которой ои исполняет «!п1епоргошше» всякий раз, когда на вход СВ1 поступает импульс прерывания 1230 СА!Л епаЫецпепцрг 472 МикроЭВМ и их нрименения Комментарии в программе объясняют функции различных операторов; мы видим, что для правильной обработки прерывания необходимо не только включить сохранение и восстановление регистров (в данном случае используется только аккумулятор), но также в занесении адреса начала нашей программы «1пгеггирггоиг(пе» в ячейки памяти с адресами е«206 и вг207, где у операционной системы микроЭВМ ВВС М(сто храниться «вектор», указывающий на подпрограмму прерывания.
Когда сигнал прерывания на входе СВ1 принимает активное значение, ИС сопряжения с внешними устройствами вырабатывает импульс непосредственно на входе требования прерывания (! КО) центрального процессора. Процессор немедленно обращается к ячейкам памяти ВЕЕРЕ н яГГГЕ, чтобы прочесть в них адрес (это встроенное свойство процессора 6502).
Размещенная в ПЗУ операционная система микроЭВМ ВВС М(сто хранит в этих ячейках адрес вгРС1С, так что процессор совершает безусловный переход и исполняет небольшую подпрограмму, начинающуюся с ЙРС1С. Эта подпрограмма путем опроса, прежде всего, проверяет, не пришел ли запрос на обслуживание от какого-либо из внутренних узлов системы; если обнаруживается, что никто из них не выработал требование прерывания, то управление передается по адресу, хранящемуся в ячейках х206 и вг207, куда мы поместили адрес начала подпрограммы «1пгеггцрггоцг(пе».
Важно отметить, что процедура переадресации процессора при прерывании по вектору прерывания включена только в версии операционной системы для микроЭВМ ВВС М(его 1.0 и выше. Как обычно, набрав К()Х, вы запустите трансляцию программы, за которой сразу же последует исполнение оператора САЕЕ епаЫепйегщрг в строке 1230. Это приведет к пуску подпрограммы «епаЫе(пгеггирг», за которой следует подпрограмма «зещесгог». Первая из этих подпрограмм производит установку схемы сопряжения с внешними устройствами в режим чувствительности к прерываниям на входе СВ1, а вторая подпрограмма помешает в ячейки дь206 и к207 адрес, соответствующий метке «)пгегп~рггоцг!пе», в качестве готового вектора прерывания. Таким образом, программирование прерываний требует внимания: для реализации простого по своей сути принципа нужно все же выполнить довольно много команд, чтобы все происходило именно так, как залумано.