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 //プロセス1から、開始したことを示し、2サイクル実行する権限があり、現在の時間は0です。

0//タイマールーチンの開始時の現在時刻

1//タイマールーチンの開始時の現在時刻

Test2 time:2 //プロセス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 に答える