是否可以使用类方法作为中断服务例程?
我有一个用C编写的ISR,它使用一个函数:
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个类的实例。
发布于 2017-01-12 16:49:31
真正的答案是“不”,在C++中不可能直接使用一个方法作为ISR处理程序。
您必须求助于标准C函数,然后在ISR函数中使用glue引用所需的对象。
它最终成为一个相当混乱的解决方案。
发布于 2016-12-17 19:25:55
使用注释中给出的信息,这是一种可能的解决方案:
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);
}发布于 2016-12-16 20:27:11
您只需要创建一个全局变量,它是要调用的实例:
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);https://stackoverflow.com/questions/41184234
复制相似问题