Что означает отключение прерываний?

При вводе обработчика inteerupt мы сначала «отключаем прерывания» в этом процессоре (используя что-то вроде инструкции cli на x86). Предположим, что во время отключения прерываний пользователь нажал на клавиатуре букву «а», что обычно вызывает прерывание. Но поскольку прерывания отключены, означает ли это, что:

  1. обработчик прерываний для 'a' никогда не будет вызываться, поскольку прерывания отключены в критической секции, или
  2. прерывание будет обрабатываться операционной системой, но будет задерживаться до прерывания снова включаются. В частности, нужно ли пользователю снова нажимать «а», если в первый раз он нажимал «а» в то время, когда прерывания были отключены?
10
задан Lalit Kumar B 27 February 2015 в 05:02
поделиться

4 ответа

Часто одно прерывание «ставится в очередь» оборудованием.

[Прерывание часто - это просто логический вентиль, который может остаться; когда он включен, он остается включенным некоторое время.]

Если пользователь нажимает «a» только один раз в течение интервала, когда прерывания были отключены, он регистрируется как прерывание, когда они снова включаются.

Если бы пользователю каким-то образом удавалось дважды нажать «а» в течение интервала, когда прерывания были отключены, то можно было бы зарегистрировать прерывание, когда они были включены. Было ли это первым или вторым, зависит от точной конфигурации логического элемента.

6
ответ дан 4 December 2019 в 01:29
поделиться

Для пользователя было бы физически невозможно дважды нажать "a" во время нормальной обработки прерывания. Это было бы очень маловероятно, даже если бы он нажал две клавиши за раз, но оборудование должно удерживать хотя бы одну клавишу, пока ЦП не будет готов ее получить.

На ПК - это возвращается к моим временам PCXT - подсистема клавиатуры может удерживать около 13 нажатий клавиш для ЦП.

0
ответ дан 4 December 2019 в 01:29
поделиться

Ответ в том, что это зависит от того, обрабатывали ли вы прерывание клавиатуры.

Большинство программ обслуживания прерываний (ISR) имеют на завершении код, который информирует оборудование о том, что оно «обслужено». В случае контроллера клавиатуры команды записываются в него, подтверждая получение байтов. Во время подтверждения аппаратное обеспечение контроллера клавиатуры перестает использовать электричество для подачи сигнала о прерывании.

Если вы обрабатываете прерывание, не связанное с клавиатурой, скажем, прерывание пожарной тревоги, то аппаратное обеспечение клавиатуры, которое электрически определяет прерывание, срабатывает при нажатии клавиши. Электрический сигнал игнорируется, пока ЦП снова не разрешит прерывания. В конце обслуживания прерывания пожарной тревоги ISR пожарной тревоги подтверждает все данные и повторно разрешает прерывания на ЦП. Сразу же ЦП переходит в прерывание, потому что контроллер клавиатуры все еще электрически сигнализирует о состоянии прерывания.

Если вы обрабатываете прерывание клавиатуры, и пользователь быстро набирает нажатие клавиши секунды во время выполнения ISR клавиатуры, то существует вероятность пропуска данных при втором нажатии клавиши или получения это позже, если вообще. В частности, если ISR сбрасывает контроллер клавиатуры посредством подтверждения, но ISR фактически не получила все доступные байты из контроллера клавиатуры, то это является проблемой.

Часто ISR сначала обрабатывает прерывание, вызвавшее его активацию, а затем после подтверждения прерывания опрашивает устройство, чтобы узнать, получило ли оно больше данных с момента первого прерывания. Если это так, сгенерируйте программное прерывание для повторного входа в ISR и обслуживания устройства.

6
ответ дан 4 December 2019 в 01:29
поделиться

Простой ответ заключается в том, что прерывание автоматически отключает дальнейшие прерывания. Прерывания должны и отключаются только на самое короткое время. Первой инструкцией в исходной ISR клавиатуры AT BIOS была STI для включения прерываний.

Удачный ответ заключается в том, что PIC отдает приоритет аппаратным прерываниям, и даже при включенных прерываниях только прерывание таймера IRQ0 может прервать ISR клавиатуры. Конечно, NMI может произойти в любом случае, но, к счастью, это никогда не происходит на текущем ПК.

1
ответ дан 4 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: