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

久しぶりにATtiny202を使ってみたらプログラム領域が少ないため公開されているライブラリが使えずHW直接アクセスするコードを書かなければいけなかったりして何かと面倒なので手始めにGPIOライブラリを作ってみた。

関数引数に定数を指定したときが高速かつ最小なコードになるが、ビルドモードや関数引数が定数かどうかを判断し適切かつ最小なコードが生成されるようにしてみたことやピン変化によるHW割込み処理にも対応してみた。ちなみにHW割込み処理を使うと意外にコードが大きくなってしまうためHW割込み処理を使わずに同じことができるポーリング処理にも対応。単純な処理のみならポーリングでOKかも。

自作にあたって特に悩んだのはシフト演算を使うと巨大かつ遅いコードになりがちなこと。そのためシフト演算なしですむようGPIOピン定義にそのビット位置とビットマスク値を含めている。

【生成されるコードの例(疑似コード)】

HW割込みを使うには
[avr8_config.h] #define CONFIG_PORT_ISR 1
に設定する。

【サンプルコード (Microchip Studio)】

【修正履歴】
2025-10-17
割込み処理のコードをシンプルにしてみた。色々試してみたらATtinyは問題ないけどDx/Ex系でコンパイルするとコンパイラの最適化の仕方が変わるのか複雑かつ大きめなコードになるのが気になったりする。それとGPIO以外のライブリを作ろうとしてDx/Ex系も対応しようとしてみたら同一機能の#defineの定義名がDFPバージョンやCPUによって違うとか、同じ定義名なのに大文字/小文字の違いがあるとか、#defineの定義名ならコードを切り替えることもできるけどtypedefやstructのメンバー名に違いがあるとかは判断できないしでとにかく共通化はウルトラ大変だ。統一化のためにDFPの定義名を変更したりすると世界中で悲鳴が上がったりするのだろうが今のうちになんとかしたほうがいいんじゃないのかな...と思ったりもした今日この頃...

【ライブラリ】

【関連投稿】
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 用のライブラリを自作する。(YIELD)
Microchip AVR8 用のライブラリを自作する。(CONFIG)