прерывание — C ++ ISR с использованием метода класса?

Можно ли использовать метод класса в качестве программы обработки прерываний?

У меня есть ISR написано и работает на C, используя функцию:

    static void interrupt far ISR(...) {}

Я пытался в C ++ создать метод (прототип):

    void interrupt far ISR(...);

Тогда реализация:

    #pragma interrupt
void interrupt far MyClass::ISR(...) {
...
}

Но я получаю всевозможные ошибки, когда пытаюсь использовать это с setvect:

    setvect(muint16Vector, &ISR);

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

У меня есть 3 последовательных порта, поэтому я хотел бы создать 3 экземпляра класса.

1

Решение

С информацией, приведенной в комментариях, это возможное решение:

class SerialPort
{
public:
// Unrelated functions...

void isr();  // The serial interrupt handler

// Other unrelated stuff...
};

std::array<SerialPort, 3> serial_ports;  // Or SerialPort serial_ports[3];

static void serial_isr(int const port_index)
{
// Common code for all serial ports that for some reason
// can't be in the class...

serial_ports[port_index].isr();  // Call actual ISR
}

extern "C" void interrupt serial_isr_1()
{
// Special code for only this serial port...

serial_isr(0);
}

extern "C" void interrupt serial_isr_2()
{
// Special code for only this serial port...

serial_isr(1);
}

extern "C" void interrupt serial_isr_3()
{
// Special code for only this serial port...

serial_isr(2);
}
1

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

Вам просто нужно создать глобальную переменную, которая является экземпляром для вызова:

class Handler {
void ISR(...) {}
};

static unique_ptr<Handler> g_handler;

#pragma interrupt
extern "C" static void interrupt far ISR(...) {
if (g_handler)
g_handler->ISR(...);
}

g_handler = std::make_unique<Handler>();
setvect(muint16Vector, &ISR);
0

Реальный ответ — «Нет», в C ++ невозможно напрямую использовать метод в качестве обработчика ISR.

Вы должны прибегнуть к стандартным функциям C, а затем с помощью клея в функции ISR ссылаться на требуемый объект.

В итоге получается довольно грязное решение.

0

Есть старая статья доктора Доббса, которая хорошо это освещает, вместе с хорошим объяснением проблем: Реализация процедур обработки прерываний в C ++

0
По вопросам рекламы [email protected]