• 締切済み

SH2マイコンで、強制割り込みが解除できない

仕事で、SH7149を使用し、HewのVer4.5を利用してとあるプログラムを組んでいます。 ソフト注入、デバッグはAone社のAHデバッガー、AH7000です。 現象は、とある変数をコメントアウトすると強制割り込みが掛かり、ソフトがそこで止まってしまうというものです。 最初、膨大な量のデータをストックしておく必要があり、グローバル変数に「A[200][10][10]、B[200][10][10]」という変数を宣言しました。 が、グローバル領域に宣言すると容量が足らず、仕方なくMain関数内に一時保管させようという考えで上記変数を宣言し、グローバル宣言した配列は削除しました。 その後、プログラムを作成していく上で、上記配列を使用しなくてもよくなり、コメントアウトしてコンパイルをかけ、コンパイルは成功しました。 その後ソフトを注入し、デバッグをしようと思ったのですが強制割り込みでソフトが全く動かなくなってしまったのです。 試しにコメントアウトを元に戻すと、ソフトはこちらの思ったように動くようになりました。 どなたかこのような現象をご存じではないでしょうか? よろしくお願いします。

みんなの回答

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

もっとも考えられるのは、その使われていない変数のアドレス付近にある別の(使われている変数)で、不正アクセス(あるいはバッファオーバフロー)が起きているてことだと思います。 たとえば、 int array[2]; // 使われている変数 int A[200][10][10]; // 使われていない変数。だけど、消すとなぜか誤動作する。 int usedData; // 使われている変数 int main() {  usedData = 1; // usedDataを1にセット!  array[2] = 0; // 不正な書き込み、ホントはarray[2]は存在しない  if (usedData == 1) {   // 正常ならこっちにくるはず  } else {   // int A[200][10][10];をコメントアウトするとなぜかこっちに…  } } てな状況なんでしょう。 使われていない、int A[200][10][10]; が残っていれば、array[2] = 0 という不正な書き込みがあっても、usedDataは(たまたま)破壊されませんが、 int A[200][10][10]; をコメントアウトすると、array[2] = 0; でusedDataが破壊されてしまって誤動作するようになります。 デバッガが使えるなら、使っていないはずの int A[200][10][10]; を誰かが(意図せずに)読み書きしていないかを確かめましょう。Aにウォッチポイントをしかけておけばいいです。 ウォッチポイントを使えない場合には、 int A[200][10][10]; のサイズを、ちょっとずつ小さくしていって、どこまで削ると誤動作するかを調べて、まずは、どのアドレスに不正アクセスがあるか目星をつけるのから始めるのがいいと思います。

  • kadusaya
  • ベストアンサー率53% (8/15)
回答No.1

ご質問の状況に該当するか否かはワカリマセンが、思いついたコトを・・・。 たぶん、その変数の領域を勝手に使い込んでいる関数かサブルーチンがあるハズです。 例えば配列型の変数で、本当に必要な分だけの宣言がされていないとか。 ポインタ型の変数で、キチンと初期化されていないとか。 変数がある間は、その変数の内容が破壊されているのに、見た目は正常に動いています。たぶん、使われていない時に破壊されているかな。 変数をコメントアウトすることで、他の変数を破壊するようになって、結果として強制割り込みが発生しているのでしょう。 デバッガーで変数の値の変化を追っかけてみるか、周辺の変数を辿っていけばバグが見つかると思いますよ。

aoyana2
質問者

お礼

回答ありがとうございます。 うーん、本当に宣言しているだけでまったく使用していないものでした。 でもほかの変数を破壊というのは、なんとなくデバッグ中にあった現象と似ている気がしています。(ローカル変数の値が勝手に書き変わっていたことがあり) この土日、そこを重点に見てみたいと思います。

関連するQ&A