0

割り込みによってトリガーされるメンバー関数、たとえば UART 経由の出力を呼び出す可能性はありますか? 通常、私は TIMER0_COMP vect を使用していたでしょうが、それをオブジェクトで動作させることができないようです。

4

2 に答える 2

2

割り込みベクタが特定のオブジェクトのメンバー関数を指すようにする方法はありません。これは、*thisポインタをISRに直接渡すことができないためです。

割り込みベクトルが特定のクラスのメンバー関数を指すようにすることは可能です。ただし、それがvoidを返し、パラメーターを持たない静的関数である場合に限ります。ただし、これは静的関数であるため、個々のオブジェクトの非静的データメンバーにはアクセスできません。

IARコンパイラとAVRからのタイマー割り込みベクトルの例を次に示します。

class theClass
{
  public:
  ...

  #pragma vector=TCC1_CCA_vect
  __interrupt static void isrTimer1CompareA(void);

  ...
 }

この場合も、このアプローチの制限は、ISRがクラスの静的データにしかアクセスできないことです。

特定のオブジェクトに関連する割り込みを探している場合は、H2C03が推奨するものに沿った何かが必​​要になります。これは、ISRに特定のオブジェクトについて認識させ、ISRでそのオブジェクトのメンバーを呼び出すことです。自体。

于 2013-01-11T16:42:41.907 に答える
2
SomeClass theObject;

// ...

ISR(USART_RX_vect)
{
   theObject.someMethod();
}

これはあなたが探しているものですか?

于 2013-01-11T13:38:20.427 に答える