синхронизация в обработчике прерывания

Тема в разделе "WASM.OS.DEVEL", создана пользователем katrus, 5 июл 2007.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Эта тема является продолжением http://www.wasm.ru/forum/viewtopic.php?id=21416. Решил создать новую тему, потому, что нельзя изменить название (которое стало нерелевантным) у старой.

    Положим есть мой обработчи прерывания клавиатуры который вызывается через IDT. Грубо говоря, код обработчика следующий:
    Код (Text):
    1.         cli
    2.         in     ah, 60h     ; прочитать сканкод клавишы
    3.         . . . . . . . . .    
    4.         out   64h, 0D2h ; вернуть код обратно в буфер
    5.         out   60h, ah
    6.         sti
    7.         jmp   real_driver
    У такого обработчика есть занятная проблема - он получает синтезированный скан код который он же сам и запихивает обратно в порт 60h и никак не получется отфильтровать его. Единственная рабочая идея была сделать массив всех сканкодов который содержит информацию о том какой сканкод был получен последним. Если последний код был "key down" то игнорируем "key down" код для этой клавиши, иначе, если последний код был "key up" то игнорируем "key up". К сожалению этот код не подходит когда удерживаемая клавиша непрерывна шлет "key down". Может есть какой-то более мене удобный способ справится с такой проблемой?

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