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 退出代码和 atexit()