ベクタテーブル

ベクタテーブル

概要

Cortex-M3のベクタテーブルは0番地から始まります。テーブル内には、例外ハンドラとISR(割り込みサービスルーチン)のアドレス(ベクタ)を記述します。ARM7等の他のARMプロセッサでは、命令を記述し、その命令を実行して飛び先アドレスにジャンプする方式ですが、Cortex-M3では命令を記述する必要は無く、飛び先アドレスを記述すればハンドラが自動的に、そのアドレスに飛ばしてくれます。

テーブルサイズ(ワード)= IRQ入力数+16。最小サイズ(1 IRQの場合)は17ワード、最大サイズ(240 IRQの場合)は256ワードになります。

一般的なマイコンは、ベクタテーブルの最小アドレス部(0番地)にはリセットベクタが割り当てられていますが、Cortex-M3ではメインスタック(SP_main)の初期値が割り当てられています。その為、ソフトウェアの初期ルーチンでSP_mainの初期化を行う必要はありません。マイコンのリセット後にSP_mainの値が自動的にR13(SP)に格納されます。

0x00から0x3CまではCortex-M3用のベクタになり、0x40以降は、マイコンの周辺機能または、外部からの割り込みに割り当てられています。

ベクタテーブル
アドレス ベクタ
0x00 SP_mainの初期値
0x04 リセット
0x08 NMI
0x0C ハードフォールト
0x10 メモリ管理
0x14 バスフォールト
0x18 用法フォールト
0x1C-0x28 Reserved
0x2C SVCall
0x30 デバッグモニター
0x34 Reserved
0x38 PendSV
0x3C Systick
0x40 IRQ0
... ~ IRQs

ベクタテーブルの移動

メモリマップ上で、コードエリアとデータエリアが分離されているマイコンもありますが、 Cortex-M3では、メモリマップ上のどこにコードを記述しても実行できます。すなわち、RAMエリアにプログラムを記述しても実行が可能です。

Cortex-M3を搭載したマイコンでFlashを停止させて消費電力を低減する機能が付いている場合、Flashを停止しRAMやその他のメモリ(EEPROM等)上のコードを実行させることができます。しかし、この場合、ベクタアドレスがFlash上にあると、割り込みが実行できません。そこで、Cortex-M3のベクタテーブルは移動できるようになっています。

ベクタテーブルを移動するには、ベクタテーブル オフセットレジスタを使います。ベクタテーブル オフセットレジスタは、ベクタテーブルの位置がコード領域またはSRAM領域のどこにあるかを示しています。

リセット後のデフォルト値は0(コード領域)です。レジスタの中のTBLBASEがベクタテーブルがコード領域にあるか RAM領域にあるかを示し、TBLOFFがSRAM領域またはコード領域の最下位部分からのオフセットを示します。

ベクタテーブルの位置を設定するとき、例外の数を考慮して、設定する必要があります。つまり、16個までの割り込みが使える最小のアライメントは32ワードになります。割り込みの数がより多い場合は、次の2のべき乗まで切り上げて、考慮する必要があります。例えば、21個の割り込みが必要な場合、テーブルサイズが37ワードになり、次の2のべき乗は64なので、アライメントは64ワード境界の必要があります。

図1

ベクタテーブル オフセットレジスタ