C ISR使用类方法

C++ ISR using class method?

本文关键字:类方法 ISR      更新时间:2023-10-16

是否可以使用类方法作为中断服务例程?

我使用一个函数在C中写入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);

真正的答案是'no',在C 中不可能直接将方法用作ISR处理程序。

您必须诉诸标准C函数,然后在ISR函数中使用胶水,引用所需的对象。

最终是一个凌乱的解决方案。

有一篇古老的Dobbs博士文章涵盖了这一点,以及对所涉及的问题的很好的解释:在C

中实施中断服务例程