Получить указатель на объект класса из статического метода, вызываемого напрямую

У меня есть следующий класс, например в заголовке:

class Uart
{
public:
Uart (int ch, int bd = 9600, bool doinit = false);
......
static void isr (void);
}

Идея в том, что этот класс представляет оборудование USART, так же, как SPI, RTC и т. Д., И я устанавливаю адрес статического члена. ISR в качестве вектора прерывания во время выполнения.
Например, вот так

extern "C"{
void
Uart::isr (void)
{
if ( USART1->SR & USART_SR_RXNE) //receive
{
short c = USART2->DR;
USART1->DR = c;
USART1->SR &= ~USART_SR_RXNE;
;
}
else if ( USART1->SR & USART_SR_TC) //transfer
{
USART1->SR &= ~USART_SR_TC;
}
}
}

И установить его как вектор прерывания, например

_vectors_[USART1_IRQn + IRQ0_EX] = (word) &dbgout.isr;

Поэтому каждый раз, когда эта «обратная» процедура вызывается ЦП, я хочу получить доступ к ее «родительскому» объекту для сохранения и / или манипулирования полученными данными в удобной для пользователя форме.
Это вообще возможно? Может быть, как-то организовать класс или что-то еще.
Архитектура строго 32-битная (ARM, gcc)

0

Решение

Статические методы ничего не знают об объекте.

Вам нужен другой подход:

// Create interrupt handler method (non-static!)
void Uart::inthandler() {
// whatever is needed here
}

// Create object
Uart* p = new Uart(...);

// Create interrupt handler function
void inthandler() {
if (p != NULL) {
p->inthandler();
}
}

// Install the interrupt handler function
InstallIntHandler(IRQ, inthandler);

Это просто принцип, который необходимо адаптировать к вашей конкретной среде.

1

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

Других решений пока нет …