2011-09-15 94 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)? 您的代碼爲我編譯。