首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用类方法的C++ ISR?

使用类方法的C++ ISR?
EN

Stack Overflow用户
提问于 2016-12-16 20:16:18
回答 4查看 6.6K关注 0票数 3

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

我有一个用C编写的ISR,它使用一个函数:

代码语言:javascript
复制
    static void interrupt far ISR(...) {}

我尝试在C++中创建一个方法(原型):

代码语言:javascript
复制
    void interrupt far ISR(...);

然后实现:

代码语言:javascript
复制
    #pragma interrupt
    void interrupt far MyClass::ISR(...) {
    ...
    }

但是当我尝试在‘setvect’中使用它时,我得到了各种各样的错误:

代码语言:javascript
复制
    setvect(muint16Vector, &ISR);

我正在尝试编写一个服务于串行端口的类,ISR将服务于来自该端口的Rx数据。然后,ISR将使用特定于实例的成员。

我有3个串口,所以我想创建3个类的实例。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-12 16:49:31

真正的答案是“不”,在C++中不可能直接使用一个方法作为ISR处理程序。

您必须求助于标准C函数,然后在ISR函数中使用glue引用所需的对象。

它最终成为一个相当混乱的解决方案。

票数 0
EN

Stack Overflow用户

发布于 2016-12-17 19:25:55

使用注释中给出的信息,这是一种可能的解决方案:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-12-16 20:27:11

您只需要创建一个全局变量,它是要调用的实例:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41184234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档