例外のタイプには、リセット、割り込み、フォールトなどがあります。例外処理は突如として発生しますので、命令の実行に対し非同期で起こります。しかし、フォールトだけは、命令の実行によってエラー条件が発生したことによる例外ですので、原因となった命令に同期して発生することが基本です。しかし、バスのアクセスエラーなどのハードウエアに起因するフォールト等は命令とは非同期で発生することもあります。下表に例外の種類を示します。
優先順位
下表で上に行けば行くほど優先順位が高くなります。最も高いのはリセットです。Cortex-M3がどんな状態でもリセットがかかれば、リセットベクタに示された処理を行います。リセットの優先順位は-3になっています。ここで、お気付きになったと思いますが、優先順は0が最も高いのではなく-3が最も高い設定になっています。次がNMIで-2、ハードフォールトが-1で、メモリ管理が0になります。
「NVICレジスタ(第17回参照)」の説明の際に、例外処理の優先順位をこの数字で表します。優先順を0に上げることのできるレジスタがありますが、最高優先順位になるわけではありませんので、勘違いなさらないようにお願いします。表の中で、「優先順位の種類」という欄があります。ここで、「固定」となっている例外処理は、優先順を変更することができませんが、「設定可能」となっている例外処理は、レジスタによって変更することができます。NVICの主な機能(第13回参照)の②で述べた割り込みの優先度の変更が、これにあたります。
主な例外処理
No1~15はCortex-M3に起因する例外処理です。どういう例外処理かは表中の内容欄に記載してあります。No16~255はCortex-M3から見ると外部例外です。すなわちマイコンの周辺機能、例えば、タイマーや通信機能(SP、I2C、UART等)、アナログ機能(DAC、ADC等)、等々の割り込み処理に割り当てられます。これらの例外は、搭載されている各々の周辺機能に対しマイコンベンダが割り当てることになります。
No. | 例外の種類 | 優先順位 | 優先順位の種類 | 内容 |
---|---|---|---|---|
1 | リセット | -3(Highest) | 固定 | リセット |
2 | NMI | -2 | 固定 | ノンマスカブル割り込み(マスクできない割り込みです) |
3 | ハード フォールト | -1 | 固定 | 優先順位の関係、または他のハンドラが無効にされていて、実行できないときのデフォルト(すべて)のフォールト |
4 | メモリ管理 | 0 | 設定可能 | MPU違反(MPUの不整合)か不正な位置(アクセス違反や不一致)へのアクセス |
5 | バスフォールト | 1 | 設定可能 | AHBインターフェースのレシーバエラー プリフェッチフォールト、メモリアクセス フォールト、その他のアドレスやメモリ関連のフォールト |
6 | 用法フォールト | 2 | 設定可能 | プログラムエラーによる例外 例えば未定義命令の実行や不正な状態への遷移の試み |
7-10 | 予約 | – | – | — |
11 | SVCall (スーパーバイザコール) | 3 | 設定可能 | SVC命令によるシステムサービス呼び出し |
12 | デバッグ モニター | 4 | 設定>可能 | ホールト中でないときのデバッグモニタ ブレイクポイント、ウォッチポイント、外部デバッグ |
13 | 予約 | – | – | — |
14 | PendSV | 5 | 設定可能 | システムサービスへの保留可能な要求 |
15 | SYSTICK | 6 | 設定可能 | システムタイマの報知 |
16 | 外部割り込み #0 | 7 | 設定可能 | 外部割り込み #0 |
…… | ………………… | ………………… | 設定可能 | ………………… |
255 | 外部割り込み #239 | 246 | 設定可能 | 外部割り込み #239 |
こちらも是非
“もっと見る” Cortex-M編
SysTick、電力管理
SysTick機能を有効にするには、SysTick制御およびステータスレジスタを使用します。このレジスタのENABLEビットを1にすると、カウンタは動作をはじめます。つまり、カウンタにリロード値がロードされてから、カウントダウンが開始されます。
メモリマップ
Cortex-M3のメモリマップには、一般的なマイコンのメモリマップと若干異なる特徴があります。一般的なマイコンでは、メモリ領域を変更できるものもあります。しかし、Cortex-M3のメモリマップは定義されたメモリマップになっており、アドレス領域のマッピングは固定です。
ベクタテーブル
Cortex-M3のベクタテーブルは0番地から始まります。一般的なマイコンは、ベクタテーブルの最小アドレス部(0番地)にはリセットベクタが割り当てられていますが、Cortex-M3ではメインスタック(SP_main)の初期値が割り当てられています。