スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

割り込みではまる

今日はカスケード制御ループを多重割り込みで動かす。
はじめは順調だったが,突然謎のリセット発生。しかも発生タイミングがランダムというイヤーなパタン。
この手のバグはLEDデバッグが通用しないため,イマジネーションデバッグで解決するしかない。
しかしイマジネーションが追いつかず,結局トラブルシュートに数時間を要してしまった。

原因はC言語が自動で処理してくれる待避レジスタにあった。
dsPICでは割り込みハンドラを簡易マクロで記述できる(例えば下記のように)。
void _ISRFAST _SPI1Interrupt(void){}

ここで最初のおまじないに_ISRFASTと_ISRがあるのだが,何となくFASTがついていた方が速いのだろうと思って_ISRFASTばかり使っていたのが落とし穴だった。
これはシャドウレジスタを使った高速PUSH&POPを指示するマクロで実は「PUSH&POPネストは1段のみ」の制約があった。(しかもC30コンパイラマニュアルには一言もそのことが書いていない・・・)
よって多重割り込みでネスティングが起きると前段の待避レジスタが上書きされてしまい,リセットトラップが発生してしまうのだ。

今回は運が良かった。ハードウェアマニュアルのCPU動作のところで偶然この記述を見つけなければ,いつまでもコードとにらめっこした可能性もある。
C言語の隠蔽されたライブラリは非常に便利だが,イマジネーションデバッグには不向きだ。
スポンサーサイト

この記事へのコメント

トラックバック

URL :

プロフィール

もやね

Author:もやね
長野県在住の会社員(メカニカル・エンジニア).
ロボットは完全な趣味としてやってます.
E-mail:
mo_ya_ne[a]yahoo.co.jp
[a]⇒@

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
FC2カウンター
ブログ内検索
RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。