[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
>>Как контроллер прерываний узнает...
Все однофункциональные платы на PCI используют INTA#. Каждой плате приписан свой IRQx. Эти два 8-разр. значения прописаны в Conig.Memory карты (первое - read_only, второе назначает система). Каждому IRQx соответствует INTxx (это см. в ссылке). INT0-INT15 имеют разный приоритет. Перед тем как прерывание использовать необходимо загрузить резидентную программу - обработчик прерывания - это ясно(по поводу WinNT и т п советую http://www.jungo.com/windriver.html).
Допустим, установлено три платы - все на INTA#. Им приписаны (к примеру) IRQ10=INT72h, IRQ11=INT73h и IRQ12=INT74h. Активизация INTA# приведет к последовательному выполнению обработчиков, чьи адреса (векторы прерывания) соответствуют INT72h, INT73h, INT74 (в такой последовательности - есть приоритет). Каждая плата должна иметь регистр (реализация, адрес произвольно) который программа-обработчик будет опрашивать чтобы выяснить не ее ли это прерывание сработало. И если ее то она должна выполнить действия (посылка в порт, память адр. пространства платы) которые уберут выставленный INTA#.
И еще важно. Предпоследним шагом в обработчике (перед тем как сделать POP DS...IRET) нужно очистить так называемые биты 'in-service' (они как раз в контроллере) - для IRQx и для IRQ2. Иначе первая обработка окажется и последней. Ну и при установке вектора прерывания не забыть соотв. INTxx разрешить. Еще раз рекомендую внимательно изучить документ в ссылке внизу.
--IgorK
E-mail: info@telesys.ru