Основы микропроцессорной техники — тест 5
Главная / Аппаратное обеспечение / Основы микропроцессорной техники / Тест 5 Упражнение 1:Номер 1
К какой группе команд относятся команды работы со стеком?
Ответ:
 (1) арифметические команды 
 (2) логические команды 
 (3) команды пересылки 
 (4) команды переходов 
 (5) к отдельной группе 
Номер 2
Для чего используются команды программных прерываний?
Ответ:
 (1) для управления устройствами ввода-вывода 
 (2) для обработки аварийных ситуаций 
 (3) для вызова подпрограмм 
 (4) для управления режимами работы процессора 
 (5) для управления режимами работы памяти 
Номер 3
Какие команды чаще других используются для организации подпрограммы?
Ответ:
 (1) арифметические команды 
 (2) команды переходов 
 (3) логические команды 
 (4) команды пересылки 
 (5) команды управления процессором 
Номер 1
К какой группе относятся команды сдвига кодов?
Ответ:
 (1) арифметические команды 
 (2) логические команды 
 (3) команды пересылки 
 (4) команды переходов 
 (5) команды управления процессором 
Номер 2
Какие команды не формируют выходной операнд?
Ответ:
 (1) арифметические команды 
 (2) логические команды 
 (3) команды пересылки 
 (4) команды переходов 
 (5) команды сдвигов 
Номер 3
К какой группе команд относится команда декремента?
Ответ:
 (1)
 (2) логические команды 
 (3) команды переходов 
 (4) команды пересылок 
 (5) команды сдвигов 
Упражнение 3:
Номер 1
Какие команды обычно не меняют флаги PSW
?
Ответ:
 (1) арифметические команды 
 (2) логические команды 
 (3) команды пересылки 
 (4) команды переходов 
 (5) все команды обязательно меняют флаги 
Номер 2
К какой группе относится команда "Исключающее ИЛИ
"?
Ответ:
 (1) арифметические команды 
 (2) логические команды 
 (3)
 (4) команды переходов 
 (5) команды загрузки 
Номер 3
Какая команда используется для возврата из программного прерывания?
Ответ:
 (1) команда условного перехода 
 (2) команда безусловного перехода 
 (3) команда перехода с возвратом 
  (4) команда вызова прерывания 
 (5) специальная команда возврата из прерывания 
