定时器中断中的ATMega32 C ++对象

时间:2013-01-11 13:34:37

标签: c++ c embedded interrupt avr

是否有可能通过中断触发成员函数(比如UART上的输出)? 通常我会使用TIMER0_COMP vect但我似乎无法使用它来处理对象。

2 个答案:

答案 0 :(得分:2)

SomeClass theObject;

// ...

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

这是你要找的吗?

答案 1 :(得分:2)

没有办法让中断向量指向特定的对象的成员函数。这是因为无法将* this指针直接传递给ISR。

可以让中断向量指向特定的类的成员函数,前提是它是一个返回void并且没有参数的静态函数。但是,由于它是静态函数,因此无法访问任何单个对象的非静态数据成员。

以下是来自AVR的IAR编译器和定时器中断向量的示例:

class theClass
{
  public:
  ...

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

  ...
 }

同样,这种方法的局限性在于ISR只能访问该类的静态数据。

如果您希望将中断与特定对象相关联,那么您需要的内容与H2C03建议的内容类似,即ISR知道特定对象,然后调用该对象的成员在ISR本身。