STM32 のハードウェア タイマーを使用して、多数の光学式エンコーダと接続しています。ハードウェア タイマーとやり取りするための便利なインターフェイスを提供する、テンプレート化されたクラスを作成したいと考えています。タイマー レジスタはメモリ マップされており、そのアドレスは、デバイスのデータシートと一致するメーカー提供のヘッダーで定義されています。テンプレート パラメータは、事実上、タイマー ペリフェラルのベース メモリ アドレスになります。以下は、私が現在やろうとしていることの最小限の実例です。
#include <cstdint>
// Effectively supplied by chip manufacturer headers
struct timer_peripheral {
volatile uint32_t count;
// ... lots of other registers ...
};
// Also supplied by chip manufacturer headers
#define TIM1 ((timer_peripheral *) 0x40000000)
#define TIM2 ((timer_peripheral *) 0x40000400)
// My templated class
template <timer_peripheral * Timer>
class OpticalEncoderCounter {
OpticalEncoderCounter();
};
template <timer_peripheral * Timer>
OpticalEncoderCounter<Timer>::OpticalEncoderCounter()
{
}
int main()
{
// option 1
OpticalEncoderCounter<TIM1> encoder0;
// option 2
timer_peripheral * t = TIM2;
OpticalEncoderCounter<t> encoder1;
}
ただし、コンパイルすると、g++-4.7.2 -std=c++11 で次のエラーが発生します。
エラー| テンプレート引数 '1073742848u' を 'timer_peripheral*' に変換できませんでした</p>
エラー| 「t」は変数のアドレスではなく変数であるため、「t」は有効なテンプレート引数ではありません
非型テンプレート パラメーターについて読んだ後でも、問題を解決する方法と、自分が考えている方法でテンプレートを使用できるかどうかはまだわかりません。オプション 1 で static_cast と reinterpret_cast を試しましたが、違いはないようです。