2017-07-20 15 views
1

C++をマイコン(MSP432)プロジェクトの主なプログラミング言語にしたいと思います。MSP432 DriverLib'c CコードでC++ ISRを書くには?

割り込みサービスルーチンを含まない単純なスクリプトを書いたISR)。彼らはすべてうまくいった。コードは次のようになっていました:

私はUART通信(シリアルPCインターフェイス)のような簡単なISRを持つようにコードをアップグレードしたかったのです。だから私はこれをした:

/* MSP and DriverLib includes */ 
/* no <<extern "C">> needed due to the header files implement it. */ 
#include <ti/devices/msp432p4xx/driverlib/driverlib.h> 

int main() 
{ 
    /* Some C++ code here that worked fine. */ 
} 

void EUSCIA0_IRQHandler(void) 
{ 
    /* Some C++ code here that worked fine. */ 
} 

このコードの問題は、ISRがトリガーされないということです。代わりに、DriverLibのデフォルトのISRが呼び出されます。私は疑問に思って自分自身を掘り起こそうとしました。

ある時点で、偶発的にextern "C"をソースコードのC++部分で定義されたISRの周りに置いてください。そして、それが働いた:

/* MSP and DriverLib includes */ 
/* no <<extern "C">> needed due to the header files implement it. */ 
#include <ti/devices/msp432p4xx/driverlib/driverlib.h> 

int main() 
{ 
    /* Some C++ code here that worked fine. */ 
} 

extern "C" 
{ 

    void EUSCIA0_IRQHandler(void) 
    { 
     /* Only C code here works fine. */ 
    } 

} 

を私は「I」(DRIVERLIB)はC(ないC++)でISRベクトルとextern ISR署名を登録するので仮定し、ソースコードの一部、私のC++ ISRは、外のいくつかの種類でありますISR署名の範囲。

1)私は正しいですか?

しかし、キャッチがあります。私はに移動しました。私のC++ ISRはC になりました。私はC++コードを使用することができません。 ISR内ではもはやクラスなどがありません。

2)DriverLibのISR初期化(例:startup_msp432p401r_ccs.c)に触れずに、ソースコードのC++部分でISR内にC++を保持する方法はありますか?

  • C++ものがC++03
  • Cのものであるドライバー・ライブラリーは、静的(すなわち.a)である場合C89
+2

オブジェクトコードの実際の関数名がソースコードのものと異なる*ため、ISRが関数を検出しません:https://en.wikipedia.org/wiki/Name_mangling#C.2B.2B 'extern" C "'でC++名のマングリングは適用されません。 – kfx

答えて

1

で、あなたが行うことができます:

extern "C" void EUSCIA0_IRQHandler(void) 
{ 
    // whatever ... 
} 

これは交換する必要がありますあなたとの標準機能[nmなどで確認できます]。そして、ドライバライブラリがISR関数を登録するときに、内部関数の代わりにあなたのものをキャッチする必要があります。

この関数からc++コードを呼び出すことができると思います。


ない場合は、必要があるかもしれません:

void cplus_plus_handler(void) 
{ 
    // whatever ... 
} 

extern "C" void EUSCIA0_IRQHandler(void) 
{ 
    cplus_plus_handler(); 
} 

であるように、これはおそらく動作します。しかし、cplus_plus_handlerは別ファイル.cppにある必要があります[.cのCハンドラを使用]。


ライブラリが動的(すなわち.so.dll)であれば、あなたのISR機能を添付する登録機能を呼び出す必要があります。

関連する問題