Overriden定时器中断无法正常工作

时间:2012-12-12 10:44:11

标签: c++ timer kernel interrupt context-switch

我正在为我的大学工作一个小内核。 我已经覆盖了(不确定这是否是正确的表达式)定时器中断例程。

直到第一次上下文切换才能正常工作。上下文切换在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没有增加,这意味着我的计时器例程不再被调用。

我从各个角度研究了这个问题,尝试了各种方法,没有任何效果。任何想法都受到赞赏。 [:

1 个答案:

答案 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
}

现在就像一个魅力。