Существует несколько видов экстраординарных ситуаций, в которых поведение процессора регламентируется особыми правилами. Такие ситуации возникают, когда требуется срочная реакция на внешние воздействия, когда при выполнении программы происходит какая-либо ошибка или существует вероятность получения неточного результата вычислений. В общем случае все эти ситуации разделяются по принципу их обнаружения, источника возникновения и реакции на них на следующие три категории:
Прерывания и особые ситуацииПрерывания и особые ситуации (Interrupts and Exceptions) — это специальные средства, обеспечивающие быструю реакцию процессора на внешние воздействия и прочие неожиданные ситуации. При поступлении прерывания или генерации особой ситуации Все прерывания и особые ситуации имеют уникальные идентификационные номера. Эти номера называются векторами прерываний и лежат в пределах от 0 до 255. Векторы от 0 до 31 отведены для особых ситуаций и немаскируемого прерывания, причем некоторые из них зарезервированы и не должны использоваться программами. Векторы от 32 до 255 свободны для любого использования пользовательскими программами и внешними устройствами. Существует два источника поступления прерываний и три типа особых ситуаций. Кроме того, различают внутренние (программные) и внешние (аппаратные) источники генерации прерываний и особых ситуаций.
Внешние или аппаратные прерывания (External or Hardware interrupts):
Программные прерывания и особые ситуации (Software interrupts and Exceptions):
Таблица 3.1. Типы прерываний и особых ситуаций
Типы особых ситуаций и особенности их обработкиОсобые ситуации, генерируемые процессором подразделяются на три типа — ошибки, ловушки и сбои. В зависимости от типа особой ситуации различается реакция процессора на ее возникновение.
Правила функционирования механизма обработки прерываний и особых ситуаций существенно зависят от режима работы процессора и текущих установок некоторых флагов в регистре CR4. Сам этот механизм включает следующие элементы:
Таблица 6.55. Способы обработки процессором прерываний и особых ситуаций в различных режимах работы
|
Assembler
AssemblerВ конец страницы
Программы обработки прерываний (или попросту обработчики прерываний) относятся к важнейшим программным средствам персональных компьютеров. Запросы на обработку прерываний могут иметь различную природу. Прежде всего, различают аппаратные прерывания от периферийных устройств или других компонентов системы и программные прерывания, вызываемые командой int, которая используется, в частности, для программного обращения к функциям DOS и BIOS. Сигналы, возбуждающие аппаратные прерывания, могут инициироваться цепями самого процессора, например, при попытке выполнения операции деления на ноль (такие прерывания называются внутренними, или отказами), а могут приходить из периферийного оборудования (внешние прерывания). Внешние аппаратные прерывания вызываются, например, сигналами микросхемы таймера, сигналами от принтера или контроллера диска, нажатием или отпусканием клавиши. Таким образом, можно говорить о прерываниях трех типов: внутренних, внешних и программных. Независимо от источника, действия процессора по обслуживанию поступившего прерывания всегда выполняются одинаково, как для аппаратных, так и для программных прерываний. Эти действия обычно называют процедурой прерывания. Подчеркнем, что здесь идет речь лишь о реакции самого процессора на сигнал прерывания, а не об алгоритмах обработки прерывания, предусматриваемых пользователем в обработчике прерываний.
Объекты вычислительной системы, принимающие участие в процедуре прерывания, и их взаимодействие показаны на рис. 25.1.
Самое начало оперативной памяти от адреса 0000h до 03FFh отводится под векторы прерываний — четырехбайтовые области, в которых хранятся адреса программ обработки прерываний (ПОП). В два старших байта каждого вектора записывается сегментный адрес ПОП, в два младших — относительный адрес точки входа в ПОП в сегменте. Векторы, как и соответствующие им прерывания, имеют номера, причем вектор с номером 0 располагается, начиная с адреса 0, вектор 1 — с адреса 4, вектор 2 — с адреса 8 и т.д. Вектор с номером N занимает, таким образом, байты памяти от N*4 до N*4+3. Всего в выделенной под векторы области памяти помещается 256 векторов.
Адреса памяти
рис. 4.1. Процедура прерывания
Получив сигнал на выполнение процедуры прерывания с определенным номером, процессор сохраняет в стеке выполняемой программы текущее содержимое трех регистров процессора: регистра флагов, CS и IP. Два последних числа образуют полный адрес возврата в прерванную программу. Далее процессор загружает CS и IP из соответствующего вектора прерываний, осуществляя тем самым переход на ПОП.
Программа обработки прерывания обычно заканчивается командой возврата из прерывания iret (interrupt return, возврат из прерывания), выполняющей обратные действия — загрузку IP, CS и регистра флагов из стека, что приводит к возврату в основную программу в ту самую точку, где она была прервана.
Большая часть векторов прерываний предназначена для выполнения определенных действий и автоматически заполняется адресами системных программ при загрузке системы;
часть векторов зарезервирована для будущих применений, а часть (конкретно с номерами 60h…66h) свободна и может использоваться в прикладных программах.
Для того чтобы прикладной обработчик получал управление в результате прерывания, его адрес следует поместить в соответствующий вектор прерывания. Хотя содержимое вектора прерываний можно изменить простой командой mov, однако предпочтительнее использовать специально предусмотренную функцию DOS 25h. При вызове функции 25h в регистр AL помещается номер модифицируемого вектора, а в регистры DS:DX — полный двухсловный адрес нового обработчика.
Рассмотрим методику использования в прикладной программе прерывания пользователя.
Пример 4.1. Обработка прерываний пользователя
new_65h proc ;Процедура наложения на экран цветного окна для динамической ;очистки экрана по ходу выполнения программы mov АН, 06h ;Функция задания окна mov AL,0 ;Режим создания окна mov BH,1Bh ;Атрибут всех символов в окне: светло-бирюзовые символы, синий фон mov СХ,0 ;Координаты верхнего левого угла 0,0 mov DH,24 ;Нижняя Х-координата mov DL,79 ;Правая Х-координата int 10h ;Прерывание BIOS iret new_65h endp main proc mov AX,data mov DS,AX ;Заполним вектор прерывания пользователя адресом нашего обработчика mov АН,25h ;Функция заполнения вектора прерывания mov AL,65h ;Номер вектора mov DX,offset new_65h ;Смещение прикладного обработчика push DS ;Сохранны DS push CS ;Настроим DS на сегмент команд (в pop DS ;котором находится наш обработчик) int 21h ;Вызовем DOS pop DS ;Восстановим DS ;Будем в цикле выводить ил экран строки с предварительной очисткой экрана gogo: int 65h ;Вызов прикладного обработчика (очистка ;экрана перед выводом текста) ;Позиционируем курсор mov АН,02h ;Функция позиционирования mov BH,0 ;Видеостраница mov DH,line ;Строка mov DL,coloumn ;Столбец int 10h ;Прерывание BIOS ;Выведем на экран строку символов mov АН,0Ah ;функция вывода символа без атрибута mov AL,sym ;Символ mov BH,0 ;Видеостраница mov СХ,60 ;Коэффициент повторения int 10h ;Прерывание BIOS ;Изменим символ и позицию и зациклим программу с возможностью ;завершения по нажатию клавиш /C inc sym ;Следующий символ по таблице ASCII inc line ;Следующая строка экрана mov АН,08h ;Функция ввода баз эха, чувствует /C int 21h jmp gogo ;Бесконечный цикл main endp ;Поля данных line db 2 ;Строка coloumn db 10 ;Столбец sym db 0lh ;Выводимый символ
Процедура new_65h, вызываемая с помощью программного прерывания (для которого выбран вектор 65h), выполняет простую операцию — очищает экран, накладывая на него окно с заданным атрибутом.
В основной программе, прежде всего заполняется вектор прерывания 65h. Поскольку функция заполнения вектора 25h требует, чтобы адрес прикладного обработчика содержался в парс регистров DS:DX, a DS у нас указывает на сегмент данных, перед вызовом DOS в DS следует занести сегментный адрес того сегмента, в котором находится обработчик, т.е., в нашем случае, общего сегмента команд. Этот адрес извлекается из CS.
Далее в бесконечном цикле выполняется вызов нашего обработчика, позиционирование курсора с помощью функции 02h BIOS и вывод на чистый экран строки символов (функцией 0Ah BIOS). Эта функция не позволяет задавать атрибуты выводимых символов. Символы приобретают атрибут тех позиций, куда они выводятся, т.е., в нашем случае, атрибут окна. После вывода на экран строки выполняется изменение кода символов и номера строки экрана, куда эти символы выводятся.
Функция DOS 08h (ввод символа без эха), включенная в цикл, выполняет две задачи. Bo-первых, она останавливает выполнение программы и позволяет изучить содержимое экрана в каждом шаге цикла. Для того, чтобы продолжить выполнение программы, достаточно нажать на любую клавишу. Во-вторых, эта функция, будучи чувствительна к вводу с клавиатуры сочетания /C, позволяет завершить программу, которая в противном случае выполнялась бы вечно.
Обработчик прерываний от таймера.
Структура обработчика прерываний и его взаимодействие с остальными компонентами программного комплекса определяются рядом факторов, из которых важнейшими являются следующие:
• прерывания, инициализирующие обработчик, могут быть аппаратными (от периферийных устройств) или программными (команда int).
• обработчик может входить в состав прикладной программы или представлять собой самостоятельную единицу. В последнем случае он относится к специальному классу резидентных программ;
• вектор обрабатываемого прерывания может быть свободным и использоваться системой или какой-либо резидентной прикладной программой;
• если вектор уже используется системой, т. е. в составе DOS имеется системный или прикладной разработчик прерываний с данным номером, то новый обработчик может полностью заменять уже загруженный (превращая его тем самым фактически в бесполезную программу) или “сцепляться” с ним;
• в случае сцепления с загруженным ранее обработчиком новый обработчик может выполнять свои функции до уже имеющегося в системе или после него.
В настоящем разделе будут рассмотрены общие вопросы обработки прерываний на примере простого обработчика прерывания 1Ch.
Для того чтобы прикладные программы могли использовать сигналы таймера, не нарушая при этом работу системных часов, в программу BIOS, обслуживающую аппаратные прерывания от таймера, поступающие через вектор 08, включен вызов int 1Ch, передающий управление на программу-заглушку BIOS, которая содержит единственную команду iret (рис. 46.1.). пользователь может записать в вектор 1Ch адрес прикладного обработчика сигналов таймера и использовать в своей программе средства реального времени. Естественно, перед завершением программы следует восстановить старое значение вектора 1Ch.
Векторы прерываний Программа BIOS отсчета времени
Рис. 4.2 Прикладная обработка прерываний от таймера
При рассмотрении методики включения в программу процедур-подпрограмм мы отмечали, что порядок расположения процедур в программе не влияет на ход ее выполнения. Важно лишь так скомпоновать текст программы, чтобы подпрограммы никогда не активизировались “сами по себе”, иначе, чем в результате выполнения команды call в вызывающей программе. Это правило относится и к обработчикам прерываний, включаемым в состав программы. Текст обработчика можно расположить в любом месте программы, обеспечив лишь невозможность случайного перехода на его строки не в результате прерывания, а по ходу выполнения основной программы. Обычно обработчики располагаются либо в начале, либо в конце текста программы. В примере 46.1 текст обработчика идет вслед за текстом основной программы.
Другое замечание относится к оформлению программы обработчика. Так же, как и в случае подпрограмм, обработчик прерывания может образовывать процедуру (что наглядно), но может начинаться просто с метки. Важно лишь, чтобы последней выполняемой командой обработчика была команда iret.
Пример 4.2. Обработчик прерываний от таймера.
text segment 'code' ;(1) include mac.mac ;(2) assume CS:text;DS:data ;(3) main proc ;(4)Главная процедура mov AX,data ;(5)Сделаем наши данные mov DS,AX ;(6)адресуемыми ;Сохраним вектор 1Ch mov AX,351ch ;(7)Функция 35h, вектор 1Ch int 21h ;(8)Вызов DOS mov word ptr old_lch,BX ;(9)Сохраним смещение сегментного обработчика mov word ptr old_lch+2,ES ;(10)Сохраним сегмент системного обработчика ;Заполним вектор 1Ch mov AX,251Ch ;(11)Функция 25h, вектор 1Ch mov DX,offset new_lch ;(12)Смещение нашего обработчика push DS ;(13)Сохраним наш DS push CS ;(14)Настроим DS на сегмент обработчика pop DS ;(15)(т.е. на сегмент команд) int 21h ;(16)Вызов DOS pop DS ;(17)Восстановим адресуемость данных ;Организуем контрольный вывод на экран строк текста в цикле с задержкой mov СХ,20 ;(18)Число повторений вывода строк wri: write string ;(19)Макрокоманда вывода на экран delay 50 ;(20)Макрокоманда задержки loop wri ;(21) ;Перед завершением программы восстановим содержимое вектора 1Ch Ids DX,old_1ch ;(22)Отправим в DS:DX сохраненный вектор 1Ch mov AX,251Ch ;(23)Функция 25h, вектор 1Ch int 21h ;(24)Вызов DOS ;Завершим программу обычным образом outprog ;(25)Завершение программы main endp ;(26)Конец главной процедуры new_1ch proc ;(27)Процедура нашего обработчика ;Наш обработчик от таймера. Его функция - вывод на экран мигающего символа, ;свидетельствующего об активности программы! push AX ;(28)Сохраним используемые в push ES ;(29)нем регистры mov AX,OB800h ;(30)Настроим ES mov ES,AX ;(31)на видеобуфер mov AX,CS:syml ;(32)Получим символ с атрибутом из ячейки syml mov ES:3998,AX ;(33)Выведем в последнюю позицию экрана xchg AX,CS:sym2 ;(34)Обменяем содержимое mov CS:syml,AX ;(35)ячеек syml и sym2 pop ES ;(36)Восстановим pop AX ;(37)сохраненные регистры iret ;(38)Вывод из прерывания ;Поля данных обработчика в сегменте команд syml dw 421 Eh ;(39)Символы с атрибутами sym2 dw 241Eh ;(40)для вывода на экран new_lch endp ;(41)Конец процедуры обработчика text ends ;(42) data segment ;(43) old_lch dd 0 ;(44)Двухсловная ячейка для хранения ; исходного вектора string db '************0123456789**********',10,13,’$’ ;(45) data ends ;(46) end main ;(47)
В рассмотренном примере используются макрокоманды из файла mac.mac. Для того, чтобы сделать доступными эти макрокомнда в нашей программе, используем директиву include. Файл mac.mac имеет следующее содержание:
outprog macro ;(1)Завершение программы mov AX,4C00h ;(2) int 21h ;(3) endm ;(4) delay_50 macro ;(5)Задержка push CX ;(6) mov CX,100 ;(7)Счетчик внешнего цикла outer: push CX ;(8)Сохраним его в стеке mov CX,65535 ;(9)Счетчик внутреннего цикла inner: loop inner ;(10)Повторим команду loop 65535 раз pop CX ;(11)Восстановим внешний счетчик loop outer ;(12)Повторим все это 100 раз pop CX ;(13)Восстановим счетчик демо-цикла endm ;(14) write_string macro ;(15) mov AH,09h ;(16) AH=09h номер функции вывода на экран mov DX,offset string ; (17) В DX заносится адрес выводимого сообщения int 21h ; (18) Вызов прерывания MS-DOS endm ;(19)
Главная процедура начинается, как обычно, с инициализации сегментного регистра DS. Перед тем, устанавливать собственный обработчик какого-либо прерывания, следует сохранить его исходный (системный) вектор, чтобы перед завершением программы вернуть систему в исходное состояние. Для получения содержимого вектора 1Ch используется функция DOS 35h, которая возвращает содержимое указанного вектора в регистрах ES:BX. Для сокращения объема исходного текста программы и номер функции, и номер требуемого вектора заносятся в регистры АН и AL одной командой (предложение 7). Исходный вектор сохраняется в двухсловной ячейке old_1ch, объявленной директивой dd (define double, определить двойное слово) в сегменте данных программы. Однако команды пересылки не могут работать с двойными словами, поэтому сохраняемый вектор засылается из регистров ES:BX в память пословно, сначала в младшую половину ячейки old_1ch (предложение 9), затем в старшую, естественно, равен old_lch+2 (предложение 10). Поскольку ячейка old_1ch объявлена с помощью директивы dd, для обращения к ее составляющим (словам) необходимо включать в команду описатели word ptr (word pointer, указатель на слово), которые как бы отменяют на время трансляции команды первоначальное описание ячейки.
Сохранив вектор, мы можем приступить к заполнению его адресом нашего обработчика. Для этого используется функция DOS 25h, которая, как уже отмечалось, требует указания в регистре AL номера заполняемого вектора, а в регистрах DS:DX полного адреса обработчика, который и будет записан в указанный нами вектор. Однако регистр DS настроен на сегмент данных программы. Кстати, если бы это было не так, мы не могли бы выполнить предложения 9 и 10, так как поля данных программы адресуются через регистр DS. Поэтому на время выполнения функции 25h нам придется изменить содержимое DS, настроив его на тот сегмент, в котором находится процедура обработчика, т.е. на сегмент команд. Это и выполняется в предложениях 13… 15. Содержимое DS сохраняется в стеке, а затем в него через стек заносится содержимое регистра CS, который, очевидно, указывает на сегмент команд. После возврата из DOS в программу исходное содержимое DS восстанавливается (предложение 17).
Начиная с этого момента, прерывания от таймера, приводящие к выполнению в системной программе BIOS команды int 1Ch, будут активизировать 18,2 раз в секунду программу нашего обработчика. При этом вся наша программа должна находиться в памяти и что-то делать, так как если она завершена, то она и обработчик уйдут из памяти. Для задержки программы в ней предусмотрен многократный, в цикле вывод на экран строки текста (предложения 18…21).
Перед завершением программы необходимо с помощью той же функции 25h восстановить исходное содержимое вектора 1Ch. Для загрузки регистров DS:DX требуемым адресом в примере 46.1 используется удобная команда Ids (load pointer using DS, загрузка указателя с использованием DS). В качестве операндов для этой команды указывается один из регистров общего назначения и двухсловное поле памяти с искомым адресом. Следует иметь в виду, что после выполнения этой команды старое содержимое регистра DS теряется. В нашем примере оно больше не нужно, так как, выполнив восстановление вектора, программа завершается (предложение 25). Вообще же перед выполнением команды Ids исходное содержимое регистра DS следует сохранить в стеке.
Рассмотрим теперь программу обработчика прерывания от таймера. Программа начинается с сохранения в стеке регистров, которые будут использоваться в обработчике. Это чрезвычайно важное действие, так как переход на программу обработчика осуществляется по команде int1ch из системной программы обработки прерываний от таймера. При выполнении процедуры прерывания процессор настраивает должным образом только регистры CS и IP. Содержимое всех остальных регистров (в том числе сегментных) отражает состояние системной программы, и если оно будет изменено, то после возврата из нашего обработчика в вызвавшую его системную программу она перестанет функционировать. В нашем обработчике используются лишь регистры АХ и ES, которые и сохраняются в стеке (предложения 28-29).
Далее регистр ES настраивается на адрес видеобуфера (предложения 30-31), а в регистр АХ помещается код ASCII выводимого на экран символа вместе с его атрибутом (предложение 32). В последнем предложении используется важная возможность замены сегмента. Как уже отмечалось, при обращении к памяти по умолчанию используется сегментный регистр DS, т.е. предполагается, что адресуемая ячейка находится в том сегменте, на который в настоящий момент указывает DS, в нашем же случае в момент выполнения этой команды DS почти, наверное указывает на какой-то сегмент программы BIOS. Для адресации к нашим данным можно сохранить содержимое DS и настроить его на наши данные. Однако можно поступить проще, именно, ввести в команду префикс замены сегмента CS: и тем самым указать транслятору, чтобы он в данной команде использовал адресацию через регистр CS. Но и данные в этом случае следует разместить не в сегменте данных, к которому нет доступа, а в сегменте команд. У нас так и сделано. Ячейки sym1 и sym2, к которым обращается обработчик, расположены в конце процедуры new_1ch в пределах сегмента команд (предложения 39-40).
Вывод одного и того же символа в одно и то же место экрана приведет к тому, что мы не будем знать, работает ли наш обработчик. В нашем примере предусмотрена периодическая смена атрибута символа, что делает символ мерцающим. Для этого при каждом проходе программы обработчика ячейки sym1 и sym2 взаимно обмениваются своим содержимым. В результате на экран выводится то один, то другой код. Для обмена содержимого регистров или ячеек предусмотрена специальная команда xchg (exchange, обмен). Поскольку в микропроцессорах 80х86 запрещены команды с адресацией к памяти в обоих операндах, обмен приходится осуществлять через регистр АХ.
После восстановления сохраненных в стеке регистров работа обработчика завершается командой iret, которая передает управление назад в вызвавшую наш обработчик программу BIOS. Когда эта программа дойдет до своего завершения, она выполнит команду iret и управление вернется в нашу программу в ту (неопределенную) точку, в которой она была прервана сигналом таймера.
Кроме того при необходимости работать с реальным временем можно использовать различные функции – одна из них AH=00h. Формат её использования имеет следующий вид:
INT 1Ah АН = 00h — Считать значение счетчика времени.
Ввод: АН = 00h
Вывод: CX:DX=значение счетчика, AL=байт переполнения счетчика.
Приведём пример программы, использующей эту функцию. Программа выводит на экран прямоугольник, который меняет цвет с периодичностью 3 секунды, выход по F10. Задержка реализована в макрокоманде. Пример 4.3
Макроопределение задержки; dely macro time ;(1) local zd,c1,cikl,ii,ii1 ;(2) описываем все метки, используемые вмакроопределении push cx ;(3) помещаем в стек используемые в макроопределении push bx ;(4) регистры push bp ;(5) push ax ;(6) push dx ;(7) mov cx,time ;(8) задаём количество повторений цикла задержки zd – zd: push cx ;(9) задержка в цикле 18.2 секунды mov bp,0 ;(10) mov bx,1 ;(11) cikl: inc BP ;(12) mov ah,00h ;(13) int 1Ah ;(14) cmp BP,1 ;(15) je ii ;(16) переходим на метку ii на первой итерации цикла jmp ii1 ;(17) на следующих итерациях переходим на метку ii1 ii: add bx,dx ;(18) формируем значение на единицу больше, чем в ii1: ;(19) регистре dx cmp bx,dx ;(20) если значение в регистре dx изменилось(сравниваем jne cikl ;(21) значение в dx с сформированным в строке 18 pop cx ;(22) значением в регистре bx, которое на единицу больше, loop zd ;(23)на единицу больше значение в dx станет через 18.2 сек) pop cx ;(24) если нет, то новая итерация циклаесли да, конец pop bx ;(25) макрокоманды задержки pop bp ;(26) pop ax ;(27) pop dx ;(28) endm ;(29) Text segment 'code' ;(30) assume CS:text,DS:data;(31) ;процедура рисования прямоугольника Prymoug proc ;(32) mov AL,cvet ;(33) определяем цвет mov BH,0 ;(34) видеостраница mov SI,250 ;(35) задаём начальные mov DI,150 ;(36) координаты mov CX,y ;(37) высота прямоугольника Prym1: push CX ;(38) mov CX,x ;(39) ширина прямоугольника Prym: push CX mov AH,0ch ;(40) функция ввода пиксела mov CX,SI ;(41) задаем начальные mov DX,DI ;(42) координаты int 10h ;(43) перрывание BIOS inc SI ;(44) смещение по оси ox pop CX ;(45) loop Prym inc DI ;(46) смещение по oy mov SI,250 ;(47) возвращаем прежнюю x-координату pop CX ;(48) loop Prym1 ;(49) ret ;(50) Prymoug endp ;(51) ;процедура задержки Zadergka proc ;(52) mov bp,1 ;(53) mov cvet1,1 ;(54) mig: ;(55) mov bl,cvet1 ;(56)задаём значение mov cvet,bl ;(57)цвета call prymoug ;(58) dely 18 ;(59) задержка в одну секунду inc bp ;(60) cmp bp,3 ;(61)на третьей итерации цикла(когда задержка будет 3 сек. ) je changCvet ;(62) переходим на метку changCvet mov ah,06h ;(63) функция ввода с клавиатуры без эха mov dl,0ffh ;(64) задаём режим функции int 21h ;(65) cmp al,44h ;(66) если нажата F10( 44h –ASCI код F10), то переходим на jne mig ;(67) ex – выход из программы jmp ex ;(68) changCvet: inc cvet1 ;(69) меняем константу цвета mov bp,1 ;(70) приводим счётчик в исходное положение jmp mig ;(71) ex: ;(72) ret ;(73) Zadergka endp ;(74) ;главная процедура Main proc ;(75) mov AX,data ;(76) mov DS,AX ;(77) int 21h ;(78) mov x,30 ;(79) задаём ширину прямоугольника mov y,30 ;(80) mov AH,00h ;(81) функция задания режима mov AL,10h ;(82) графический режим EGA int 10h ;(83) прерывание BIOS call Zadergka ;(84) вызываем процедуру задержки mov AH,00h ;(85) возвращаемся в mov AL,03h ;(86) текстовый режим int 10h ;(87) mov ax,4c00h ;(88) int 21h ;(89) main endp ;(90) text ends ;(91) data segment ;(92) x dw 0 ;(93) y dw 0 ;(94) cvet db 0 ;(95) cvet1 db 0 ;(96) data ends ;(97) stk segment stack 'stack';(98) dw 128 dup (0) ;(99) stk ends ;(100) end main ;(101)
Общий алгоритм работы макроопределения задержки следующий: результат работы функции 00h возвращается в регистрах СX:DX. В данной программе работаем по регистру DX – младшие значения времени. Значение в регистре DX изменяется 18.2 раза в секунду, поскольку именно с такой периодичностью таймер вызывает аппаратное переывание. Сохраняем в регистре bx значение на единицу больше, чем в dx, затем сравниваем эти значения(строка 20). Всё это происходит в цикле. Как только значение dx измениться(прошло 18.2 сек) происходит выход из цикла. Данный цикл заключён во внешний цикл zd(строка 9). И поскольку внешний цикл cikl(строка 11) выполняется 18.2 раза в сек., то если внешний выполнить 18 раз, то общая задержка примерно равна 1 сек. Параметром, задающим количество повторений внешнего цикла, является параметр макрокоманды time. Т.е. команда Dely 18 – задержка примерно в 1 сек. для данного макроопределения.
В начало страницы
Где я могу найти список прерываний для набора команд i486-linux-gnu?
Я разрабатываю компилятор для своего старшего школьного проекта и использую AS (GNU Assembler) для сборки. Все мои тесты были довольно успешными, но ни один список прерываний, который я видел, не работал или не совпадал с моим тестовым кодом.
Соответствующая информация для этой версии AS:
GNU ассемблер 2.17 Debian GNU/Linux Copyright 2005 Free Software Foundation, Inc. Эта программа является свободным программным обеспечением; вы можете распространять ее в соответствии с условиями GNU General Public License. Эта программа не имеет абсолютно никаких гарантий. Этот ассемблер был настроен для цели `i486-linux-gnu’.
linux assembly gnu compiler-construction gnu-assemblerПоделиться Источник Unknown 07 апреля 2009 в 03:33
3 ответа
- исполняемый файл g++ не может найти общую библиотеку
Я работал с libevent 2.X в офисе. Дома у меня есть Ubuntu 10.4, который предоставляет libevent 1. 4, поэтому я скачал и скомпилировал последнюю версию libevent. Теперь у меня есть заголовок в /usr/local/include и библиотечный файл в /usr/local/lib. Но моя проблема заключается в том, что исполняемый…
- Где я могу найти список команд Prolog?
Я новичок в Prolog и пытаюсь сделать программу, чтобы проверить, могут ли некоторые значения быть датой, но я не знаю, что я могу сделать с языком. Я не знаю команд. Например, я хочу получить длину строки, но не знаю, возможно ли это. Кто-нибудь может показать мне список команд Prolog? Я использую…
3
В linux вы используете одно прерывание: 80h. Syscall, которому соответствует это прерывание, можно найти в этой таблице .
Поделиться poundifdef 06 января 2010 в 02:53
2
Linux не использует прерывания для системных вызовов так же, как DOS. Он использует архитектурно-зависимый метод для выполнения системных вызовов, который на x86 может быть int 0x80, но modern (Pentium+) CPUs должен использовать вместо этого инструкцию SYSENTER. Другие программные прерывания не используются.
Обычно вы не беспокоитесь об этом, потому что даже на языке assembly вы, вероятно, все равно захотите использовать библиотеку C, которая обертывает их.
Поделиться MarkR 07 апреля 2009 в 08:43
0
ИМХО, способ подключения прерываний зависит от аппаратного обеспечения. Возможно, будет поучительно посмотреть, как Linux kernel справляется с прерываниями на оборудовании, на которое вы нацелены.
Поделиться lothar 07 апреля 2009 в 04:30
Похожие вопросы:
Где я могу найти модуль Python` pwd ‘ для MS Windows?
Я использую модуль Python standard library pwd на GNU+Linux, но теперь я пытаюсь запустить свое приложение в Microsoft Windows и не могу его найти. Я использую python 2.6.6. Где я могу найти модуль…
Не удается найти-lgfortran, хотя gfortran установлен
Возможный Дубликат : lgfortran не найден Я должен признать , что мой вопрос можно считать очень похожим на lgfortran not found , но поскольку я новичок в Linux, мне нужна дополнительная помощь, и я…
Где я могу найти документацию для MicroStrategy Command Manager
Где я могу найти документацию для MicroStrategy Command Manager? Я просмотрел различные документы, которые у меня есть, но не смог найти никакого полного списка команд. В частности, мне нужно знать…
исполняемый файл g++ не может найти общую библиотеку
Я работал с libevent 2.X в офисе. Дома у меня есть Ubuntu 10.4, который предоставляет libevent 1.4, поэтому я скачал и скомпилировал последнюю версию libevent. Теперь у меня есть заголовок в…
Где я могу найти список команд Prolog?
Я новичок в Prolog и пытаюсь сделать программу, чтобы проверить, могут ли некоторые значения быть датой, но я не знаю, что я могу сделать с языком. Я не знаю команд. Например, я хочу получить длину…
Как указать пользовательский каталог stdlib для LLVM
У меня есть LLVM 3.3 с Clang, и $ /tmp/clang/bin/clang -print-search-dirs programs: =/tmp/clang/bin:/usr/lib/gcc/i486-linux-gnu/4.4/../../../../i486-linux-gnu/bin libraries:…
Указание ld, где искать зависимые общие библиотеки во время компиляции
Я пытаюсь кросскомпилировать некоторые библиотеки для процессора ARM, в частности: DirectFB, который зависит от libpng, который зависит от zlib. Libpng связан с zlib, но поскольку пути в системе…
Где написать обработчик прерываний и как зарегистрироваться с kernel в linux?
Сценарий: клиент отправляет данные, а сервер получает их от клиента через уровень ethernet (udp). Когда сервер получает данные от клиента на ip-уровне (kernel). Он прерывает kernel и kernel как для…
Где я могу найти команды linux os bluetooth hcitool
В Linux, в hcitool command имеет суб-команды cmd ( hcitool cmd hex…. ) Вопрос: кто-нибудь знает, где я могу найти список команд, доступных в разделе hcitool cmd ? а их совместное реагирование hexa…
Linux Обработка Прерываний
Я пытаюсь понять механизм обработки прерываний Linux. Я попробовал немного погуглить, но не смог найти ответа на этот вопрос. Может ли кто-нибудь объяснить мне, почему handle_IRQ_event должен…
3.5.3 Программные прерывания
Программное прерывание реализует один из способов перехода на подпрограмму с помощью специальной инструкции процессора, такой как INT в процессорах Intel Pentium; trap в процессорах Motorola, syscal1 в процессорах MIPS или Ticc в процессорах SPARC. При выполнении команды программного прерывания процессор отрабатывает ту же последовательность действий, что и при возникновении внешнего или внутреннего прерывания, но только происходит это в предсказуемой точке программы — там, где программист поместил данную, команду.
Практически все современные процессоры имеют в системе команд инструкции программных прерываний. Одной из причин появления инструкций программных прерываний в системе команд процессоров является то, что их использование часто приводит к более компактному коду программ по сравнению с использованием стандартных команд выполнения процедур. Это объясняется тем, что разработчики процессора обычно резервируют для обработки прерываний небольшое число возможных подпрограмм, так что длина операнда в команде программного прерывания, который указывает на нужную подпрограмму, меньше, чем в команде перехода на подпрограмму. Например, в процессоре х86 предусмотрена возможность применения 256 программ обработки прерываний, поэтому в инструкции INT операнд имеет длину в один байт (а инструкция INT ), которая предназначена для вызова отладчика, вся имеет длину один байт). Значение операнда команды INT просто является индексом в таблице из 256 адресов подпрограмм обработки прерываний, один из которых и используется для перехода по команде INT. При использовании команды CALL потребовался бы уже не однобайтовый, а двух- или четырехбайтовый операнд. Другой причиной применения программных прерываний вместо обычных инструкций вызова подпрограмм является возможность смены пользовательского режима на привилегированный одновременно с вызовом процедуры — это свойство программных прерываний поддерживается большинством процессоров.
В результате программные прерывания часто используются для выполнения ограниченного количества вызовов функций ядра операционной системы, то есть системных вызовов.
3.5.4 Диспетчеризация и приоритезация прерываний в ос
Операционная система должна играть активную роль в организации обработки прерываний. Прерывания выполняют очень полезную для вычислительной системы функцию — они позволяют реагировать на асинхронные по отношению к вычислительному процессу события. В то же время прерывания создают дополнительные трудности для ОС в организации вычислительного процесса. Эти трудности связаны с непредвиденными переходами управления от одной процедуры к другой, возникающими в результате прерываний от контроллеров внешних устройств. Возможно также возникновение в непредвиденные моменты времени исключений, связанных с ошибками во время выполнения инструкций. Усложняют задачу планирования вычислительных работ и запросы на выполнение системных i функций (системные вызовы) от пользовательских приложений, выполняемые с помощью программных прерываний. Сами модули ОС также часто вызывают друг друга с помощью программных прерываний, еще больше запутывая картину вычислительного процесса.
Операционная система не может терять контроль над ходом выполнения системных процедур, вызываемых по прерываниям. Она должна упорядочивать их во времени так же, как планировщик упорядочивает многочисленные пользовательские потоки. Кроме того, сам планировщик потоков является системной процедурой, вызываемой по прерываниям (аппаратным — от таймера или контроллера устройства ввода-вывода, или программным — от приложения или модуля ОС). Поэтому правильное планирование процедур, вызываемых по прерываниям, Является необходимым условием правильного планирования пользовательских потоков. В противном случае в системе могут возникать, например, такие ситуации, когда операционная система будет длительное время заниматься не требующей мгновенной реакции задачей управления стримером, архивирующим данные, в то время, когда высокоскоростной диск будет простаивать и тормозить работу многочисленных приложений, обменивающихся данными с этим диском. Еще один пример такой ситуации иллюстрирует рис. 3.5. В данном случае обработчик прерываний принтера блокирует на длительное время обработку прерывания от таймера, в результате чего системное время на некоторое время «замирает» и поток 2, критически важный для пользователя, не получает управление в запланированное время. Остроту проблемы несколько смягчает то обстоятельству), что во многих случаях обработка прерывания связана с выполнением всего .нескольких операций ввода-вывода и поэтому имеет очень небольшую продолжительность. Тем не менее ОС всегда должна контролировать ситуацию и выполнять критичную работу вовремя, а не полагаться на волю случая.
Для упорядочения работы обработчиков прерываний в операционных системах применяется тот же механизм, что и для упорядочения работы пользовательских процессов — механизм приоритетных очередей. Все источники прерываний обычно делятся на несколько классов, причем каждому классу присваивается .приоритет. В операционной системе выделяется программный модуль, который занимается диспетчеризацией обработчиков прерываний. Этот модуль в разных ОС называется по-разному, но для определенности будем его называть диспетчером прерываний.
При возникновении прерывания диспетчер прерываний вызывается первым. Он запрещает ненадолго все прерывания, а затем выясняет причину прерывания. После этого диспетчер сравнивает назначенный данному источнику прерывания приоритет и сравнивает его с текущим приоритетом потока команд, выполняемого процессором. В этот момент времени процессор уже может выполнять инструкции другого обработчика прерываний, также имеющего некоторый приоритет. Если приоритет нового запроса выше текущего, то выполнение текущего обработчика приостанавливается и он помещается в соответствующую очередь обработчиков прерываний. В противном случае в очередь помещается обработчик нового запроса.
Рис. 3.5. Неупорядоченная обработка прерываний
ПРИМЕЧАНИЕ
Приоритет обработчиков прерываний не совпадает в общем случае с приоритетом потоков, выполняемых в обычной последовательности, определяемой планировщиком потоков. По отношению к обработчикам прерываний любой поток, который назначен на выполнение планировщиком, имеет самый низкий приоритет, так что любой запрос на прерывание всегда может прервать выполнение этого потока.
Прерывания
Прерывание (interrupt) – событие, требующие немедленной реакции со стороны процессора. Реакция состоит в том, что процессор прерывает обработку текущей программы (прерываемой программы) и переходит к выполнению некоторой другой программы (прерывающей программы), специально предназначенной для данного события. По завершении этой программы процессор возвращается к выполнению прерванной программы.
Каждое событие, требующее прерывания, сопровождается сигналом прерывания, оповещающим об этом вычислительную машину, и называемым запросом прерывания.
Состояние программы представляет собой совокупность состояний всех запоминающих элементов в соответствующий момент времени (например, после выполнения последней команды). При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд и загружает в него адрес соответствующего вектора прерывания. Последней командой подпрограммы обработки прерывания должна быть команда, которая осуществляет возврат в основную программу и восстановление предварительно сохраненного счетчика команд. Во время выполнения обработчика прерывания некоторая информация может подвергнуться изменению. Поэтому при переходе к обработчику прерывания необходимо сохранить элементы, подвергающиеся изменению. Набор таких элементов представляет собой вектор состояния программы. При этом другая информация о состоянии ячеек памяти не существенна или может быть восстановлена программным путем.
Вектор начального состояния содержит всю необходимую информацию для начального запуска программы. Во многих случаях вектор начального состояния содержит только один элемент – начальный адрес запускаемой программы.
Вектор прерывания является вектором начального состояния прерывающей программы (обработчика) и содержит всю необходимую информацию для перехода к обработчику, в том числе его начальный адрес. Каждому типу прерываний соответствует свой вектор прерывания, который инициализирует выполнение соответствующего обработчика. Обычно векторы прерывания хранятся в специально выделенных фиксированных ячейках памяти с короткими адресами, представляющих собой таблицу векторов прерываний. Для перехода к соответствующей прерывающей программе процессор должен располагать вектором прерывания и адресом этого вектора. По этому адресу, как правило, находится команда безусловного перехода к подпрограмме обработки прерывания.
Как правило, управление запоминанием и возвратом возложено на обработчик прерывания. В этом случае обработчик состоит из трех частей – подготовительной (пролог) и заключительной (эпилог), обеспечивающих переключение программ, и собственно прерывающей программы, выполняющей затребованные запросом операции. Время реакции определяется как временной интервал от момента поступления запроса прерывания до начала выполнения прерывающей программы.
tp – время реакции системы на прерывание;
tз – время запоминания состояния прерываемой программы;
tппр – время собственно прерывающей программы;
tв – время восстановления состояния прерванной программы
При наличии нескольких источников запросов должен быть установлен определенный порядок обслуживания поступающих запросов, называемый приоритетными соотношениями или дисциплиной обслуживания. Совокупность всех возможных типов прерывания процессора представляет собой систему прерывания микроконтроллера. Дисциплина обслуживания определяет, какой из нескольких запросов, поступивших одновременно, подлежит обработке в первую очередь, и имеет ли право данный запрос прерывать тот или иной обработчик прерывания.
В случае если во время обработки прерывания поступает запрос на прерывание с более высоким уровнем приоритета, управление передается обработчику прерывания более высокого приоритета, при этом работа обработчика прерывания с более низким уровнем приоритета приостанавливается. Возникает вложенность прерываний. Максимальное число программ, которые могут приостанавливать друг друга называется глубиной прерываний.
Если запрос прерывания окажется не обслуженным к моменту прихода нового запроса от того же источника (того же приоритета), то возникает насыщение системы прерываний. При этом часть запросов прерывания будет утрачена, что для нормальной работы микроконтроллера недопустимо.
Характеристиками системы прерывания являются:
- общее количество запросов прерывания – количество источников запросов прерывания;
- тип представления прерывания – как правило, запрос прерывания представлен логическим уровнем сигнала;
- приоритет прерывания – определяет очередность обработки каждого запроса прерывания, чем выше приоритет, тем меньше задержка в исполнении прерывающей программы для него;
- время реакции – временной интервал между появлением запроса прерывания и началом выполнения прерывающей программы;
- задержка прерывания – определяется суммарным временем на запоминание и восстановление программы;
- глубина, обычно совпадает с числом уровней приоритетов в системе прерывания;
- насыщение системы прерывания;
- допустимые моменты прерывания программ (как правило, окончание выполнения следующей команды).
Маскирование прерываний используется для сообщения микроконтроллеру о необходимости реагировать на каждый тип прерывания или игнорировать его. Маска прерывания представляет двоичный код, разряды которого поставлены в соответствие источникам запроса прерываний. Единичный бит в двоичном коде сообщает микроконтроллеру о необходимости обработки прерываний такого типа. Нулевой бит напротив не позволяет микроконтроллеру переходить к обработке прерываний указанного типа.
Как правило, кроме маскирования прерываний, существует также бит глобального разрешения прерываний, нулевое значение которого отключает все обработчики прерываний (кроме аппаратного сброса и перехода к началу исполняемой программы).
Кроме двоичного кода маски прерываний существует также двоичный код флагов прерываний, который позволяет обработчику прерываний установить источник возникновения прерывания в случае если источников с указанным запросом в микроконтроллере несколько.
Назад
Назад: Программирование микроконтроллеров
Ответы на вопрос «18. Система прерываний ЭВМ, ее назначение и …»
Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается и управление передаётся обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код. В зависимости от источника возникновения сигнала прерывания делятся на: асинхронные или внешние (аппаратные) — события, которые исходят от внешних источников (например, периферийных устройств) и могут произойти в любой произвольный момент: сигнал от таймера, сетевой карты или дискового накопителя, нажатие клавиш клавиатуры, движение мыши; внутренние — события в самом процессоре как результат нарушения каких-то условий при исполнении машинного кода: деление на ноль или переполнение, обращение к недопустимым адресам или недопустимый код операции; программные (частный случай внутреннего прерывания) — инициируются исполнением специальной инструкции в коде программы. Программные прерывания как правило используются для обращения к функциям встроенного программного обеспечения (firmware),драйверов и операционной системы. Приоритезация Приоритезация означает, что все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание. Приоритеты могут обслуживаться как относительные и абсолютные. Относительное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то это прерывание будет обработано только после завершения текущей процедуры обработки прерывания. Абсолютное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то текущая процедура обработки прерывания вытесняется, и процессор начинает выполнять обработку вновь поступившего более приоритетного прерывания. После завершения этой процедуры процессор возвращается к выполнению вытесненной процедуры обработки прерывания.
Контроллер прерываний — микросхема или встроенный блок процессора, отвечающий за возможность последовательной обработкизапросов на прерывание от разных устройств. Как правило представляет собой электронное устройство, иногда выполненное как часть самого процессора или же сложных микросхем его обрамления, входы которого присоединены электрически к соответствующим выходам различных устройств. Номер входа контроллера прерываний обозначается «IRQ». Следует отличать этот номер от приоритета прерывания, а также от номера входа в таблицу векторов прерываний (INT). Так, например, в IBM PC в реальном режиме работы (в этом режиме работает MS-DOS) процессора прерывание от стандартной клавиатуры использует IRQ 1 и INT 9.
Таблица прерываний Номер Описание 0 Ошибка деления.(деление на 0) 1 Прерывание пошагового режима.Вырабатывается после выполнения каждой машинной команды, если в слове флагов установлен бит пошаговой трассировки TF. 2 Обычно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора 3 обычно используется отладчиками для установки точки прерывания 4 Переполнение. 5 Печать копии экрана. 6 Неопределенный код операции или длина команды больше 10 байт 7 Особый случай отсутствия арифметического сопроцессора 8 IRQ0 — прерывание интервального таймера, возникает 18,2 раза в секунду 9 IRQ1 — прерывание от клавиатуры. Генерируется, когда пользователь нажимает и отжимает клавиши. Используется для чтения данных из клавиатуры A IRQ2 — используется для каскадирования аппаратных прерываний B IRQ3 — прерывание асинхронного порта COM2 C IRQ4 — прерывание асинхронного порта COM1 D IRQ5 — прерывание от контроллера жесткого диска (только для компьютеров IBM PC/XT) E IRQ6 — прерывание генерируется контроллером НГМД после завершения операции ввода/вывода F IRQ7 — прерывание от параллельного адаптера. Генерируется, когда подключенный к адаптеру принтер готов к выполнению очередной операции. Обычно не используется 10 Обслуживание видеоадаптера 11 Определение конфигурации устройств в системе 12 Определение размера оперативной памяти 13 Обслуживание дисковой системы 14 Работа с асинхронным последовательным адаптером 15 Расширенный сервис 16 Обслуживание клавиатуры 17 Обслуживание принтера 18 Запуск BASIC в ПЗУ, если он есть 19 Перезагрузка операционной системы
С прерываниями появилась возможность последовательной обработки запросов от разных устройств, т.е. своевременного реагирования на всевозможные запросы.
Как ядро Linux обрабатывает прерывания
Прерывания являются важной частью работы современных ЦП. Например, каждый раз, когда вы нажимаете клавишу на клавиатуре, ЦП прерывается, так что ПК может считывать ввод пользователя с клавиатуры. Это происходит так быстро, что вы не замечаете никаких изменений или ухудшения пользовательского опыта.
Более того, клавиатура — не единственный компонент, который может вызывать прерывания. В общем, существует три типа событий, которые могут вызвать прерывание ЦП: Аппаратных прерываний , программных прерываний и исключений . Прежде чем перейти к различным типам прерываний, я определю некоторые термины.
Определения
Запрос прерывания ( IRQ ) запрашивается программируемым контроллером прерываний ( PIC ) с целью прерывания ЦП и выполнения процедуры обслуживания прерывания ( ISR ). ISR — это небольшая программа, которая обрабатывает определенные данные в зависимости от причины IRQ. Обычная обработка прерывается до завершения ISR.
В прошлом IRQ обрабатывались отдельным микрочипом — PIC — и устройства ввода / вывода подключались напрямую к PIC.PIC управляет различными аппаратными IRQ и может напрямую общаться с ЦП. Когда возникает прерывание, PIC записывает данные в ЦП и поднимает вывод запроса прерывания ( INTR ).
В настоящее время IRQ обрабатываются усовершенствованным программируемым контроллером прерываний ( APIC ), который является частью ЦП. Каждое ядро имеет собственный APIC.
Типы прерываний
Как я уже упоминал, прерывания можно разделить на три типа в зависимости от их источника:
Аппаратные прерывания
Когда аппаратное устройство хочет сообщить ЦП, что определенные данные готовы к обработке (например,g., ввод с клавиатуры или когда пакет поступает на сетевой интерфейс), он отправляет IRQ, чтобы сигнализировать ЦП, что данные доступны. Это вызывает конкретную ISR, которая была зарегистрирована драйвером устройства во время запуска ядра.
Программные прерывания
Когда вы воспроизводите видео, важно синхронизировать воспроизведение музыки и видео, чтобы скорость музыки не менялась. Это достигается с помощью программного прерывания, которое периодически запускается системой точного таймера (известной как jiffies).Этот таймер позволяет вашему музыкальному проигрывателю синхронизироваться. Программное прерывание также может быть вызвано специальной инструкцией для чтения или записи данных на аппаратное устройство.Программные прерывания также важны, когда требуется возможность работы в реальном времени (например, в промышленных приложениях). Дополнительную информацию об этом можно найти в статье Linux Foundation «Введение в Linux реального времени для разработчиков встраиваемых систем» .
Исключения
Исключения — это тип прерывания, о котором вы, вероятно, знаете.Когда ЦП выполняет команду, результатом которой может быть деление на ноль или сбой страницы, любое дополнительное выполнение прерывается. В таком случае вы будете проинформированы об этом во всплывающем окне или увидев segmentation fault (core dumped) в выводе консоли. Но не каждое исключение вызвано ошибочной инструкцией.
Исключения можно разделить на ошибок, , , прерывания, и , прерывания, .
- Неисправности: Неисправности — это исключения, которые система может исправить, например.g., когда процесс пытается получить доступ к данным со страницы памяти, которая была перенесена на жесткий диск. Запрошенный адрес находится в адресном пространстве процесса, и права доступа правильные. Если страница отсутствует в ОЗУ, возникает прерывание прерывания и запускается обработчик исключения сбоя страницы для загрузки нужной страницы памяти в ОЗУ. Если операция прошла успешно, выполнение продолжится.
- Ловушки: Ловушки в основном используются для отладки. Если вы устанавливаете точку останова в программе, вы вставляете специальную инструкцию, которая запускает ловушку.Ловушка может вызвать переключение контекста, которое позволяет вашему отладчику читать и отображать значения локальных переменных. После этого казнь может быть продолжена. Ловушки также являются стандартным способом выполнения системных вызовов (например, убийства процесса).
- Прерывания: Прерывания вызваны отказом оборудования или несогласованными значениями в системных таблицах. При прерывании не указывается местонахождение инструкции, вызвавшей исключение. Это самые важные прерывания. Прерывание вызывает системный обработчик исключения прерывания , который завершает процесс, вызвавший его.
Практическое руководство
IRQ упорядочены по приоритету в векторе APIC (0 = наивысший приоритет). Первые 32 прерывания (0–31) имеют фиксированную последовательность, определяемую ЦП. Вы можете найти их обзор на странице исключений OsDev. Последующие IRQ могут быть назначены по-другому. Таблица дескрипторов прерывания ( IDT ) содержит назначение между IRQ и ISR. Linux определяет вектор IRQ от 0 до 256 для назначения.
Чтобы распечатать список зарегистрированных прерываний в вашей системе, откройте консоль и введите:
cat / proc / interrupts
Вы должны увидеть что-то вроде этого:
Слева направо столбцы: вектор IRQ, количество прерываний на CPU ( 0.. n
), аппаратный источник, информация о канале аппаратного источника и имя устройства, вызвавшего IRQ.
Внизу таблицы есть несколько нечисловых прерываний. Это прерывания, зависящие от архитектуры, такие как прерывание локального таймера ( LOC ) на IRQ 236. Некоторые из них указаны в векторном макете Linux IRQ в дереве исходных текстов ядра Linux.
Чтобы просмотреть эту таблицу в реальном времени, запустите:
смотреть -n1 "cat / proc / interrupts"
Заключение
Правильная обработка IRQ важна для правильного взаимодействия оборудования, драйверов и программного обеспечения.К счастью, ядро Linux действительно хорошо работает, и обычный пользователь ПК почти ничего не заметит во всей обработке прерываний в ядре.
Это может быть очень сложно, и эта статья дает только краткий обзор темы. Хорошими источниками информации для более глубокого погружения в тему являются электронная книга Linux Inside (CC BY-NC-SA 4. 0) и репозиторий Linux Kernel Teaching.
прерываний — документация ядра Linux
Что такое прерывание?
Прерывание — это событие, которое изменяет нормальный поток выполнения программа и может быть сгенерирована аппаратными устройствами или даже ЦП сам.Когда происходит прерывание, текущий поток выполнения приостанавливается и запускается обработчик прерываний. После запуска обработчика прерывания возобновляется предыдущий поток выполнения.
Прерывания можно разделить на две категории в зависимости от источника прерывание. Их также можно сгруппировать в две другие категории на основе о возможности отложить или временно отключить прерывание:
- синхронный , сгенерированный выполнением инструкции
- асинхронный , сгенерированный внешним событием
- маскируется
- можно игнорировать
- сигнализируется через вывод INT
- немаскируется
- нельзя игнорировать
- сигнализируется через вывод NMI
Синхронные прерывания, обычно называемые исключениями, обрабатывают условия, обнаруженные сам процессор в процессе выполнения инструкции.Разделить на ноль или системный вызов — это примеры исключений.
Асинхронные прерывания, обычно называемые прерываниями, генерируются внешними событиями. устройствами ввода / вывода. Например, сетевая карта генерирует прерывания для сигнализации что пакет прибыл.
Большинство прерываний маскируются, что означает, что мы можем временно отложить запуск обработчика прерывания, когда мы отключаем прерывание, пока время повторного включения прерывания. Однако есть несколько критических прерывания, которые нельзя отключить / отложить.
Исключения
Есть два источника исключений:
- Обнаружен процессор
- запрограммировано
Исключения, обнаруженные процессором, возникают при возникновении аварийного состояния. обнаружен при выполнении инструкции.
Ошибка — это тип исключения, о котором сообщается перед выполнением инструкция и обычно может быть исправлена. Сохраненный EIP — это адрес инструкция, вызвавшая неисправность, поэтому после устранения неисправности программа может повторно выполнить ошибочную инструкцию.(например, ошибка страницы).
Ловушка — это тип исключения, о котором сообщается после выполнения инструкция, в которой было обнаружено исключение. Сохраненный EIP — это адрес инструкции после инструкции, вызвавшей ловушку. (например, ловушка отладки).
Тест: терминология прерывания
Для каждого из следующих терминов слева выберите все термины справа, что лучше всего их описывает.
|
|
Концепции аппаратного обеспечения
Программируемый контроллер прерываний
Устройство, поддерживающее прерывания, имеет выходной контакт, используемый для сигнализации запроса прерывания.IRQ контакты подключены к устройству под названием Programmable Interrupt Controller (PIC), которое подключено к контакту INTR процессора.
PIC обычно имеет набор портов, используемых для обмена информацией с ЦП. Когда устройство подключенный к одной из линий IRQ PIC требует внимания ЦП, происходит следующий поток:
- устройство вызывает прерывание на соответствующем выводе IRQn
- PIC преобразует IRQ в векторное число и записывает его в порт для чтения ЦП
- PIC вызывает прерывание на выводе INTR процессора
- PIC ожидает, пока ЦП подтвердит прерывание, прежде чем инициировать другое прерывание
- CPU подтверждает прерывание, затем начинает обрабатывать прерывание
Позже увидим, как ЦП обрабатывает прерывание. Обратите внимание, что дизайн PIC не вызовет другого прерывания, пока ЦП не подтвердит текущее прерывание.
Примечание
Как только прерывание подтверждено ЦП, прерывание контроллер может запросить другое прерывание, независимо от того, Готово обработал предыдущее прерывание или нет. Таким образом, в зависимости от как ОС управляет процессором, можно вложить прерывания.
Контроллер прерываний позволяет каждой линии IRQ быть индивидуально отключен. Это позволяет упростить дизайн, убедившись, что прерывание обработчики всегда выполняются последовательно.
Контроллеры прерываний в системах SMP
В системах SMP у нас может быть несколько контроллеров прерываний в системы.
Например, в архитектуре x86 для каждого ядра используется локальный APIC. для обработки прерываний от локально подключенных устройств, таких как таймеры или тепловые датчики. Затем есть I / O APIC, который используется для распределения IRQ. от внешних устройств к ядрам процессора.
Управление прерываниями
Для синхронизации доступа к общим данным между обработчиком прерывания и другие потенциальные параллельные действия, такие как инициализация драйвера или обработки данных драйвера, часто требуется включать и отключать прерывания в управляемая мода.
Это может быть выполнено на нескольких уровнях:
- на уровне устройства
- путем программирования регистров управления устройством
- на уровне PIC
- PIC может быть запрограммирован на отключение данной линии IRQ
- на уровне ЦП; например, на x86 можно использовать следующие инструкция:
- cli (флаг прерывания CLear)
- sti (флаг прерывания SeT)
Приоритеты прерывания
Большинство архитектур также поддерживают приоритеты прерываний.Когда это включен, он разрешает вложение прерываний только для тех прерываний, которые имеют более высокий приоритет, чем текущий уровень приоритета.
Примечание
Не все архитектуры поддерживают приоритеты прерываний. Это также трудно поддерживать определение общей схемы прерывания приоритеты для операционных систем общего назначения и некоторых ядер (включая Linux) не используйте приоритеты прерываний. С другой стороны, большинство RTOS используют приоритеты прерываний, поскольку они обычно используются в большем количестве ограничения использования, когда легче определить прерывание приоритеты.
Тест: концепции оборудования
Какие из следующих утверждений верны?
- ЦП может начать обработку нового прерывания до текущего один закончен
- Прерывания можно отключить на уровне устройства
- Прерывания с более низким приоритетом не могут вытеснить обработчики для более высокого приоритета. приоритетные прерывания
- Прерывания можно отключить на уровне контроллера прерываний
- В системах SMP одно и то же прерывание может быть перенаправлено на разные ЦП
- Прерывания можно отключить на уровне ЦП
Обработка прерываний на архитектуре x86
В этом разделе будет рассмотрено, как прерывания обрабатываются ЦП на Архитектура x86.
Таблица дескрипторов прерываний
Таблица дескрипторов прерываний (IDT) связывает каждое прерывание или исключение идентификатор с дескриптором для инструкций, которые обслуживают связанный мероприятие. Мы назовем идентификатор как номер вектора и связанный с ним инструкции как обработчик прерывания / исключения.
IDT имеет следующие характеристики:
- он используется ЦП как таблица переходов при запуске заданного вектора
- это массив записей 256 x 8 байтов
- может находиться где угодно в физической памяти Процессор
- определяет местонахождение IDT с помощью IDTR
Ниже представлена векторная схема IRQ для Linux.Первые 32 записи зарезервированы для исключений вектор 128 используется для интерфейса sycall, а остальные используется в основном для обработчиков аппаратных прерываний.
На x86 запись IDT имеет 8 байтов и называется воротами. Может быть 3 типа ворот:
- шлюз прерывания, содержит адрес обработчика прерывания или исключения. Переход к обработчику отключает маскируемые прерывания (флаг IF снят).
- ворот ловушки, аналогично воротам прерывания, но не отключает маскируемые прерывания при переходе к обработчику прерывания / исключения.
- шлюзы задач (не используются в Linux)
Давайте посмотрим на несколько полей записи IDT:
- Селектор сегмента, индексируйте в GDT / LDT, чтобы найти начало сегмента кода, где обработчики прерываний находятся в
- смещение, смещение внутри сегмента кода
- Т, представляет собой тип ворот
- DPL, минимальные привилегии, необходимые для использования содержимого сегментов.
Адрес обработчика прерывания
Чтобы найти адрес обработчика прерывания, нам сначала нужно найти начало адрес сегмента кода, в котором находится обработчик прерывания.Для этого мы используйте селектор сегментов для индексации в GDT / LDT, где мы можем найти соответствующие дескриптор сегмента. Это обеспечит начальный адрес, хранящийся в поле «base». Теперь, используя базовый адрес и смещение, мы можем перейти к началу обработчика прерывания.
Стек обработчика прерываний
Аналогично передаче управления к нормальной функции, передаче управления обработчик прерывания или исключения использует стек для хранения информация, необходимая для возврата к прерванному коду.
Как видно на рисунке ниже, прерывание подталкивает регистр EFLAGS перед сохранением адреса прерванной инструкции. Определенные типы исключений также приводят к тому, что код ошибки помещается в стек, чтобы помочь отладить исключение.
Обработка запроса на прерывание
После того, как был сгенерирован запрос на прерывание, процессор выполняет последовательность: события, которые в конечном итоге заканчиваются запуском обработчика прерывания ядра:
CPU проверяет текущий уровень привилегий
при необходимости изменить уровень привилегий
- изменить стек со стеком, связанным с новой привилегией
- сохранить старую информацию о стеке в новом стеке
сохранить EFLAGS, CS, EIP в стеке
сохранить код ошибки в стеке в случае прерывания
выполнить обработчик прерывания ядра
Возврат от обработчика прерывания
Большинство архитектур предлагает специальные инструкции для очистки стека и возобновления выполнение после того, как обработчик прерывания был выполнен. На x86 используется IRET для возврата из обработчика прерывания. IRET похож на RET, за исключением того, что IRET увеличивает ESP на четыре дополнительных байта (из-за флагов в стеке) и перемещает сохраненные флаги в регистре EFLAGS.
Для возобновления выполнения после прерывания используется следующая последовательность (x86):
- вывести код ошибки (в случае прерывания)
- вызывает IRET
- извлекает значения из стека и восстанавливает следующий регистр: CS, EIP, EFLAGS
- при изменении уровня привилегий возвращается к старому стеку и старому уровню привилегий
Проверка обработки прерываний x86
Тест: обработка прерываний x86
Следующие команды gdb используются для определения обработчика для исключение системного вызова на основе int80.Выберите и расставьте команды или вывод команд в правильном порядке.
(void *) 0xc15de780установить $ idtr_addr = ($ idtr_entry >> 48 << 16) | ($ idtr_entry & 0xffff) print (void *) $ idtr_addr установить $ idtr = 0xff800000 (пусто *) 0xc15de874 установить $ idtr = 0xff801000 установить $ idtr_entry = * (uint64_t *) ($ idtr + 8 * 128) регистры информации монитора
Обработка прерываний в Linux
В Linux обработка прерываний выполняется в три этапа: критический, немедленный и отложено.
На первом этапе ядро запускает общий обработчик прерывания, который определяет номер прерывания, обработчик прерывания для этого конкретного прерывание и контроллер прерываний. На данный момент критично любое время действия также будут выполнены (например, квитировать прерывание в прерывании уровень контроллера). Прерывания локального процессора отключены на время этот этап и продолжать отключаться на следующем этапе.
На втором этапе все обработчики драйверов устройств, связанные с этим прерывание будет выполнено.В конце этой фазы контроллер прерываний вызывается метод «конца прерывания», позволяющий контроллеру прерывания подтвердите это прерывание. При этом разрешены прерывания локального процессора. точка.
Примечание
Возможно, что одно прерывание связано с несколькими устройств, и в этом случае говорят, что прерывание общий. Обычно при использовании общих прерываний это ответственность драйвера устройства, чтобы определить, если прерывание нацелен на это устройство или нет.
Наконец, в последней фазе обработки прерывания контекст прерывания откладывается. действия будут запущены. Их также иногда называют «нижней половиной» прерывание (верхняя половина является частью обработки прерывания, которая выполняется с отключенными прерываниями). На этом этапе прерывания разрешены на локальном процессор.
Вложенные прерывания и исключения
Linux раньше поддерживал вложенные прерывания, но через некоторое время это было удалено назад, чтобы избежать сложения сложных решений проблемы с переполнением — разрешить только один уровень вложенности, разрешить несколько уровни вложенности до определенной глубины стека ядра и т. д.
Однако по-прежнему возможно вложение между исключениями и прерывания, но правила довольно строгие:
- исключение (например, ошибка страницы, системный вызов) не может вытеснить прерывание; если это происходит, это считается ошибкой
- прерывание может вытеснить исключение
- прерывание не может вытеснить другое прерывание (раньше это было возможно)
На схеме ниже показаны возможные сценарии вложения:
Контекст прерывания
Пока обрабатывается прерывание (с момента перехода ЦП к прерыванию обработчик, пока обработчик прерывания не вернется — e.грамм. IRET выдается) сказано этот код работает в «контексте прерывания».
Код, который выполняется в контексте прерывания, имеет следующие свойства:
- запускается в результате IRQ (не исключение)
- нет четко определенного контекста процесса, связанного
- не разрешено запускать переключение контекста (без спящего режима, расписания или доступа к пользовательской памяти)
Отсрочка исков
Отложенные действия используются для запуска функций обратного вызова в более позднее время. Если отложенные действия, запланированные обработчиком прерывания, связанный обратный вызов функция будет запущена после завершения обработчика прерывания.
Есть две большие категории отложенных действий: те, которые выполняются в контекст прерывания и те, которые выполняются в контексте процесса.
Назначение откладываемых по контексту действий прерывания — избежать слишком многого. работать в функции обработчика прерываний. Слишком долгая работа с прерываниями отключение может иметь нежелательные эффекты, такие как увеличенная задержка или плохая система производительность из-за отсутствия других прерываний (например,грамм. отбрасывание сетевых пакетов потому что ЦП вовремя не отреагировал на удаление пакетов из сети интерфейс и буфер сетевой карты заполнен).
Отложенные действия имеют API для: инициализации экземпляра, активации или расписание действие и маскировать / отключать и демаскировать / разрешить выполнение функции обратного вызова. Последний используется для синхронизации между функция обратного вызова и другие контексты.
Обычно драйвер устройства инициализирует отложенное действие структура во время инициализации экземпляра устройства и активирует / запланировать отложенное действие обработчика прерывания.
Мягкие IRQ
Soft IRQ — это термин, используемый для механизма низкого уровня, который реализует отсрочку работают из обработчиков прерываний, но по-прежнему работают в контексте прерывания.
Программные API IRQ:
- инициализировать:
open_softirq ()
- активация:
raise_softirq ()
- маскирование:
local_bh_disable ()
,local_bh_enable ()
После активации функция обратного вызова
do_softirq ()
запускается либо:
- после обработчика прерывания или
- из потока ядра ksoftirqd
Так как softirq может перепланировать себя или могут возникать другие прерывания,
переносит их, они потенциально могут привести к (временному) остановке процесса, если
чеки не ставятся. В настоящее время ядро Linux не позволяет
запуск программных IRQ более MAX_SOFTIRQ_TIME
или изменение расписания для
более MAX_SOFTIRQ_RESTART
раз подряд.
Как только эти ограничения достигнуты, специальный поток ядра, ksoftirqd пробуждается и все остальные ожидающие soft irqs будут запускаться из контекста этого поток ядра.
Использование программных irqs ограничено, они используются несколькими подсистемами, имеющими требования к низкой задержке и высокой частоте:
/ * ПОЖАЛУЙСТА, не выделяйте новые softtirq, если вам не нужно _ действительно_ высоко частотное планирование заданий.Практически для всех целей тасклетов более чем достаточно. F.e. все серийные устройства BHs et al. следует преобразовывать в тасклеты, а не в софтирки. * / перечислить { HI_SOFTIRQ = 0, TIMER_SOFTIRQ, NET_TX_SOFTIRQ, NET_RX_SOFTIRQ, BLOCK_SOFTIRQ, IRQ_POLL_SOFTIRQ, TASKLET_SOFTIRQ, SCHED_SOFTIRQ, HRTIMER_SOFTIRQ, RCU_SOFTIRQ, / * Предпочтительный RCU всегда должен быть последним softirq * / NR_SOFTIRQS };
Пример пакетного флуда
В следующем скринкасте будет показано, что происходит, когда мы заливаем система с большим количеством пакетов.Поскольку по крайней мере часть обработка пакетов происходит в softirq, мы должны ожидать, что процессор тратить большую часть времени на софтирки, но большую часть этого должен быть в контексте потока ksoftirqd .
Тасклеты
Тасклеты — это динамический тип (не ограниченный фиксированным числом) отложенная работа, выполняемая в контексте прерывания.
API тасклетов:
- инициализация:
tasklet_init ()
- активация:
tasklet_schedule ()
- маскировка:
tasklet_disable ()
,tasklet_enable ()
Тасклеты реализованы поверх двух выделенных программ: TASKLET_SOFITIRQ
и HI_SOFTIRQ
Тасклеты также сериализуются, т. е.е. один и тот же тасклет может выполняться только на одном процессоре.
Очереди работ
Очереди работ — это тип отложенной работы, которая выполняется в контексте процесса.
Они реализуются поверх потоков ядра.
API очередей работ:
- инициализации:
INIT_WORK
- активация:
schedule_work ()
Таймеры
Таймеры реализованы поверх
TIMER_SOFTIRQ
API таймера:
- инициализация:
setup_timer ()
- активация:
mod_timer ()
Обзор отложенных действий
Вот шпаргалка, в которой кратко описаны отложенные действия Linux:
- softIRQ
- работает в контексте прерывания
- статически выделено
- Один и тот же обработчик может работать параллельно на нескольких ядрах
- тасклет
- запускается в контексте прерывания
- может быть размещен динамически
- сериализованы одинаковые прогоны обработчика
- очередей
Тест: обработка прерываний в Linux
Какая из следующих фаз обработки прерывания выполняется с прерывания отключены на уровне процессора?
- Критическое
- Немедленно
- Отложено
Прерывания в микропроцессоре 8085 — GeeksforGeeks
Прерывания в микропроцессоре 8085
Когда микропроцессор получает любой сигнал прерывания от периферийных устройств, которые запрашивают его услуги, он останавливает свое текущее выполнение, и управление программой передается подпрограмме, генерируя CALL и после повторного выполнения подпрограммы путем генерации сигнала RET управление программой передается основной программе с того места, где оно было остановлено.
Когда микропроцессор получает сигналы прерывания, он отправляет подтверждение (INTA) периферийному устройству, которое запрашивает его обслуживание.
Прерывания можно классифицировать по различным категориям на основе различных параметров:
- Аппаратные и программные прерывания —
Когда микропроцессоры получают сигналы прерывания через контакты (аппаратные средства) микропроцессора, они известны как Аппаратные прерывания . В микропроцессоре 8085 имеется 5 аппаратных прерываний.Это — INTR, RST 7.5, RST 6.5, RST 5.5, TRAPПрограммные прерывания — это те, которые вставляются между программой, что означает, что это мнемоника микропроцессора. В микропроцессоре 8085 имеется 8 программных прерываний. Это — RST 0, RST 1, RST 2, RST 3, RST 4, RST 5, RST 6, RST 7 .
- Векторные и не векторные прерывания —
Векторные прерывания — это прерывания с фиксированным векторным адресом (начальный адрес подпрограммы), и после их выполнения управление программой передается на этот адрес.
адреса векторов вычисляются по формуле 8 * ТИППРЕРЫВАНИЕ АДРЕС ВЕКТОРА TRAP (RST 4.5) 24 H RST 5.52 RST 5.52 9017 6.534 H RST 7.5 3C H Для программных прерываний адреса векторов задаются следующим образом:
29INTERRUPT VECTOR ADDRESS H RST 1 08 H RST 2 10 H RST 3 18 H RST 4 20 H H RST 6 30 H RST 7 38 H Non-Vectored Int ошибки — это ошибки, в которых адрес вектора не определен заранее. Устройство прерывания выдает адрес подпрограммы для этих прерываний. INTR — единственное прерывание без вектора в микропроцессоре 8085.
- Маскируемые и немаскируемые прерывания —
Маскируемые прерывания — это прерывания, которые могут быть отключены или проигнорированы микропроцессором. Эти прерывания запускаются по фронту или по уровню, поэтому их можно отключить. INTR, RST 7.5, RST 6.5, RST 5.5 — маскируемые прерывания в микропроцессоре 8085.Немаскируемые прерывания — это прерывания, которые не могут быть отключены или проигнорированы микропроцессором. TRAP — немаскируемое прерывание. Он состоит из срабатывания как по уровню, так и по фронту и используется в критических условиях сбоя питания.
Приоритет прерываний —
Когда микропроцессор получает несколько запросов на прерывание одновременно, он выполняет запрос обслуживания прерывания (ISR) в соответствии с приоритетом прерываний.
Инструкция для прерываний —
- Разрешить прерывание (EI) — Триггер разрешения прерывания установлен, и все прерывания разрешаются после выполнения следующей инструкции, за которой следует EI.Никакие флаги не затронуты. После сброса системы триггер разрешения прерывания сбрасывается, тем самым блокируя прерывания. Эта инструкция необходима для повторного разрешения прерываний (кроме TRAP).
- Отключить прерывание (DI) — Эта инструкция используется для сброса значения триггера включения, следовательно, отключения всех прерываний. Эта инструкция не влияет на флаги.
- Установить маску прерывания (SIM) — Он используется для реализации аппаратных прерываний (RST 7.5, RST 6.5, RST 5.5) путем установки различных битов для формирования масок или генерации выходных данных через линию последовательных выходных данных (SOD). Сначала в аккумулятор загружается требуемое значение, затем SIM-карта берет из него битовую комбинацию.
- Чтение маски прерывания (RIM) — Эта инструкция используется для чтения состояния аппаратных прерываний (RST 7.5, RST 6.5, RST 5.5) путем загрузки в регистр A байта, который определяет состояние маски биты для прерываний. Он также считывает состояние бита SID (последовательные входные данные) микропроцессора.
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью курса DSA Self Paced Course по доступной для студентов цене и будьте готовы к работе в отрасли.
прерываний
прерываний- Обработка прерываний — альтернатива опросу.
- Микропроцессоры Intel поддерживают аппаратные прерывания через:
- Два контакта, которые разрешают запросы прерывания, INTR и NMI type = disk>
- Один вывод, который подтверждает, INTA, прерывание, запрошенное на INTR. тип = диск>
- И программные прерывания по инструкции:
- INT, INTO, INT 3, BOUND type = disk>
- Управление осуществляется через
- Биты флагов IF и TF type = disk>
- Тип IRET и IRETD = диск>
- INT и INT3 ведут себя аналогичным образом.
- ИНТ n:
- Вызывает ISR, расположенный в векторе n (n * 4).
- Для инструкции INT требуется два байта памяти, код операции плюс n.
- BOUND и INTO условны.
- AX сравнивается с DATA и DATA + 1, если происходит меньше прерывания.
- AX сравнивается с DATA + 2 и DATA + 3, если больше, чем происходит прерывание.
- В:
- Проверяет флаг переполнения (OF).Если OF = 1, вызывается ISR.
- IRET удаляет 6 байтов из стека, 2 для IP, 2 для CS и 2 для FLAGS.
- После выполнения каждой инструкции микропроцессор определяет, активно ли прерывание, проверяя в следующем порядке:
- Выполнение других инструкций type = disk>
- Одношаговый тип = диск>
- Тип NMI = диск>
- Переполнение сегмента сопроцессора type = disk>
- Тип INTR = диск>
- Тип INT = диск>
- Если присутствует одно или несколько из этих условий, то:
- FLAGS помещается в стек type = disk>
- Флаги прерывания (IF) и прерывания (TF) сбрасываются, что отключает вывод INTR и функцию прерывания или пошагового режима. тип = диск>
- CS и IP помещаются в стек. тип = диск>
- Содержимое вектора прерывания выбирается и загружается в CS и IP, и выполнение возобновляется в ISR. тип = диск>
- На IRET всплывают CS, IP и ФЛАГИ. тип = диск>
- IF и TF устанавливаются в состояние до прерывания.
- Адрес возврата (CS / IP) помещается в стек во время прерывания.
- Обратный адрес может указывать на:
- Следующая инструкция. тип = диск>
- Оскорбительная (текущая) инструкция. тип = диск>
- Последний случай имеет место для прерываний 0, 5, 6, 7, 8, 10, 11, 12 и 13.
- Это дает возможность попробовать инструкцию еще раз.
Защищенный режим:
- В защищенном режиме выполняются одинаковые назначения прерываний, и такая же последовательность операций выполняется, но таблица прерываний отличается.
- Вместо этого в таблице дескрипторов прерываний (IDT) используются 256 дескрипторов прерываний.
- Вывод INTR должен быть декодирован извне, чтобы выбрать вектор.
- Возможен любой вектор, но обычно используются векторы прерывания между 20H и FFH (Intel резервирует векторы между 00H и 1FH).
- INTA — это выход микропроцессора, который сигнализирует внешнему декодеру о необходимости размещения номера прерывания на соединениях шины данных D7-D0.
- Вывод INTR устанавливается внешним устройством (8259A) и очищается в ISR.
- Вход автоматически отключается микропроцессором после того, как он распознается и повторно активируется инструкциями IRET или IRETD.
- Временная диаграмма рукопожатия.
- Самый простой способ создания вектора прерывания:
- Если какое-либо из IRQx становится низким, NAND переходит на низкий уровень, запрашивая прерывание.
- Обратите внимание, что если более чем одно прерывание становится низким, генерируется уникальный вектор прерывания, и необходимо определить приоритет прерывания.
- Чтобы учесть это, необходимо расширить таблицу векторов прерываний.
- 8259A добавляет к микропроцессору 8 кодированных прерываний с векторным приоритетом.
- Его можно расширить до 64 запросов на прерывание, используя одно ведущее устройство 8259A и 8 ведомых устройств.
- CS и WR должны быть декодированы. Остальные соединения прямые к микро.
- Значение остальных подключений:
- Тип WR = диск>
- Подключается к сигналу строба записи (один из 8 для Pentium).
- Тип RD = диск>
- Подключается к сигналу IORC.
- Тип INT = диск>
- Подключается к контакту INTR микропроцессора.
- Тип INTA = диск>
- Подключается к контакту INTA микропроцессора.
- Тип A0 = диск>
- Выбирает разные командные слова в 8259A.
- CS тип = диск>
- Выбор микросхемы — позволяет 8259A программировать и управлять.
- SP / EN тип = диск>
- Подчиненная программа (1 для ведущего, 0 для ведомого) / Enable Buffer (управляет передачей данных шины в режиме буферизации).
- Тип CAS2-CAS0 = диск>
- Используется как выходы от ведущего к ведомым в каскадных системах.
- Один 8259A, подключенный к 8086.
- Программируется с помощью командных слов инициализации (ICW) и операции (OCW).
- Всего 4 ICW.
- При включении должны быть отправлены ICW1, ICW2 и ICW4.
- Если ICW1 указывает на каскадный режим, то необходимо также отправить ICW3.
- LTIM указывает, являются ли линии IRQ срабатыванием по положительному фронту или срабатыванию уровня.
- Эти биты определяют номера векторов, используемых с входами IRQ.
- Например, если запрограммировано генерирование векторов 08H-0FH, 08H помещается в эти битовые позиции.
- ICW3: тип = диск>
- Полностью вложенный режим позволяет ведущему устройству распознавать запрос прерывания с наивысшим приоритетом от ведомого, пока он обрабатывает другое прерывание от ведомого.
- AEOI, если 1, указывает, что прерывание автоматически сбрасывает бит запроса прерывания, в противном случае OCW2 запрашивается для обработки EOI.
- Командные слова управления (OCW) используются для управления работой 8259A.
- OCW1: тип = диск>
- OCW1 используется для чтения или установки регистра маски прерывания.
- Если бит установлен, он отключит (замаскирует) соответствующий вход прерывания.
- OCW2: тип = диск>
- Программируется, только когда режим AEOI в ICW4 равен 0.
- Позволяет контролировать приоритеты после обработки каждого прерывания.
- Неспецифический EOI: здесь ISR устанавливает этот бит для указания EOI.8259A автоматически определяет, какое прерывание было активным, и повторно включает его, а также прерывания с более низким приоритетом.
- Конкретный EOI: ISR сбрасывает конкретный запрос прерывания, заданный L2-L0.
- Команды поворота вызывают изменение приоритета относительно текущий обрабатывается.
- Установить приоритет: позволяет установить прерывание с самым низким приоритетом (L2-L0).
- Если установлен опрос, следующая операция чтения прочитает слово опроса.
- Если в слове опроса установлен крайний левый бит, крайние правые 3 бита указывают активный запрос прерывания с наивысшим приоритетом.
- Позволяет ISR обслуживать прерывания с наивысшим приоритетом.
- Имеется три регистра состояния: регистр запроса прерывания (IRR), регистр работы (ISR) и регистр маски прерывания (IMR).
- IRR: указывает, какие строки запроса прерывания активны. тип = диск>
- ISR: уровень обслуживаемого прерывания. тип = диск>
- IMR: маска, указывающая, какие прерывания включены / выключены. тип = диск>
- Настроена процедура обновления ISR с чередующимся приоритетом.
- В следующей конфигурации 16550 подключен к 8259A через IR0.
- Прерывание генерируется, если оно разрешено через регистр управления прерываниями, когда:
- Передатчик готов отправить еще один символ. тип = диск>
- Получатель получил символ. тип = диск>
- При получении данных обнаружена ошибка. тип = диск>
- Возникает модемное прерывание. тип = диск>
- 16550 декодируется на 40H и 47H.
- 8259A декодируется на 48H и 49H.
- Программа в тексте показывает этапы программирования обоих устройств.
- Поскольку 16550 генерирует только один запрос прерывания для каждого из вышеуказанных прерываний, 16550 должен быть опрошен.
- Помните регистр идентификации прерывания 16550?
- В тексте приведены примеры программирования ISR, показывающие инициализацию и работу.
attachInterrupt () — Ссылка на Arduino
Описание
Цифровые выводы с прерываниями
Первый параметр в attachInterrupt ()
— это номер прерывания. Обычно вы должны использовать digitalPinToInterrupt (pin)
для преобразования фактического цифрового вывода в конкретный номер прерывания.Например, если вы подключаетесь к контакту 3, используйте digitalPinToInterrupt (3)
в качестве первого параметра для attachInterrupt ()
.
Доска | Цифровые выводы, используемые для прерываний |
---|---|
Uno, Nano, Mini, прочие 328 на основе | 2, 3 |
Uno WiFi Rev.2, Nano Каждые | все цифровые контакты |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, другие на базе 32u4 | 0, 1, 2, 3, 7 |
Ноль | все цифровые контакты, кроме 4 |
Платы семейства MKR | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Нано 33 IoT | 2, 3, 9, 10, 11, 13, A1, A5, A7 |
Nano 33 BLE, Nano 33 BLE Sense | все штифты |
Срок погашения | все цифровые контакты |
101 | все цифровые контакты (только контакты 2, 5, 7, 8, 10, 11, 12, 13 работают с ИЗМЕНИТЬ ) |
Примечания и предупреждения
Примечание
Внутри присоединенной функции delay ()
не будет работать, и значение, возвращаемое функцией millis ()
, не будет увеличиваться. Последовательные данные, полученные при использовании функции, могут быть потеряны. Вы должны объявить как volatile
любые переменные, которые вы изменяете в присоединенной функции. См. Раздел ISR ниже для получения дополнительной информации.
Использование прерываний
Прерыванияполезны для автоматического выполнения программ микроконтроллера и могут помочь решить проблемы синхронизации. Хорошие задачи для использования прерывания могут включать чтение поворотного энкодера или мониторинг пользовательского ввода.
Если вы хотите убедиться, что программа всегда улавливает импульсы от поворотного энкодера, чтобы она никогда не пропускала импульс, было бы очень сложно написать программу, которая бы делала что-то еще, потому что программе нужно было бы постоянно опрашивать сенсорные линии для энкодера, чтобы улавливать импульсы, когда они возникают.Другие датчики также имеют аналогичную динамику интерфейса, например, попытку прочитать звуковой датчик, который пытается поймать щелчок, или инфракрасный щелевой датчик (фотопрерыватель), пытающийся поймать каплю монеты. Во всех этих ситуациях использование прерывания может освободить микроконтроллер для выполнения другой работы, не пропуская при этом ввод.
О процедурах обслуживания прерывания
ISR— это особые виды функций, которые имеют некоторые уникальные ограничения, которых нет у большинства других функций. ISR не может иметь никаких параметров и не должен ничего возвращать.
Как правило, ISR должна быть как можно более короткой и быстрой. Если в вашем скетче используется несколько ISR, одновременно может выполняться только одна, остальные прерывания будут выполняться после завершения текущего в порядке, зависящем от их приоритета. millis ()
полагается на прерывания для подсчета, поэтому он никогда не будет увеличиваться внутри ISR. Поскольку delay ()
требует для работы прерываний, он не будет работать, если вызывается внутри ISR. micros ()
работает изначально, но начнет работать нестабильно через 1-2 мс. delayMicroseconds ()
не использует счетчик, поэтому будет работать как обычно.
Обычно глобальные переменные используются для передачи данных между ISR и основной программой. Чтобы убедиться, что переменные, совместно используемые ISR и основной программой, обновляются правильно, объявите их как volatile
.
Синтаксис
attachInterrupt (digitalPinToInterrupt (контакт), ISR, режим)
(рекомендуется)
attachInterrupt (прерывание, ISR, режим)
(не рекомендуется)
attachInterrupt (контакт, ISR, режим)
(не рекомендуется.Кроме того, этот синтаксис работает только на платах Arduino SAMD, Uno WiFi Rev2, Due и 101.)
Параметры
прерывание
: номер прерывания. Допустимые типы данных: int
.
pin
: номер контакта Arduino.
ISR
: ISR для вызова при возникновении прерывания; эта функция не должна принимать никаких параметров и ничего не возвращать. Эту функцию иногда называют процедурой обслуживания прерывания.
режим
: определяет, когда должно срабатывать прерывание.Четыре константы предопределены как допустимые значения:
LOW для запуска прерывания всякий раз, когда на выводе низкий уровень,
CHANGE для запуска прерывания всякий раз, когда вывод изменяет значение
RISING для срабатывания при переходе пина от низкого к высокому,
ПАДЕНИЕ , когда штифт переходит от высокого к низкому.
Платы Due, Zero и MKR1000 также позволяют:
Возвращает
Пример — 10swint.asm — Программные прерывания
Пример — 10swint.asm — Программные прерыванияДомой | Предыдущая | След.
Пример — 10swint.asm
; -------------------------------------------------- ------------ ; Пример программных прерываний. ; -------------------------------------------------- ------------ JMP Start; Перейти мимо таблицы векторов прерываний DB 51; Вектор в 02, указывающий на адрес 51 DB 71; Вектор в 03, указывающий на адрес 71 Начинать: INT 02; Прервать 02 INT 03; Прервать 03 JMP Start ; -------------------------------------------------- ------------ ORG 50 DB E0; Байт данных - здесь может быть целая таблица ; Код прерывания начинается здесь MOV AL, [50]; Копировать биты из ОЗУ в AL НЕ AL; Инвертировать биты в AL MOV [50], AL; Скопируйте инвертированные биты обратно в ОЗУ ВЫХ 01; Отправлять данные на светофор IRET ; -------------------------------------------------- ------------ ORG 70 DB 0; Байт данных - здесь может быть таблица ; Код прерывания начинается здесь MOV AL, [70]; Копировать биты из ОЗУ в AL НЕ AL; Инвертировать биты в AL И AL, FE; Установить самый правый бит в ноль MOV [70], AL; Скопируйте инвертированные биты обратно в ОЗУ OUT 02; Отправка данных на семисегментный дисплей IRET ; -------------------------------------------------- ------------ КОНЕЦ ; -------------------------------------------------- ------------ ЗАДАЧА 26) Напишите новое прерывание 02, которое извлекает нажатие клавиши из клавиатура и сохраняет его в ОЗУ.IBM PC выделяет 16 байтов для хранения нажатия клавиш. 16 локаций используются в круговая мода. 27) Создайте новое прерывание, которое помещает персонажей в следующий свободное расположение экрана. Посмотрите, сможете ли вы добиться правильного поведения в ответ на нажатие клавиши Enter (довольно просто) и если нажата клавиша Back Space (сильнее). |
Этот пример программы можно скопировать со страницы справки и вставить в редактор исходного кода.
Прерывания и процедуры
Прерывания — это фрагменты короткого кода, которые предоставляют полезные услуги, которые могут быть используется другими программами. Типичные подпрограммы обрабатывают нажатия клавиш, движения мыши нажатие кнопок, запись с экрана, чтение и запись на диск и так далее.
Прерывание похоже на процедуру, но вызывается по-другому. Процедуры вызываются переходом к начальному адресу процедуры. Этот адрес известно только программе, владеющей процедурой. Прерывания вызываются поиск адреса кода прерывания в таблице векторов прерывания. Содержание этой таблицы опубликовано и широко известно.MS DOS усложняет использование прерываний для всего своего диска, экрана, мыши, сети, клавиатуры и прочего Сервисы.
Написав свой собственный код и заставив вектор прерывания указывать на код Вы писали, поведение прерываний можно полностью изменить. Ваше прерывание код может добавить какое-то полезное поведение, а затем вернуться к исходному коду для завершения работы. Это называется ЗАХВАТОМ прерывания.
Программные прерывания запускаются по запросу программами.
Аппаратные прерывания запускаются электронными сигналами на CPU от аппаратных устройств.
Таблица векторов прерываний
В IBM-совместимом компьютере для хранения используются десятичные адреса от 0 до 1024. векторы прерывания. Записи в этой таблице векторов указывают на весь код фрагменты, управляющие экраном MS DOS, диском, мышью, клавиатурой и другими службами. Векторы симулятора находятся между адресами от 0 до 15 в десятичной системе счисления. Это удобно для запуска программы симулятора с командой перехода, занимающей два байта.Этот означает, что первым свободным адресом вектора прерывания является [02]. Это используется аппаратным таймером, если установлен флаг прерывания.
Взгляните еще раз на пример программы. 10swint.asm
Вызов прерывания
Это довольно сложно. Команда INT 02 заставляет ЦП извлекать содержимое ячейки ОЗУ 02. После сохранения адреса возврата в стек инструкция Указатель IP установлен на этот адрес.
Затем выполняется код прерывания.По завершении команда IRET вызывает возврат из прерывания. IP-адрес указателя инструкции ЦП установлен на адрес, который ранее был сохранен в стеке.
Перехват прерывания
Если вы хотите перехватить прерывание 02, измените адрес, хранящийся по адресу 02, на укажите на код, который вы написали. Затем ваш код обработает прерывание. По завершении ваш код может использовать IRET для возврата из прерывания или может перейти к адресу, который изначально находился в адресе 02.Это приводит к тому, что исходный код прерывания также должен быть выполнен. Таким образом вы можете заменить или изменить поведение прерывания.
Домой | Предыдущая | След.
© Нил Бауэрс, 2003
Программное прерывание — zxc.wiki
Эта статья или следующий раздел не обеспечены должным образом подтверждающими документами (например, индивидуальными доказательствами). Информация без достаточных доказательств может быть вскоре удалена. Пожалуйста, помогите Википедии, исследуя информацию и добавляя убедительные доказательства.Программное прерывание — это явный вызов подфункции (обычно функции операционной системы). Это не имеет ничего общего с прерыванием (асинхронным прерыванием), хотя часто используется тот же распределитель переходов (таблица прерываний). Распространенные мнемоники:
Такие вызовы функций вызываются программами с помощью специальных архитектурно-зависимых команд. Для этого необходимо знать номер требуемой подфункции. Этот номер используется как индекс в таблице переходов (в основном, таблице векторов прерываний), которая содержит начальный адрес подпрограммы.
фоны
Первоначально использовался только в качестве удобного и переносного распределителя переходов (MS-DOS) — это позволяет избежать записи, зависящей от версии, непосредственно в коде операционной системы (например, JSR $ EDB9
) — этим вызовам функций в современных операционных системах были предоставлены дополнительные функции . С помощью этих команд возможны изменения контекста и задач, которые нельзя (намеренно) реализовать с помощью классических команд. Таким образом, можно смоделировать INT 21h
под MS-DOS с использованием классических команд (прибл.20), но уже не INT 80h
, который используется для вызова функций операционной системы в двоичных файлах Unix.
Эта технология позволяет использовать только защищенные операционные системы, поскольку изменение контекста операционной системы может происходить только в точно определенных точках.
Пример звонка (Unix, Intel i386)
Должна быть реализована функция чтения POSIX (чтение данных из дескриптора файла в память):
чтение (int FileHandle, void * Buffer, unsigned int BufferLength);
(минимальная) реализация (в libc) выглядит так:
прочитать протокол толкнуть ebx нажать ecx толкнуть edx mov ebx, [esp + 16]; FileHandle mov ecx, [esp + 20]; Буфер mov edx, [esp + 24]; BufferLength mov eax, 0003h; Funktionnummer für read int 80h поп edx поп-эккс поп-эбкс cmp eax, -124; Werte von 0...0FFFFFF84h sind Rückgabewerte, -123 ...- 1 sind (negierte) Fehlernummern jbe .noError neg eax; Aus Rückgabewerten -1 ...- 123 werden die Fehlernummern 1 ... 123 mov __errno, eax; Fehler in errno abspeichern mov eax, -1 .Нет ошибок: Ret конец процесса
Лечение процессора и операционной системы
Команда INT 80h
выполняет следующее:
- Поскольку переход проходит через шлюз вызова, уровень приоритета изменяется с 3 (пользователь) на 0 (ядро),
- , затем процессор переключается со стека пространства пользователя на стек пространства ядра,
- затем сохранил регистр флагов и
- Наконец, есть переход к адресу, хранящемуся в операционной системе.