天天看點

中斷中C函數調用C++

  之前,我們在單片機程式開發時都會面對中斷函數。衆所周知的,這個中斷函數肯定是要用c函數來定義的。我在用c++進行程式開發的時候就發現了一個需要解決了問題:在斷函數中怎麼調用c++的成員函數?

    我的中斷函數定義在檔案 irqhander.c 檔案中,我想在序列槽中斷函數調用 gprinter.putchar(ch) 函數。用于向 gprinter 發送字元列印消息。

   嘗試1:直接将 cdebug.h 檔案包含進來。

   結果,一大堆錯誤。原因在于編譯器以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" {} 進行修飾,讓編譯器不修改函數名。

    結果,ok了。分析如下:

    (1)irqhandler.c檔案重命名為irqhandle.cpp,讓編譯器用c++的方式進行編譯,進而include c++ 的頭檔案不會報錯。

    (2)加 extern "c" 的功能就是告訴編譯器不對根據形參類型重新指令函數名,使之與c函數名一緻。

    是以,要在c函數調用c++的成員函數,就像方案3那麼做。

繼續閱讀