AVR用高速GPIOライブラリ

ポートに直接アクセスするコードを記述すると avr-gccはアセンブラのポート入出力命令に置き換えてくれるので高速に処理できるようになるのだがポートを関数引数で渡すことができないというジレンマがある。

しょうがないので、今までは、次のようにマクロ定義によりポート指定していた。

#define XXXX_PORT B
#define XXXX_POS 0
#include “XXXX.h”

この方法は、煩わしいし、美しくもない...

関数引数として指定でき、かつ、アセンブラのポート入出力命令に置き換わる方法を、今回、ようやく見つけることができたのでGPIOライブラリを作ってみた。

GPIOライブラリは、arduinoのpinMode/digitalWrite/digitalReadと同じ仕様なので使い方は説明するまでもないだろうが、各関数の第一引数のピン番号は必ず整数定数かIOPORT_PINマクロを指定すること。

間違って変数を指定してもコンパイルは通るが低速&巨大なコードが生成されるだけなので注意しよう。

また、ピン番号のマッピングはarduinoのものとは違うことにも注意してほしい。ピン情報については製品ドキュメントを参照。

サンプルスケッチをコンパイルし逆アセンブルすると次のようにポート操作命令に置き換わっていることが確認できるはずだ。

【サンプル・スケッチ】

このライブラリを利用して他のライブラリ等を作成する場合などは、テンプレート・クラスのパラメタとしてピン番号を指定するのが良いだろう。例えば、こんな感じで...

【修正履歴】
2020-06-23
toggleOutput()がバグってたと思って修正したけどバグってたのは私の頭のほうだったので元に戻した。(-_-;)

2020-06-22
toggleOutput()がバグってたので修正。

2020-06-20
不具合ではないが再度マクロ定義の変更とそれに伴うコード修正を行った。

2020-04-30
不具合ではないがマクロ定義の変更とそれに伴うコード修正を行った。

【ライブラリ】