割り込み

割り込みの優先順位

割り込み優先度レジスタ

Cortex-M3では、各割り込みの優先順位をユーザーが変更することができます。それも8段階や16段階ではなく256段階で設定することが可能です。設定には、割り込み優先度レジスタを使います。このレジスタの中のPRI_Nフィールド(Nは割り込み番号を表す)を設定することで、各割り込みを256段階の0~255の優先順位に割り当てることができます。この場合、0に割り当てた割り込みの優先順位が最も高くなり、255に割り当てた割り込みの優先順位が最も低くなります。

また、優先順位も2段階に分けて設定することができます。まず「横取り優先度(グループ優先度)」という優先順位で大きく優先順位をつけて、さらにその中で、優先順位を設定することが可能です。これを「サブ優先度」と呼びます。横取り優先度とサブ優先との組み合わせが、一般に優先度と呼ばれます。

図1

優先順位付けのイメージ

アプリケーション割り込みおよびリセット制御レジスタのPRIGROUPフィールド

「横取り優先度」と「サブ優先度」のレベルを決めるのは、アプリケーション割り込みおよびリセット制御レジスタのPRIGROUPフィールドです。PRIGROUPフィールドは、優先度レジスタのすべてのPRI_Nフィールドの値を横取り優先度フィールドとサブ優先度フィールドに分割することに使用されます。そして、割り込み優先度レジスタのPRI_Nフィールドの横取り優先度フィールドとサブ優先度フィールドのビット数で優先順位を設定します。

例えば、PRIGROUPフィールドを4に設定します。この時、横取り優先度にPRI_NフィールドのMSB側の3ビットが割り当てられ、サブ優先度にLSB側の5ビットが割り当てられます。横取り優先度が3ビットですので2の3乗の8段階になり、サブ優先度が5ビットですので、32段階になります。8段階×32段階で合計256段階に優先順位が割り当てられます。

PRIGROUPフィールドは、すべてのPRI_Nフィールドに適用されますので、異なったPRI_Nフィールド(例えばPRI_237とPRI_236)で異なった優先順位を設定することはできません。(例えばPRI_236には PRIGROUPフィールドを4を、PRI_237には PRIGROUPフィールドを3のような割り当てはできません)

  • ●PRIGROUP[2:0]=0 7.1 : 横取り優先度が7ビット、サブ優先度が1ビット
  • ●PRIGROUP[2:0]=1 6.2 : 横取り優先度が6ビット、サブ優先度が2ビット
  • ●PRIGROUP[2:0]=2 5.3 : 横取り優先度が5ビット、サブ優先度が3ビット
  • ●PRIGROUP[2:0]=3 4.4 : 横取り優先度が4ビット、サブ優先度が4ビット
  • ●PRIGROUP[2:0]=4 3.5 : 横取り優先度が3ビット、サブ優先度が5ビット
  • ●PRIGROUP[2:0]=5 2.6 : 横取り優先度が2ビット、サブ優先度が6ビット
  • ●PRIGROUP[2:0]=6 1.7 : 横取り優先度が1ビット、サブ優先度が7ビット
  • ●PRIGROUP[2:0]=7 0.8 : 横取り優先度なし、サブ優先度が8ビット
図2

アプリケーション割り込みおよびリセット制御レジスタ

割り込み優先度レジスタのPRI_Nフィールド

割り込み優先度レジスタは2つあります。Cortex-M3の外部割り込み用とシステムハンドラ用の優先度レジスタです。外部割り込み用の優先度レジスタは0xE000E400~0xE000E4EFです。読み出し/書き込みが可能です。リセット時の状態は0x00000000です。システムハンドラ用の優先度レジスタは0xE000ED18~0xE000ED23です。読み出し/書き込みが可能です。リセット時の状態は0x00000000です。

外部割り込み用優先度レジスタのPRI_NフィールドのNは外部割り込み番号に相当します。例えば、外部割り込み#0にはPRI_0フィールド、外部割り込み#1にはPRI_1フィールドが適用されます。

図3

割り込み優先度レジスタ

