我正在为我的大学工作一个小内核。 我已经覆盖了(不确定这是否是正确的表达式)定时器中断例程。
直到第一次上下文切换才能正常工作。上下文切换在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
当我运行程序时,我得到:
初始化 Test1时间:0 //来自进程1,表示已经开始,它有权运行2个周期,当前时间为0
0 //计时器例程启动时的当前时间
1 //计时器例程启动时的当前时间
测试2时间:2 //从过程2开始,允许运行2个周期,当前时间为2预期
我已经把cout&lt;&lt;系统:: currentTime的;在br ++之后的run()中。我得到的是&#34; 2&#34;打印到无限。这表明currentTime没有增加,这意味着我的计时器例程不再被调用。
我从各个角度研究了这个问题,尝试了各种方法,没有任何效果。任何想法都受到赞赏。 [:
答案 0 :(得分: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
}
现在就像一个魅力。