平成27年11月 2日
汎用の高速シリアル通信機能(17) タイマプログラムの作成(3)
最後はXC32固有の問題について書いていきます。
使用しているXC32のバージョンは1.33です。異なるバージョンでは違う結果になるかもしれません。
1.組み込み関数の幾つかはC++では使用できない
組み込み関数として__builtin_xxxxxという形式の関数がありますが、これらは現時点ではC++に対応していないようです。
コンパイル段階でエラーになります。このため同じ機能の関数を実装する必要があります。
/* インライン関数定義
* 重要
* これらの関数はXC32 Cコンパイラに同等の関数が定義されているが、
* これらはC++言語では使用できない。現時点での使用制限らしい。
* (XC32 Vre1.33)
* (__builtin_disable_interrupts(), __builtin_enable_interrupts())
*/
inline void DI(void)
{
__asm__ volatile ("di");
}
inline void EI(void)
{
__asm__ volatile ("ei");
}
2.割り込み処理関数(ISR)はC言語仕様に限定される
割り込み処理関数を割り込みベクタに設定する機能はC++のマングリングに対応していないようです。必ず「extern "C"」の前置が必要です。
/*-------------------------------------------------------------------
* 割り込み処理関数
* 重要
* extern "C"は必須。これが無いとコンパイルでエラー
*/
extern "C" void __ISR(_TIMER_1_VECTOR, IPL1SOFT) TIMER1_ISR(void)
{
//グローバル変数から必要なデータを取り出す
INT_CB_ARG_t* arg = g_timer1_interrupt;
//CB関数の呼び出し
(*(void (*)(void*))arg->func)(arg->para);
}
これでクラスを使用して割り込み処理機能を駆動できます。
このプログラムリストではcastの形式がC言語のままで良くないとか変数・関数の命名規則が統一できていないとか色々と良くない点が残っています。が、PIC32を使ったC++のサンプルプログラムとしては多少の意味があると思います。まず最初に正しく動くプログラムがあれば、それを足掛かりに変更していくことができます。
このサンプルプログラムの元版を書くに当たり、ネット上でPIC32で動作するC++プログラムを探したのですが見つけることができませんでした。プログラムの断片なら多数見つかるのですが、これも他のマイコン用でPIC32を対象にしたものは見つけることが出来なかったので、動作する形でのソースリストを載せることにしました。