Цитата(vvs157 @ Apr 21 2005, 17:26)
А зачем Вы контроллер превываний дергаете перед выходом?. Это же уже сделано в старом обработчике. По-моему (могу ошибаться) прерывания с диска имеют более высокий приоритет, чем таймер. Поэтому запрет прерываний в таймерной секции с последующим EOI по-моему может при определенном стечении обстоятельств вызвать потерю прерывания с диска. Попробуйте убрать обращение к контроллеру преряваний.
Т.к. прерывания от таймера у меня возникают не 18.2 раза в секунду, а столько сколько мне нужно
(в зависимости от count:
outportb( 0x40, (char) count);
outportb( 0x40, (char)( count >> 8 ) );
задаётся частота возникновения прерываний от таймера),
то и стандартный обработчик таймера я вызываю не всегда. В переменной BIOSTimerSpeed хранится число прерываний котороые я должен пропустить прежде чем вызвать стандартный обработчик.
if ( cnt >= BIOSTimerSpeed )
{
cnt = 0;
SvInt08();
}
else
{
outportb(0x20,0x20);
}
Поэтому, если не вызван стандартный обработчик то нужно outportb(0x20,0x20);
Прерывание с диска имеют более низкий приоритет, чем от таймера. Однако возможно изменение приоритетов в рамках приоритетного кольца. Попробую поизменять приоритеты...