c ++应用程序中的C ISR处理程序

问题描述 投票:0回答:3

我正在为嵌入式系统的C HAL编写C ++应用程序。我需要从外围C处理程序调用一个对象方法,但我有以下问题:

我传递给HAL的外围ISR处理程序具有固定的签名。因此,由于隐含参数,我无法传递C ++对象的公共方法。在处理程序中,我没有对该对象的任何引用。

一种解决方案可能是使这个对象单例具有全局访问权限,但出于任何原因我可能不想要它。

我能做什么?

c++ c embedded isr
3个回答
0
投票

普通的C ++成员函数永远不能成为ISR。它必须是static成员函数。确实,你必须做一些单身设计。但是,没有必要做任何“全球性”的事情。

这不是ISR独有的,但同样适用于任何回调函数。


0
投票

我的第一个想法是有一个可设置的方法指针变量,如果设置了ISR则调用该方法指针。

这是未经测试的未编译代码,但显示了我将如何开始:

void (*Object::Method)() IsrMethod;

// call this to set the method that will be called.  Maybe pass
// in the method pointer of a specific object.
void SetIsrMethod()
{
    IsrMethod= someObject.someMethod;
}

void ISR()
{
    // if the method is valid, call it.
    if( IsrMethod!= null )
    {
        IsrMethod();
    }
}

这也假定对象有效且未删除。


0
投票
Class MyObj
{
public:
    void doIsr()
    {
        // Handle ISR.
    }
    static void HandleIsr()
    {
        MyObj* isrObj = getRelevantObject();  // Whatever object you like to call to.
        isrObj.doIsr();
    }
}

如果要将特定对象注册到isr,可以这样做:

Class MyObj
{
public:
    void doIsr()
    {
        // Handle ISR.
    }
    static void HandleIsr(MyObj* obj)
    {
        obj.doIsr();
    }
}

当您注册到ISR时,您需要将obj作为参数传递。

© www.soinside.com 2019 - 2024. All rights reserved.