割り込み管理

この記事は、China MobileOneOSWeChatパブリックアカウント「InterruptionManagement」から共有されています。

割り込みとは、コンピュータの動作プロセスを指し、時間内に対処する必要のある予期しない状況が発生した場合、CPUは実行中のプログラムを自動的に停止し、予期しない状況を処理するプログラムに転送できます。割り込みは例外であり、例外を正しく処理し、エラーを回避することは、ソフトウェアの安定性を向上させるための非常に重要な部分です。

割り込み作業メカニズム

割り込みベクトルテーブルは、すべての割り込みハンドラのエントリポイントであり、通常はアドレス空間のアドレス0にあります。これは、割り込み処理がチップアーキテクチャに強く関連しているため、Cortex-Mシリーズについて以下で説明します。

Cortex-Mコアでは、すべての割り込みは割り込みベクタテーブルを使用して処理されます。割り込みがトリガーされると、プロセッサはそれがどの割り込みソースであるかを判別し、次に割り込みベクトルテーブルを検索して、処理のために対応する場所にジャンプできます。これには、各割り込みサービスルーチンのアドレスポインタを統一アドレスに接続する必要があり、このアドレスを割り込みベクタオフセットレジスタ(デフォルトでは0x08000000)に設定する必要があります。

 割り込み処理

オペレーティングシステムの割り込み管理では、割り込みハンドラは、割り込みプリアンブルプログラム、ユーザー割り込みサービスプログラム、および割り込みフォローアッププログラムの3つの部分に分かれています。

割り込み前文

実行中のシーンを保存します。異なるCPUアーキテクチャの実装方法は異なります。Cortex-Mの場合、この作業はハードウェアによって自動的に実行され、ソフトウェアを処理する必要はありません。割り込みがトリガーされると、プロセッサは自動的に次のコンテキストレジスタ(PSR、PC、LR、R12、R3-R0)を押します。現在実行中の部分を割り込みスタックに入れます。

os_interrupt_enterインターフェイスを呼び出します。これにより、グローバル変数os_interrupt_nestに1が追加され、ネストされたレコードに割り込むために使用されます。コードは次のとおりです。

void os_interrupt_enter(void)
{
    os_base_t level;
    level = os_hw_interrupt_disable();
    g_os_interrupt_nest ++;
    os_hw_interrupt_enable(level);
}

ユーザー割り込みサービスルーチン

ユーザー割り込みサービスルーチンでは、他の優先度の高いタスクがブロックして待機しているリソースが解放された場合、または他の条件によって優先度の高いタスクが準備できた場合、os_hw_context_switch_interruptインターフェイスが呼び出されてタスクが切り替わります。リソースの解放等がない場合は切り替えを行わず、割り込みプログラムの実行終了後に元のタスクに戻ります。

os_hw_context_switch_interruptの実装はCPUアーキテクチャに関連しています。Cortex-Mアーキテクチャでは、この関数はタスクをグローバル変数に切り替えるように設定し、優先度の低いPendSV例外をトリガーします。現在の割り込み処理が完了した後、 PendSV例外処理機能Executionに切り替わります。PendSVは、コンテキスト切り替えを支援するために特別に使用されるCortex-Mシリーズの例外です。

後続のプログラムを中断する

os_interrupt_leave()関数を呼び出して、グローバル変数g_os_interrupt_nestを1だけデクリメントします。コードは次のとおりです。

void os_interrupt_leave(void)
{
    os_base_t level;
    level = os_hw_interrupt_disable();
    g_os_interrupt_nest--;
    os_hw_interrupt_enable(level);
}

割り込み処理中にタスク切り替えが行われなかった場合は、割り込み前のタスクのコンテキストが直接復元され、割り込み中にタスク切り替えが行われた場合は、切り替えタスクのコンテキストが復元されます。タスク切り替えのシナリオの場合、割り込みプロセス全体のタイミング関係を次の図に示します。

中断プロセスの概略図

入れ子を壊す

割り込みサービスルーチンの実行中に優先度の高い割り込みがトリガーされると、現在の割り込みルーチンが一時停止され、優先度の高い割り込みサービスルーチンが実行されます。優先度の高い割り込みの実行が完了した後、一時停止されます。実行は続行されます。次の図に示すように、タスク切り替えが実行に関与している場合、すべての割り込み実行が完了するのを待ち、コンテキスト切り替えのためにpendSVに入ります。

割り込みネスティング図

割り込み管理インターフェイスは次のように設計されています。

(1)割り込みサービスルーチンを接続します

(2)割り込みソースをマスクする

(3)割り込みソースをオンにします

(4)グローバル割り込みをオフにします

(5)グローバル割り込みを復元する

(6)割り込みエントリ通知

(7)割り込み終了通知

{{o.name}}
{{m.name}}

おすすめ

転載: my.oschina.net/u/5443273/blog/5513419