1. 程式人生 > >中斷中C函式呼叫C++

中斷中C函式呼叫C++

        之前,我們在微控制器程式開發時都會面對中斷函式。眾所周知的,這個中斷函式肯定是要用C函式來定義的。我在用C++進行程式開發的時候就發現了一個需要解決了問題:在斷函式中怎麼呼叫C++的成員函式?

        我的中斷函式定義在檔案 IRQHander.c 檔案中,我想在串列埠中斷函式呼叫 gPrinter.Putchar(ch) 函式。用於向 gPrinter 傳送字元列印訊息。

        嘗試1:直接將 CDebug.h 檔案包含進來。

#include "CDebug.h"

void USART1_IRQHandler()
{
        RxData = USART1->DR;
        gDebug.Printer(RxData);
        ...
}
        結果,一大堆錯誤。原因在於編譯器以C的方試進行編譯,然而C不認得 CDebug.h 檔案中 class 這樣的C++中的關鍵字。

        嘗試2:將 IRQHandle.c 檔案重新命名為 IRQHandle.cpp ,讓其以C++的方式進行編譯。

        結果,編譯沒有問題。一旦觸發了中斷,系統就死在 startup.s 檔案中預設的中斷函式中了。這個預設的中斷函式為找不到使用者定議的中斷處理函式預設指定的。原因在於 IRQHandle.cpp 中 USART1_IRQHandler() 在用C++進行編譯後會根據引數型別對函式名進行修飾,因為C++要實現過載功能。如:

       原定義函式:int  Func ( int , char * )

       C++編譯後:int  Func_i_cp ( int, char* ) 

        嘗試3:加 extern "C" {} 進行修飾,讓編譯器不修改函式名。

#include "CDebug.h"

extern "C" {

void USART1_IRQHandler()
{
        RxData = USART1->DR;
        gDebug.Printer(RxData);
        ...
}
void Other_IRQHandler()
{
  ...  
}
....

}
        結果,OK了。分析如下:
        (1)IRQHandler.c檔案重新命名為IRQHandle.cpp,讓編譯器用C++的方式進行編譯,從而include C++ 的標頭檔案不會報錯。
        (2)加 extern "C" 的功能就是告訴編譯器不對根據形參型別重新命令函式名,使之與C函式名一致。

        所以,要在C函式呼叫C++的成員函式,就像方案3那麼做。