かふぇルネ

RXマイコン:ベクタテーブルの位置と内容

るねカフェの「PDG2を使いながら、手動で割り込みをつくるには」に投稿しました。

投稿には「可変ベクタ」という言葉がでてきます。ベクタというのはベクタテーブルのことで、割込み指示(リセット、NMI、外部信号、内部処理)の内容によってどの割込み処理を行うか事前に登録しておくテーブルです。
RXマイコンでは割込みテーブルレジスタ(INTB)というものがあるため、固定ベクタテーブルであるリセット、NMI(例外も含む)以外の割込みについては自由にベクタテーブルを自由に配置できるようになっています。
可変ベクタ

固定ベクタテーブルはFFFFFF80hで決まっていますが、可変ベクタテーブルは前述の通り、INTBの内容で決まります。事例ではFFFF8000hとなっています。

さて、投稿の趣旨であるベクタテーブル(固定、可変)と関数の登録位置の関係が分かりにくい理由は、どうやって登録するかが見えにくいとからですね。

プログラムは元より、マイコンが扱うデータはどこに配置するか指定する必要があります。指定方法は開発環境でマッピング(セクションの割り当て)を行うか、アセンブラで直接指定(.SECTIONと.ORGの組み合わせ)する方法がありますが、前者の方がメンテナンス的にはオススメです。

開発環境をHEWとした場合、固定ベクタテーブルはFIXEDVECTセクション、可変割込みテーブルはC$VECTセクション、割込み関数の本体はIntPRGセクションに配置されます。
可変ベクタ2

C言語ではセクションの割り当ては#pragma section (セクション名)で行うので、割込み処理を記述するファイルの先頭には
#pragma section IntPRG
という宣言が必要です。

ベクタテーブルの方ですが、固定/可変ベクタテーブルはHEWで準備してくれています(vecttbl.c/vect.h)。

通常はこれで問題ありません。PDG2(Peripheral Driver Generator2)を利用したとしても、PDG2が新しいベクタテーブルをセットしてくれるので問題ありません。

問題が起こるのはPDG2が作成したベクタテーブルを採用しつつ、一部では自前で割込み関数を作成する場合です。

PDG2を利用するとvecttbl.c/vect.hはプロジェクト対象(コンパイル対象)から外れ、一見ベクタテーブルが無くなってしまったかのように見えますが、中では#pragma interrupt (IRQ0(vect=64))の様に機能単位で割込み関数とベクタテーブルへの配置が行われています。
よって、PDG2と自前とで併用したい場合は、自前の割込み関数も#pragma interrupt (関数名(vect=ベクタ番号))の形式で登録すればよいのです。SCI0の受信割込みを自前で作成したい場合は#pragma interrupt (SCI0_RXI0(vect=215))としてベクタテーブルに登録し、処理はSCI0_RXI0(void)の中に記述します。
ベクタ番号と割込みの対応はハードウェアマニュアルに記載されていますので、割込みコントローラの項目を確認してください。

ABOUT ME
Nozomu.Kon
トータルソフトウェアコーディネーターがあなたのお困りを即時に解決!