我正在为嵌入式系统的C HAL编写C ++应用程序。我需要从外设C处理程序调用一个对象方法,但我遇到了以下问题:
我传递给HAL的外围ISR处理程序有一个固定的签名。因此,由于隐含参数,我无法传递C ++对象的公共方法。在处理程序中,我没有对该对象的任何引用。
一个解决方案可能是让这个对象单例具有全局访问权限,但出于任何原因我可能不想要它。
我该怎么办?
答案 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
作为参数传递。