Переопределенное прерывание таймера не работает должным образом

Я работаю над небольшим ядром в качестве проекта для моего университета. Я переопределил (не уверен, что это правильное выражение) подпрограмма прерывания таймера.

Работает хорошо до первого переключения контекста. Переключение контекста происходит в dispatch(), который вызывается, когда процесс использует все назначенное время (время ожидания).

Моя подпрограмма инициализируется непосредственно перед запуском основного процесса, и она должна восстановиться после того, как это будет сделано (хотя я никогда не получал этого) Я также пытался инициализировать его каждый раз при запуске процесса и восстанавливать его во время переключения контекста или когда этот процесс завершается. Я попробовал это, потому что у меня есть законченный проект 2005 года (немного другой), к которому я обращаюсь за идеями, а не копированием.

Таймер прерывания:

void interrupt System::timer(...){
intOff;
    cout << currentTime << "\n";
    currentTime++;

    if(System::runningTime){
        System::runningTime--;
        if(!System::runningTime) {
          dispatch();
        }
    }
    else asm int 60h;
intOn;
}

инициализация новой и восстановление старой программы:

void System::init(){
  cout << "init\n";
  oldTimer = getvect(0x1c);
  setvect(0x1c, &timer);
  setvect(0x60, oldTimer);
}
void System::restore(){
  cout << "restore " << System::running->getName() << System::running->getID() << "\n";
  setvect(0x1c, oldTimer);
}

Процесс, который я запускаю:

void run(){
            cout << "Test" << mod << " time:" << System::currentTime << "\n";
        while(System::currentTime < 100){
        br++;
        }
    }

// мод похож на id

Когда я запускаю программу, я получаю:

init Test1 time: 0 // от первого процесса, указывает, что он запущен, у него есть разрешение на запуск в течение 2 циклов, текущее время равно 0

0 // текущее время в начале процедуры таймера

1 // текущее время в начале процедуры таймера

Test2 time:2 // из второго процесса, он начался, разрешение на запуск в течение 2 циклов, текущее время 2, как и ожидалось

Я поставил cout << System::currentTime; в run() после br++. То, что я получил, было напечатано "2" до бесконечности. Это указывает на то, что currentTime не увеличивается, а это означает, что моя процедура таймера больше не вызывается.

Я смотрел на эту проблему с разных сторон, пробовал разные методы и ничего не получалось. Любая идея ценится. [:

1 ответ

Решение

Я не думал об отправке сигнала об окончании прерывания контроллеру прерываний. Просто нужно добавить

asm {
push ax
in al, 0x61
or al, 0x80 // 10000000b
out 0x61, al
and al, 0x7F // 01111111b
out 0x61, al
mov al, 0x20
out 0x20, al
pop ax
}

и теперь работает как шарм.

Другие вопросы по тегам