C ISR使用类方法
C++ ISR using class method?
是否可以使用类方法作为中断服务例程?
我使用一个函数在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
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 在静态库中嵌入类方法
- 如何制作一个将函数作为参数的类方法
- 从父类方法返回子类对象
- 使用用户定义的参数调用future/async并调用类方法
- 重载类方法的不明确调用
- 单独定义模板化嵌套类方法的正确语法
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 如何访问由共享指针保存的类方法?
- 将子类方法声明为基类的友元
- 我的模板类方法返回错误类型?
- Qt将信号与另一个类方法连接
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 检查类方法中是否(此 == nullptr)
- 从基类实例调用派生类方法而不进行强制转换
- 函数从唯一代码调用正确的子类方法
- C++ - 如何在不静态的情况下将回调绑定到类方法?
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- C ISR使用类方法