システムハンドラ用の優先度レジスタは、次のシステムハンドラの優先順位付けに使用します。

  • ●メモリ管理(PRI_4)
  • ●バスフォールト(PRI_5)
  • ●用法フォールト(PRI_6)
  • ●SVC(PRI_11)
  • ●デバッグモニタ(PRI_12)
  • ●PendSV(PRI_14)
  • ●SysTick(PRI_15)

PRI_NフィールドのNには割り込み番号7~10、13の予約も含まれています。

図4

システムハンドラ優先度レジスタ

実際のマイコンの製品の優先順位付け

アプリケーション割り込みおよびリセット制御レジスタのPRIGROUPフィールドの「横取り優先度」と「サブ優先度」のレベルを表にまとめると以下の通りになります。

表1:Cortex-M3の割り込み優先順位付け
PRIGROUP
(3ビット)
バイナリポイント
(グループ.サブ)
横取り優先度(グループ優先順位) サブ優先度
ビット レベル ビット レベル
000 7:1 ggggggg.s 7 128 1 2
001 6:2 gggggg.ss 6 64 2 4
010 5:3 ggggg.sss 5 32 3 8
011 4:4 gggg.ssss 4 16 4 16
100 3:5 ggg.sssss 3 8 5 32
101 2:6 gg.ssssss 2 4 6 64
110 1:7 g.sssssss 1 2 7 128
111 0.8 ssssssss 0 0 4 256

しかし、実際には、256段階も割り込み優先順位を使うことは稀です。そこで、実際のマイコン製品では、8ビットフルのPRIGROUP[2:0]=0~7を実装することはあまりありません。例えば8ビットの割り込み優先順位のうち、4ビットしか使わない製品等があります。4ビットだと16レベル の優先順位で実行されます。

図5

システムハンドラ優先度レジスタ

4ビットの場合の割り込み優先順位付けを表2に示します。この場合、割り込み用優先度レジスタのPRI_Nフィールドの8ビットのうちMSB側の4ビットしか実装されませんので、LSB側の4ビットは常に0として読み出されることになります。実際の実装仕様は各製品で異なりますので、各製品のマニュアルを参照してください。

表2:実際の製品の割り込み優先順位付け(4ビット実装)
PRIGROUP
(3ビット)
バイナリポイント
(グループ.サブ)
横取り優先度(グループ優先順位) サブ優先度
ビット レベル ビット レベル
011 4.0 gggg 4 16 0 0
100 3:1 gggs 3 8 1 2
101 2:2 ggss 2 4 2 4
110 1:3 gsss 1 2 3 8
111 0.8 ssss 0 0 4 16

優先順位に関するその他の機能

Cortex-M3は特殊な役割を持った割り込みマスクレジスタを持っています。PRIMASKとFAULTMASKとBASEPRIです。これらのマスクレジスタはMRS命令とMSR命令でアクセスします。

PRIMASK

このビットを設定すると、実行優先権は0に上げられます。すなわち、NMIとハードフォールト以外のすべての割り込みが禁止されます。デフォルト値は0(マスクがセットされていない)です。

FAULTMASK

このビットを設定すると、実行優先権は-1に上げられます。すなわち、NMI以外のすべての割り込みが禁止されます。言い換えると、ハードフォールトハンドラによるフォールト処理が無効にされると言う点以外はPRIMASKと同じです。デフォルト値は0(マスクがセットされていない)です。例外ハンドラを出ることで自動的にクリアされます。

BASEPRI

特定の優先度N (最も低い構成可能な優先度)またはN以下の優先度の低い割り込みがすべて禁止されます。Nは各マイコン製品で実装されているビット数に依存します。最大で9ビットです。0でない値は優先順位マスクとして動作します。これによって定義された優先度が同じであるか、または現在実行されている優先順位よりも高いときに、実行優先度に影響します。デフォルト値はN=0(マスク機能が無効)です。

PRIMASKとBASEPRIは、一時的に割り込みを無効にする時に役立ちます。FAULTMASKは一時的にフォールト処理を無効にする時に役立ちます。PRIMASKとFAULTMASKは、非特権アクセス(ユーザーアクセス)状態ではセットできません。

これらのメカニズムは横取り優先度(グループ優先度)にだけ影響します。サブ優先度には影響ありません。サブ優先度は、ペンディングの例外優先度を分類するのに使用されるだけであり、アクティブな例外には影響しません。