При вводе обработчика inteerupt мы сначала «отключаем прерывания» в этом процессоре (используя что-то вроде инструкции cli на x86). Предположим, что во время отключения прерываний пользователь нажал на клавиатуре букву «а», что обычно вызывает прерывание. Но поскольку прерывания отключены, означает ли это, что:
Часто одно прерывание «ставится в очередь» оборудованием.
[Прерывание часто - это просто логический вентиль, который может остаться; когда он включен, он остается включенным некоторое время.]
Если пользователь нажимает «a» только один раз в течение интервала, когда прерывания были отключены, он регистрируется как прерывание, когда они снова включаются.
Если бы пользователю каким-то образом удавалось дважды нажать «а» в течение интервала, когда прерывания были отключены, то можно было бы зарегистрировать прерывание, когда они были включены. Было ли это первым или вторым, зависит от точной конфигурации логического элемента.
Для пользователя было бы физически невозможно дважды нажать "a" во время нормальной обработки прерывания. Это было бы очень маловероятно, даже если бы он нажал две клавиши за раз, но оборудование должно удерживать хотя бы одну клавишу, пока ЦП не будет готов ее получить.
На ПК - это возвращается к моим временам PCXT - подсистема клавиатуры может удерживать около 13 нажатий клавиш для ЦП.
Ответ в том, что это зависит от того, обрабатывали ли вы прерывание клавиатуры.
Большинство программ обслуживания прерываний (ISR) имеют на завершении код, который информирует оборудование о том, что оно «обслужено». В случае контроллера клавиатуры команды записываются в него, подтверждая получение байтов. Во время подтверждения аппаратное обеспечение контроллера клавиатуры перестает использовать электричество для подачи сигнала о прерывании.
Если вы обрабатываете прерывание, не связанное с клавиатурой, скажем, прерывание пожарной тревоги, то аппаратное обеспечение клавиатуры, которое электрически определяет прерывание, срабатывает при нажатии клавиши. Электрический сигнал игнорируется, пока ЦП снова не разрешит прерывания. В конце обслуживания прерывания пожарной тревоги ISR пожарной тревоги подтверждает все данные и повторно разрешает прерывания на ЦП. Сразу же ЦП переходит в прерывание, потому что контроллер клавиатуры все еще электрически сигнализирует о состоянии прерывания.
Если вы обрабатываете прерывание клавиатуры, и пользователь быстро набирает нажатие клавиши секунды во время выполнения ISR клавиатуры, то существует вероятность пропуска данных при втором нажатии клавиши или получения это позже, если вообще. В частности, если ISR сбрасывает контроллер клавиатуры посредством подтверждения, но ISR фактически не получила все доступные байты из контроллера клавиатуры, то это является проблемой.
Часто ISR сначала обрабатывает прерывание, вызвавшее его активацию, а затем после подтверждения прерывания опрашивает устройство, чтобы узнать, получило ли оно больше данных с момента первого прерывания. Если это так, сгенерируйте программное прерывание для повторного входа в ISR и обслуживания устройства.
Простой ответ заключается в том, что прерывание автоматически отключает дальнейшие прерывания. Прерывания должны и отключаются только на самое короткое время. Первой инструкцией в исходной ISR клавиатуры AT BIOS была STI
для включения прерываний.
Удачный ответ заключается в том, что PIC отдает приоритет аппаратным прерываниям, и даже при включенных прерываниях только прерывание таймера IRQ0 может прервать ISR клавиатуры. Конечно, NMI может произойти в любом случае, но, к счастью, это никогда не происходит на текущем ПК.