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

时间:2018-03-02 10:23:43

标签: c++ c embedded isr

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

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

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

我该怎么办?

3 个答案:

答案 0 :(得分:0)

普通的C ++成员函数永远不能成为ISR。它必须是 $scope.clearLogin = function () { delete $window.sessionStorage; $window.localStorage.clear(); $window.location.href = 'index.html'; }; 成员函数。确实,你必须做一些单身设计。但是,没有必要做任何“全球性”的事情。

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

答案 1 :(得分: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();
    }
}

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

答案 2 :(得分: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作为参数传递。