hiraコメントする最近、仕事が忙しく、更新が無かった・・・RXマイコンでタイマー割り込みに使うのに適したペリフェラルはCMTだろう、単機能、シンプルで扱いやすく、理解しやすい。CMTのカウンターは16ビットだが、プリスケーラーの仕様により最大で、PCLKBの1/8の周期になってしまう為、間隔の短いタイマー割り込みを組みたい場合に、誤差が大きくなる場合がある。※メインクロックとの相性もあるが・・そこで、他の選択肢としてTPUを使ったタイマーを実装する事にした。※TPUは、PCLKBの1/1を選択可能なので、より正確なタイミングを生成でき、ポートの出力も制御できる。TPUユニットは、RX24Tには無いが、RX64Mには、1ユニット、6チャネルある。※RX631、RX63Nなどにもあるようだ。面倒なのが、割り込み設定で、RX64Mではモジュールが大量に増えた為、TPUの割り込みは固定ベクターではなく、選択的なベクターになっている。動で行いたいので、工夫してみた。※RX631のTPUは、固定ベクターなので、その辺りも上手く吸収できるようにしなければならない。TPUの機能は、タイマー割り込みの他、色々な機能があるので、それも簡単に扱えるような工夫が必要となるが、全ての機能を盛り込むと、設定が複雑になるので、ある程度は妥協も必要で、その辺りのバランスが難しい。※現在は、拡張中・・TPUを考える前に、省電力機能の管理を少し拡張した。ものしか有効になっていない。※ドライバー実装時、この省電力を「無効」にするのを忘れて、ペリフェラルが動作せずに、時間を浪費した事があるのでは無いだろうか?※注意事項には書いてあるのと、「お約束」ではあるのだが・・ペリフェラルのテンプレートでは、個別IDを設定しておいて、それを定義に忍ばせておく事で、他の連携クラスが、固有の動作を切り替えて実現でき、また、連携クラスの実装分担を、ペリフェラルの定義から分離できる。この簡単な仕組みにより、ペリフェラルの実装時、ペリフェラルやチャネルにより異なる実装を隠蔽できる。自分は、「手」を動かす事が好きなので、あーでもない、こーでもないを繰り返して今の実装になっている。TPU5;※「割り込み要因」は、選択型割り込みを設定する際に必要なIDで、チャネル毎に機能が微妙に異なるが、シンプルな定義になっている。因が存在しない場合)省電力管理で、必要な要素として、チャンネルの起動と廃棄時、まだ、使っているチャネルがある場合に、省電力機能を無効にしないようにする事で、リファレンスカウンタのような仕組みが必要な点だ。実装は、簡単なのだが、スタティック変数の定義問題がある。現在、ほぼ全ての実装は、ヘッダーのみで行っているので、それを壊したくは無いが、単純にスタティック変数を記述すると、その実態として、ソースコードにも書く必要があり、そうすると、そのソースコードのオブジェクトをリンクしなければならなくなる。そこで、簡単なテンプレート関数を書いて、その中で定義できるようにした。テンプレートにすると、「実態」をヘッダーに書けるので、ソースとヘッダーに分ける必要が無くなる。static_holder<ST>::st;実際の定義では以下のようになっている。STH;この構造体の具体的な操作は、「RX64M/power_cfg.hpp」で行っている。これら関連したコードはGitHubにプッシュ済み。