我正在为我的大学开发一个小内核作为项目。我已经覆盖(不确定这是否是正确的表达式)一个定时器中断例程。
在第一次上下文切换之前它运行良好。上下文切换在 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++;
}
}
//mod 就像 id
当我运行程序时,我得到:
init Test1 time:0 //从进程一开始,表示已经开始,允许运行2个周期,当前时间为0
0 //定时器程序开始时的当前时间
1 //定时器程序开始时的当前时间
Test2 time:2 //从进程二开始,已经开始,允许运行2个周期,当前时间如预期为2
我已经把 cout << System::currentTime; 在 br++ 之后的 run() 中。我得到的是“2”被打印到无穷大。这表明 currentTime 没有增加,这意味着我的计时器例程不再被调用。
我从各个角度看待这个问题,尝试了各种方法,但都没有奏效。任何想法都值得赞赏。[: