Цитата(rmihail @ Apr 21 2005, 12:53)
void interrupt NewInt08(...)
{
static cnt = 0;
disable(); // запрет прерываний
Дизайбл делать не надо - и так уже дизэйбл, на аппаратном уровне
Цитата(rmihail @ Apr 21 2005, 12:53)
cnt++; // считаем сколько пропускать до вызова старого обработчика
readallchannel(); // функция считывания и записи данных с АЦП
if ( cnt >= BIOSTimerSpeed ) // true => вызвать старый обработчик
{
gettime (&t); // читаем текущее время
docommonwrite( (char *) &t,4,'t'); // запись текущего времени
cnt = 0;
enable(); // востановление прерываний
энэйбл тут - это подозрительно.
Это даст возможность вложенных прерываний.
Это очень тонкий момент, лучше так не делать.
Цитата(rmihail @ Apr 21 2005, 12:53)
SvInt08(); // вызов старого обработчика прерывания
}
else
{
enable(); // востановление прерываний
outportb(0x20,0x20); //конец прерывания
Это ...."полный привет".. !!!
Дело в том, что обращение к интеррапт-контроллеру
само по себе может вызвать аппаратное шевеление вывода INT.
Что приведет к генерации дополнительного прерывания.
В таких случаях вполне возможна непрерывная генерация.
Основанная не неверно написанном обработчике прерываний.
Кроме того - энейбл совершенно бесполезен в конце обработчика.
Так же, как бесполезен дизэйбл в начале обработчика.
Ибо после окончания обработчика он (энейбл) будет сделан аппаратно...