Я работаю над небольшим ядром в качестве проекта для моего университета.
Я переопределил (не уверен, что это правильное выражение) подпрограмма прерывания таймера.
Работает хорошо до первого переключения контекста. Переключение контекста происходит в 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 не увеличивается, а это означает, что моя процедура таймера больше не вызывается.
Я смотрел на эту проблему с разных сторон, пробовал разные методы и ничего не получалось. Любая идея ценится. [:
Я не думал об отправке сигнала об окончании прерывания контроллеру прерываний. Просто нужно добавить
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
}
и теперь работает как шарм.
Других решений пока нет …