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