Откладывание прерывания IRQ

Тема в разделе "WASM.ASSEMBLER", создана пользователем Administrator, 30 дек 2017.

  1. Administrator

    Administrator New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2009
    Сообщения:
    23
    Что будет если где-то в программе оставить участок кода (реальный режим):
    cli
    xor cx, cx
    loop $
    sti
    mov ax, 1234h
    mov bx, 5678h​
    Здесь показан небольшой цикл внутри cli/sti, в реальности он выполняется большее количество интеракций, по времени около 55 мс. Т.е. за это время пришел запрос с IRQ таймера. Собственно хотелось бы чтобы сразу после sti он обработался прерыванием int 8. Так ли будет? или он будет просто проигнорирован?
     
  2. Administrator

    Administrator New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2009
    Сообщения:
    23
    Проверил экспериментально, вроде бы да. (Вероятно за снятие статуса запроса отвечает отправка сигнала в соответствующий порт в штатном обработчике int 8.)
     
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Administrator,

    IA vol 3A, 5.8.1:

    Это значит что прерывание ожидает обработки и будет доставлено как только выполниться sti.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Indy_,
    Вообще-то, это означает прямо противоположное. Если IF сброшен, все маскируемые прерывания игнорируются.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    rmn,

    Вы до конца то почитайте: когда инты размаскируются они доставляются в штатном режиме.
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Indy_,
    Нет, там написано, когда инты размаскированы, они доставляются.
    Если упростить проц, то там двухвходовый AND, на один вход которого подключена нога процессора, а на второй - значение IF.
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    rmn,

    Ну тогда идите учите всю матчасть подробно, раз вы не понимаете как это работает. Инт удерживается(pending interrupt").
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Indy_,
    Зачем мне ее учить? Я ее благополучно забыл, дергаю апишки из user32.dll и радуюсь :)
     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    rmn,

    А зачем тогда пишите в тех. темах, котрых не понимаете(не важно почему - забыл(что маловероятно)/незнаю).
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    inhibits - означает купирование, в соответствии оксфордским словарём - снижения скорости доставки.
    Следовательно после снятия маски доставка возобновится. Тут про игнор ничего не сказано.
    Так что Indy_ прав.
    Однако если вы промедлите скажем более 165 мс то к вам доставится только 1 прерывание, а не 3 прерывания от таймера.
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Pavia,
    Т.е., если я вызову cli, то прерывания будут где-то там накапливаться и потом придут мне всей пачкой?
     
  12. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Вы мыслите как программист, а надо мыслить как железячник. Они не приходят пачками.
    Прерывания накапливаются в регистре IRR контроллёра прерываний. А результат с этого регистра сливается в одну общую линии INTR которая подведена к ЦП. ЦП на каждой команде просто проверяет состояние линии INTR путём её опроса. Но проверку он делает через логический элемент and который маскирует реультат с этой линии либо нет.
    L_INTR := INTR and IF;
    Далее процессор либо видит 1 и прыгает на обработчик прерывания либо 0 тогда идёт на следующую команду. Пока вы не маскируете сигнал на линии при помощи логического элемента INTR and 1 вы будете попадать в прерывание. Когда процессор прыгает на прерывание он сам сбрасывает флаг IF. Тем самым заставляя INTR and IF выдавать 0. А по выходу из обработчика прерывания по команде ret восстанавливает значение флага.


    Так вот в компьютере несколько контролёров прерываний и у каждого свой IRR. Но там нет очереди только по 1 биту на каждый источник прерывания. У каждого источника свой приоритет. И пока вы вручную не очистите этот бит вы будете поступать на прерывание. У PIC очистка бита осуществляется путём посылки команды EOI. Обычно это делает обработчик прерывания.
    Если вы выкинете из обработчика посылку EOI то PIC будете всё время выдавать сигнал INTR, а процессор будет всё время обратно попадать в обработчик прерывания. Прим через одну команду, как при трассировки.

    Можно запрограммировать PIC на Auto EOI. Тогда накапливания не будет.

    Аналогичнм образом себя ведёт и Local APIC у него тоже есть регистр IRR.
     
    vx1d, Indy_ и Mikl___ нравится это.
  13. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Pavia,

    Это чётко описано, тс не считает нужным учить матчасть.

    IA vol 3A:

    Я уже это цитировал. В нт есть функция Kei386EoiHelper(), которая и завершает прерывания. Делая это естественно через iret: