stlと申します。
お世話になっております。 RA2E1を使用した開発中に、以下のような現象が発生しています。
RA2E1を使用したシステムで、以下のような問題が発生しています。
タイマー出力(GTIOC5AおよびGTIOC8B)を動作させている状態で、LVD(低電圧検出)の割り込みが発生すると、Default_Handler が呼び出されて例外が発生します。
Default_Handler
LVD割り込みでは特別な処理は行っておらず、フラグの設定など軽微な処理のみを行っています。
LVD関連の初期化は事前に実施しており、エラーも返ってきていません。
問題は、LVD割り込み後に続く処理が何も行われていなくても発生します。
この現象はGTIOC5Aのみが動作している場合には発生しないようです。
このことから、GTIOCの動作とLVD割り込みが何らかの形で干渉しているのではないかと考えています。
以下の点についてご教示いただけますでしょうか:
GTIOCの動作とLVD割り込みが競合・干渉する可能性はあるか?
LVD割り込み後に Default_Handler が呼ばれる原因として想定される事項は何か?
その他、設定や初期化の面で注意すべき点があれば教えていただきたい。
ご確認のほど、どうぞよろしくお願いいたします。
> Default_Handler が呼び出されて例外が発生します。Cortex-Mコアを使っていて、何の例外だか分からない時はひとまず Fault Status レジスタを確認してみると良いです。e² studioを使っているならFault Status ビューについてのe² studio ヘルプを参照してください。e2 studio ユーザーガイド > デバッグに関する機能 > ビュー > Fault Status他の開発環境でも似たような表示画面があるかと思います。おおまかに何関係の例外だかは分かるはずです。ある程度絞れたら例外ハンドラを作ってキャプチャーできるか確認するなりしてみてください。Fault Statusレジスタの意味についてはArm系マイコンのWeb記事を探してみてください(レジスタの内容はe² studioかどうかには関係ありません)。
>>例外ハンドラを作ってキャプチャーできるか確認
「例外ハンドラを作る」とはどういう意味でしょうか? また、「キャプチャー」とは具体的にどのような処理を意味していますか?
Default_Handlerではないハンドラを参考にして、自分で書けば良いと思います。
もうちょっと説明します。e² studioで作ったFSPプロジェクトだとstartup.cにvector tableが書いてあります。じっくり眺めてください。例えば MemManage_Handler がweak attributeで宣言されているので、ユーザがMemManage_Handlerの関数を実装しなければDefault_Handlerがリンクされるようになっています。例外に当たりを付けたらそれに対応する関数名でハンドラ(無限ループするだけの関数等)を作ってやり、問題が起きた時にその関数に飛んで来れば割り込み要因が判明します。それをキャプチャーすると言っています。
Cortex-Mコアの例外の仕組みについてはここで聞くよりWebの記事を検索した方が良いです。知っておいても無駄ではないと思います。