2011-09-15 60 views
5

我很久没有编写C++代码;但是现在我必须在德克萨斯仪器公司的F28335 DSP上工作,我正试图从C迁移到C++。 我有以下的代码,试图用类的静态方法来初始化中断服务程序:C++强制转换指向静态方法的指针

//type definition for the interrupt service routine 
typedef interrupt void (*PINT)(void); 
//EPWMManager.h 
class EPWMManager 
{ 
public: 
    EPWMManager();  
    static interrupt void Epwm1InterruptHandler(void); 
}; 
//EPWMManager.cpp 
interrupt void EPWMManager::Epwm1InterruptHandler(void) 
{ 
//some code to be called on interruption 
} 
//main.cpp 
int main(void) 
{ 
    PINT p; 
    p = &(EPWMManager::Epwm1InterruptHandler); 
    return 0; 
} 

编译时,我得到以下几点:

error: a value of type "void (*)()" cannot be assigned to an entity of type "PINT"

我猜我失踪一些演员。

+1

“中断”关键字不是C++的一部分。它必须是特定于您的实施的扩展。如果将它从'PINT'和'Epwm1InterruptHandler'的定义中移除,会发生什么?你还有错误吗? –

+0

根据我的经验,即使对于C语言来说,DSP编译器的TI编译器质量也不是很好(例如,我们在页面处理的边界情况下在代码生成器的错误中反弹了不止一次)。你确定迁移到像C++这样复杂得多的语言是一个好主意吗? – 6502

+0

如果我把'中断'出来的错误出来......但我不确定它的影响。因为我们的C代码看起来非常混乱,我以为迁移到C++会是一个好主意,以便让所有东西都更加结构化(类,对象,设计模式等)。 – TropE

回答

2

我认为最根本的问题在于,将&的前缀RHS指派给p。另外,在其他操作系统中,“PINT”是“指向整数的指针”。所以让我们避免任何潜在的名称冲突。但我认为这将适用于您:

// you may have to move "interrupt" keyword to the left of the "void" declaration. Or just remove it. 
typedef void (interrupt *FN_INTERRUPT_HANDLER)(void); 

interrupt void EPWMManager::Epwm1InterruptHandler(void) 
{ 
//some code to be called on interruption 
} 

int main(void) 
{ 
    FN_INTERRUPT_HANDLER p; 
    p = EPWMManager::Epwm1InterruptHandler; // no ampersand 

    // and if for whatever reason you wanted to invoke your function, you could just do this: 

    p(); // this will invoke your function. 

    return 0; 
} 
+0

你说得对。提供的代码工作得很好。在仔细观察我的代码后,我发现typedef被声明为外部C,使得它与C++代码不兼容。我删除了它,现在它可以工作。谢谢。 – TropE

0

我觉得你有几个不相关的语法错误在这里:我明白你的Epwm1InterruptHandler应该返回一个指针类型的中断功能,那么首先从行中删除无效

static interrupt void Epwm1InterruptHandler(void); 

static interrupt void Epwm1InterruptHandler(void); 

然后进行中断类型p,然后把括号内是这样的:

interrupt p; 
p = &(EPWMManager::Epwm1InterruptHandler()); 
+0

该函数* IS *是中断处理程序,不是返回指向中断处理程序的指针。 – 6502

0

你不错过一个; typedef中断后void(* PINT)(void)? 您的代码为我编译。