0

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

在第一次上下文切换之前它运行良好。上下文切换在 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 没有增加,这意味着我的计时器例程不再被调用。

我从各个角度看待这个问题,尝试了各种方法,但都没有奏效。任何想法都值得赞赏。[:

4

1 回答 1

0

我没有考虑将 End-of-interrupt 信号发送到中断控制器。只需要添加

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
}

现在就像一个魅力。

于 2012-12-12T11:09:26.630 回答