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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c ++应用程序中的C ISR处理程序相关的知识,希望对你有一定的参考价值。

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

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

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

我能做什么?

答案

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

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

另一答案

我的第一个想法是有一个可设置的方法指针变量,如果设置了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();
    }
}

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

另一答案
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作为参数传递。

以上是关于c ++应用程序中的C ISR处理程序的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的“宏”是指啥?

实时/非批处理应用程序中的 C 退出代码和 atexit()

C/C++中的预编译指令

从 C#.NET 应用程序调用 MS Access 中的 VBA 代码

C++ 中的高效消息工厂和处理程序

字符串处理算法最长连续字符及其出现次数的算法设计及C代码实现