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

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

Работает хорошо до первого переключения контекста. Переключение контекста происходит в 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

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

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

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

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

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

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

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

0

Решение

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

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
}

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector