HardWareMan wrote:Mixa64 wrote:Сам это дело не паял, но сейчас, паяя прерывания на базе 1818ВН19, параллельно разбирался с прерываниями вообще. Есть команда RETI, которую слушает вся периферия и в ответ старшая из обслуженных сбрасывает свой запрос. Ближняя это младшая. Ничего не теряется. Прерывания уровнями идут, не фронтами.
Наверное речь идет об К(Р)580ВН59/К(Р)1816ВН59? Прерывание может быть как по фронту (защелкивается в контроллере), так и по уровню. Прерывание по фронту потеряться не может, оно хранится, а по уровню, если не дождаться ответа можно потерять. NMI у Z80 как раз по заднему фронту (по спаду, т.е. перепад 1=>0), а вот INT как раз по уровню.
Едем дальше. 8259A контроллер запоминает входящие запросы прерываний в массиве D-триггеров. Схема:
Code: Select all
+-+---+
1-й запрос | | T |
>------|D| Q|------> на блок
+--|C| |
| | | |
| +-+---+
|
|
| +-+---+
2-й запрос | | T |
>---|--|D| Q|------> выбора
o--|C| |
| | | |
| +-+---+
|
|
| +-+---+
N-й запрос | | T |
>---|--|D| Q|------> приоритетов
o--|C| |
| | | |
| +-+---+
|
синхронизация
Я правильно думаю, что синхронизация блока этих триггеров идет от тактовой процессора, чтобы синхронизировать входящие запросы прерываний (которые по-сути асинхронны) ?.
Отсюда вопрос. D-триггер запоминает входной сигнал "D" на положительном фронте сигнала входа "C". Но если на "C" будет тактовая частота и положительный фронт этого сигнала будет появляться каждый период (а значит и возможность изменения запомненных данных), то как в таком случает удержать запомненным ранее пришедший запрос прерывания ?.
Это для случая, когда более старший запрос прерывания пришел и находится в обработке, и приходят более младшие запросы на прерывание, которые надо сохранить, пока обрабатывается этот старший запрос (возможно "длительное" время, скажем чтение/запись блока в режиме прямого доступа к памяти).
P.S. Сорри за качество рисунка.