ATMega32 C ++ объект в прерывании по таймеру

Есть ли возможность вызвать функцию-член, скажем, выход через UART, которая будет вызвана прерыванием?
Обычно я использовал бы вектор TIMER0_COMP, но я не могу заставить его работать с объектами.

0

Решение

SomeClass theObject;

// ...

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

Это то, что вы ищете?

2

Другие решения

Нет никакого способа, чтобы вектор прерывания указывал на конкретный объекты функция-член. Это связано с тем, что невозможно передать указатель * this на ISR напрямую.

Можно иметь вектор прерывания, указывающий на конкретный класса функция-член, при условии, что это статическая функция, которая возвращает void и не имеет параметров. Тем не менее, поскольку это статическая функция, она не имеет доступа к элементам данных, не являющихся статичными, для отдельных объектов.

Вот пример для компилятора IAR и вектора прерывания таймера от AVR:

class theClass
{
public:
...

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

...
}

Опять же, ограничения этого подхода заключаются в том, что ISR может получить доступ только к статическим данным для класса.

Если вы хотите, чтобы прерывание относилось к определенному объекту, вам нужно что-то в соответствии с рекомендациями H2C03, когда ISR знает о конкретном объекте, а затем вызывает член этого объекта в ISR. сам.

2