初めて自分の家と他人の家が違う、と意識した時

デバッグについて質問です。
何もしない空のメインループで下記割り込みが発生したときのみ
処理を行うシステムがあるとします。
・タイマ割り込み(以下、TMINTとしてCALLされる関数をfuncTM())x1 → 1ms毎
・外部割り込み(以下、OUTINTとしてCALLされる関数をfuncOUT())x1 →ディップスイッチによる手動で押下時
※プライオリティはOUTINT>TMINTとします。
※使用するICEはMr.ICE
このときプライオリティを確かめるデバッグの方法として下記のようなことを考えています。

・TMINT中に手動でOUTINTが発生させることが困難なため、連続で何度も押し続ける。
・ICEの設定としては、funcTM()→funcOUT()2点間通過指定でブレイクイベント
・ただし、これだけではTIMINT通過後にOUTINT発生でもイベント成立してしまう。

こういうケースのデバッグは不可能なんでしょうか?
ICEの種類問わず、こういうデバッグのノウハウをご教授願います。

A 回答 (3件)

もう一つ追加です。


おおざっぱなチェックであり、なおかつ、同じ割り込みが多重に発生しない時に、簡易的にチェックする方法です。

チェックが必要な割り込みをすべて無限ループにしてしまいます。
タイマ割り込みなどで同種の割り込みが多重に発生する場合には、割り込み処理の入り口で、割り込み禁止にした状態で、無限ループにします。

この状態では、割り込みが発生すると、割り込み処理から抜けることはありませんから、プライオリティの順に、あるいは、逆順に、あるいは、任意の手順で割り込みを発生させます。
すでにプライオリティの高い(はずの)割り込みが発生していれば、それよりプライオリティの低い割り込みは発生しませんし、高い割り込みは発生します。

ただ、タイマ割り込みのように、割り込みが、外部からコントロールできない場合には、工夫が必要ですし、各割り込みの中で無限ループを作るので、プライオリティのチェックくらいしかデバッグできない状況になりますが。
    • good
    • 0
この回答へのお礼

AsanoNagi様>

 アドバイスありがとうございます。
 一番最後の方法をやってみようと思います。
 イメージ的には、プライオリティの順に次々へ入っていく感じですね。

お礼日時:2008/01/31 22:42

間接的な方法も併せていくつか方法があります。


実際にできるかどうかは、ICE にもよりますが。

1.準備
  可能であれば、タイマ割り込みの処理時間を(わざと)長くします。
  1ms ごとの割り込みであれば、タイマ割り込みにかかる処理を、990μsくらいにするとか。
  これで、実行時間のほとんどの間タイマ割り込みの処理がなされていることになります。
  この状態であれば、スイッチを操作した瞬間が、タイマ割り込みの処理中である確率がかなり高くなります。(故に、タイマ割り込みの処理中に、スイッチの割り込みが発生しする可能性がかなり高くなります)

方法1)外部出力信号を使う。
  2つの出力ポートがデバッグ用に使用可能であれば、それぞれ、funcTime() の入り口で、High, 出口で Low()。もう一つは、funcOut() の出入り口で同じように設定します。
  オシロスコープで信号を確認して、条件が成立しているかどうかをチェックします。オシロスコープの、トリガ条件(一方が High の間に、他方の立ち上がりでトリガ など)が使用できれば、オシロスコープを動かしたまま、スイッチ操作をすれば、(動作していれば)そのうち捕まるでしょう。

方法2)変数のウォッチ機能を使う
  上記の出力ポートを変数で置き換えたものです。
  ひとつの変数の1ビットずつをそれぞれの関数の出入り口に割り当てます。
  ICE の変数ウォッチ機能で、両方のビットが立ったところで、ブレークをかけます。
  ただお、この方法は、プライオリティの設定が逆になっていてもわかりませんので、この点注意(オシロを使えば、波形の状態から順序はわかるでしょう)

方法3)スタックを確認する。
  funcOUT() の入り口でブレークをかけます。
  このときに、スタックに積まれている「戻り番地」が、funcTM() にあれば、funcTM() の中から処理が写ったことが確認できます。
  ICE のバックトレース機能があれば、これを使えば、どこから飛び込んできたかわかります。
  他の箇所から飛び込んだときに、NGとは断言できない点に注意してください。

以上のいずれか(または併用)でチェックした後、念のため、プライオリティの指定を逆にして、「プライオリティを逆にすると確かにNG」というのを確認しておいてください。
    • good
    • 0

多重割り込みプライオリティのデバッグなどできません。


私が以前行った多重割り込みでは、割り込みコントローラの設定が正しく設定されているか否かで判断しました。この場合、ディップスイッチが手動で動きますので、タイミングを取るのは殆ど不可能です。(1)机上で割り込みコントローラの設定が正しく設定されているか否かで判断します。(2)そして、多重割り込みを信号をoutさせた上、オシロスコープで最終確認しました。ソフトウエアは机上で確認、その上でオシロスコープで動作確認します。ハードウエア側からのみ動作確認できます。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
今回の例は割り込み2種類ですが、現在開発中のものは6系統くらいの割り込みがあり、内プライオリティは4種類になります。
どのみちより複雑になってしまいますので、机上確認しか無理のようですね。


>多重割り込みを信号をoutさせた上
この部分ですが、も少し深く教えていただけたら幸いです。

お礼日時:2008/01/28 22:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報