Microchip AVR8 用のライブラリを自作する。(CPUINT)

Last Updated on 2026-07-28 by researcher

割込み処理は割込みベクター毎に割込みハンドラが生成されるためコードがやけにデカくなるのが気になっていたが、AVR8シリーズのCPUINTのCVT(Compact Vector Table)機能を使うことで割込みベクターを共通化しコードを小さくすることができるらしいので試してみた。

メモリの少ないCPUや数多くの割込み処理を駆使するアプリではメリットが大きいと思うが問題はCVTが既存の割込みベクターの一部(1、2、3番)を利用するため今までの割込み処理の定義をどうするかが問題。

既存の割込み処理定義を書き換えるのは面倒だし、かといってダブッてる割込みベクターをなんとかしないと使えなくなる割込みがでてしまうし...

で、結局、今まで通りの方法で割込み処理が定義できたほうがいいんじゃね?ということで、ISRマクロの書き換えとダブッてしまう1,2,3番のベクターを未使用の番号に振替し、そのアドレスを変数に保存&実行する方法で考えてみた。この方法では、共通の割込み処理内から従来の割込み処理をcallするため各ハンドラーはreti命令ではなくretで戻らなければならないが書き換えられたISRマクロにより自動的に行われるので特に意識することはない。

avr8_interrupt.hにてISRマクロを書き換えるためavr8_interrupt.hのインクルードは必須となるが、この方法なら各ソースを変更せずにCVT対応が可能となる。

それと全ての割込みベクターをRAMにコピー&実行するモード(CONFIG_CPUINT_CVT=2)にも対応してみた。このモードでは、Cpuint::interrupt()の呼び出しにより動的に割込みベクターの登録や取得が可能となるため割込みをデイジーチェーン処理させたりすることもできる。

【avr8_config.h】
/* CPUINT */
#define CONFIG_CPUINT_CVT 0 /* 0=disable, 1=ROM, 2=RAM */
#define CONFIG_CPUINT_CVT_NMI 0 /* 0=disable, 1=enable */
#define CONFIG_CPUINT_CVT_LVL1 0 /* 0=disable, 1=enable */

【ライブラリ】

【関連投稿】
Microchip AVR8 用のライブラリを自作する。(GPIO)
Microchip AVR8 用のライブラリを自作する。(FUSE)
Microchip AVR8 用のライブラリを自作する。(CLOCK)
Microchip AVR8 用のライブラリを自作する。(RESET)
Microchip AVR8 用のライブラリを自作する。(PORTMUX)
Microchip AVR8 用のライブラリを自作する。(USART)
Microchip AVR8 用のライブラリを自作する。(RTC)
Microchip AVR8 用のライブラリを自作する。(TCA)
Microchip AVR8 用のライブラリを自作する。(TCB)
Microchip AVR8 用のライブラリを自作する。(VREF)
Microchip AVR8 用のライブラリを自作する。(DAC)
Microchip AVR8 用のライブラリを自作する。(AC)
Microchip AVR8 用のライブラリを自作する。(ADC)
Microchip AVR8 用のライブラリを自作する。(ZCD)
Microchip AVR8 用のライブラリを自作する。(SPI)
Microchip AVR8 用のライブラリを自作する。(TWI)
Microchip AVR8 用のライブラリを自作する。(MAIN)
Microchip AVR8 用のライブラリを自作する。(CONFIG)
Microchip AVR8 用のライブラリを自作する。(ALARM)
Microchip AVR8 用のライブラリを自作する。(TASK)
Microchip AVR8 用のライブラリを自作する。(CCL)
Microchip AVR8 用のライブラリを自作する。(TCD)
Microchip AVR8 用のライブラリを自作する。(TCE)
Microchip AVR8 用のライブラリを自作する。(WEX)
Microchip AVR8 用のライブラリを自作する。(TCF)
Microchip AVR8 用のライブラリを自作する。(CPUINT)
Microchip AVR8 用のライブラリを自作する。(DOWNLOAD)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください