Можно ли использовать метод класса в качестве программы обработки прерываний?
У меня есть 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 экземпляра класса.
С информацией, приведенной в комментариях, это возможное решение:
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);
}
Вам просто нужно создать глобальную переменную, которая является экземпляром для вызова:
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);
Реальный ответ — «Нет», в C ++ невозможно напрямую использовать метод в качестве обработчика ISR.
Вы должны прибегнуть к стандартным функциям C, а затем с помощью клея в функции ISR ссылаться на требуемый объект.
В итоге получается довольно грязное решение.
Есть старая статья доктора Доббса, которая хорошо это освещает, вместе с хорошим объяснением проблем: Реализация процедур обработки прерываний в C ++