割り込みの優先順位
割り込み優先度レジスタ
Cortex-M3では、各割り込みの優先順位をユーザーが変更することができます。それも8段階や16段階ではなく256段階で設定することが可能です。設定には、割り込み優先度レジスタを使います。このレジスタの中のPRI_Nフィールド(Nは割り込み番号を表す)を設定することで、各割り込みを256段階の0~255の優先順位に割り当てることができます。この場合、0に割り当てた割り込みの優先順位が最も高くなり、255に割り当てた割り込みの優先順位が最も低くなります。
また、優先順位も2段階に分けて設定することができます。まず「横取り優先度(グループ優先度)」という優先順位で大きく優先順位をつけて、さらにその中で、優先順位を設定することが可能です。これを「サブ優先度」と呼びます。横取り優先度とサブ優先との組み合わせが、一般に優先度と呼ばれます。
アプリケーション割り込みおよびリセット制御レジスタの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ビット
割り込み優先度レジスタのPRI_Nフィールド
割り込み優先度レジスタは2つあります。Cortex-M3の外部割り込み用とシステムハンドラ用の優先度レジスタです。外部割り込み用の優先度レジスタは0xE000E400~0xE000E4EFです。読み出し/書き込みが可能です。リセット時の状態は0x00000000です。システムハンドラ用の優先度レジスタは0xE000ED18~0xE000ED23です。読み出し/書き込みが可能です。リセット時の状態は0x00000000です。
外部割り込み用優先度レジスタのPRI_NフィールドのNは外部割り込み番号に相当します。例えば、外部割り込み#0にはPRI_0フィールド、外部割り込み#1にはPRI_1フィールドが適用されます。
システムハンドラ用の優先度レジスタは、次のシステムハンドラの優先順位付けに使用します。
- メモリ管理(PRI_4)
- バスフォールト(PRI_5)
- 用法フォールト(PRI_6)
- SVC(PRI_11)
- デバッグモニタ(PRI_12)
- PendSV(PRI_14)
- SysTick(PRI_15)
PRI_NフィールドのNには割り込み番号7~10、13の予約も含まれています。
実際のマイコンの製品の優先順位付け
アプリケーション割り込みおよびリセット制御レジスタのPRIGROUPフィールドの「横取り優先度」と「サブ優先度」のレベルを表にまとめると以下の通りになります。
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レベル の優先順位で実行されます。
4ビットの場合の割り込み優先順位付けを表2に示します。この場合、割り込み用優先度レジスタのPRI_Nフィールドの8ビットのうちMSB側の4ビットしか実装されませんので、LSB側の4ビットは常に0として読み出されることになります。実際の実装仕様は各製品で異なりますので、各製品のマニュアルを参照してください。
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は、非特権アクセス(ユーザーアクセス)状態ではセットできません。
これらのメカニズムは横取り優先度(グループ優先度)にだけ影響します。サブ優先度には影響ありません。サブ優先度は、ペンディングの例外優先度を分類するのに使用されるだけであり、アクティブな例外には影響しません。
こちらも是非
“もっと見る” Cortex-M編
SysTick、電力管理
SysTick機能を有効にするには、SysTick制御およびステータスレジスタを使用します。このレジスタのENABLEビットを1にすると、カウンタは動作をはじめます。つまり、カウンタにリロード値がロードされてから、カウントダウンが開始されます。
メモリマップ
Cortex-M3のメモリマップには、一般的なマイコンのメモリマップと若干異なる特徴があります。一般的なマイコンでは、メモリ領域を変更できるものもあります。しかし、Cortex-M3のメモリマップは定義されたメモリマップになっており、アドレス領域のマッピングは固定です。
ベクタテーブル
Cortex-M3のベクタテーブルは0番地から始まります。一般的なマイコンは、ベクタテーブルの最小アドレス部(0番地)にはリセットベクタが割り当てられていますが、Cortex-M3ではメインスタック(SP_main)の初期値が割り当てられています。