• 締切済み

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

  • MFCで作成したプログラムが起動しない(起動した瞬間に終了してしまう?)

    VC++6.0,MFCのダイアログベースでプログラムを作成しています. コンパイル,ビルドとも特にエラー,警告なく行えるのですが,なぜかプログラムが起動しません. メンバ変数をコメントアウトしたり,グローバルで宣言したりするとうまくいったりします. いったい,このような現象の原因としてどのようなことが考えられるのでしょうか.困っております. よろしくお願いします.

  • JavaScriptでVBのOption Explicitのように変数の明示的な宣言を強制することは不可能?

    たぶんできないのだとは思いますが、ダメ元で質問です。 JavaScriptでVBのOption Explicitステートメントのように、変数の明示的な宣言を強制することはできないのでしょうか? 調べた限りでは、なさそうですが、将来的に言語使仕様が変わる云々の可能性も含めてコメント頂けると幸いです。 できないとすると、変数のタイプミスによるバグの発見が大変だと思いますが、皆さんはどのように工夫してデバッグされていますか?

  • PHPでは、あんま大きなプログラムは作れないの?

    PHPでは、あんま大きなプログラムは作れないの? だって、変数の宣言が必要ないから。 変数の宣言が必要ない、ってことは、 おかしな変数があっても、コンパイラーが 事前にチェックできないってことだし。 つまりそれって、デバッグが難しくなるってことでしょう? だから、 「デバッグがめんどくなってきたな、、、」 と感じたら、それは、そろそろJavaとかに 移行しろ、っていう、神からのメッセージでしょ? 変数を使うにあたって、あらかじめ、 宣言が必要な言語であれば、 宣言の無い変数が登場した段階でエラーではじくし、 デバッグも容易になるよね。 つまりそれって、プログラムが大規模になってきたら、 そういう厳密系な言語にシフトしたほうが ストレスがたまらなくっていいってことでしょう?

    • ベストアンサー
    • PHP
  • 配列と他の変数のメモリ領域重複の問題について質問

    dsPICで配列を使用する際、他の変数もその配列の存在するメモリ領域に配置されてしまいます。 プログラムにはC言語を用いています。環境は「MPLAB C30 v3.31」、「MPLAB LINK30 v3.31」「MPLAB v8.85」です。 状況としてはunsigned char型で要素数320の配列をグローバル宣言します。そしてmain関数やその他の関数内でローカル変数を宣言するとその変数が配列の中に存在することになってしまうというものです。色々試したところ、そのローカル変数をstaticで宣言するとそのような症状は出なくなりました。 この現象には、初期化をする関数内でカウンタとしてローカル変数を宣言し、for文で配列を0でクリアさせようとしたところ、MPLABSIMでデバッグすると永久ループしたことから気づきました。Watchを用いて確認したところ配列の中にそのカウンタ変数が配置されていたため最終的に自分自身を0でクリアしてしまうことで永久ループしてしまうことがわかりました。 なぜこうなるのかよくわかりません。この配列以外にはおおきな領域を必要とする変数は宣言していませんのでData memoryの容量的な問題ではないと思っています。staticで宣言すれば何とかなりますが、これでは無駄なメモリを消費してしまいます。また、絶対アドレス指定をする方法もありますが、「ignoring address attribute applied to automatic 変数名」というwarningがでて結局出来ませんでした。 。 このような現象を起こさせない様にするため,、確実にメモリを確保するためにはどうすればよいのでしょうか。 この問題のために先に進めず、大変困っております。どうかご教授ください。 もう一つ、変数の生存期間について質問なのですが、ある関数内で宣言したローカル変数をカウンタとして使い、指定の回数だけ他の関数を繰り返し実行する場合、他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。重ねてお願いします。 不足がございましたら補足しますのでお教え下さい。

  • なぜ警告表示?

    VS2005でコンパイルすると、 変数 \'******\' は割り当てられていますが、その値が使用されていません。 という警告が表示されます。 しかし、その値はあとのコードでも割り当てられてるし、 宣言をコメントアウトしたらもちろんエラーとなります。 なぜ警告が表示されるのでしょうか? 例: int intPlan = 0 ;←警告 if(a == 1) {  intPlan = 1 ; }

  • FORTRANのCOMMON文

    COMMON文について教えてください。 本を見ると R(2,2)という配列を共有したいとき R(2,2)を主プログラムで定義しているとき 主プログラムとR(2,2)を使うサブルーチンの 両方でCOMMON文を書く必要がある。 というような内容でした。 そこで配列を宣言して両方にCOMMON文を書くとエラーが出ます。そこで配列宣言を消去するとエラーがなくなります。COMMON文を使うときは配列(変数)を宣言する必要はないのですか?(暗黙の型宣言は使わない場合を考えています。) またCOMMON文では変数の型宣言をするとエラーが出るし暗黙の型宣言に従って使うと変数には意味を付けて使っているので都合が悪いときもあります。 倍精度で変数を使いたい時とかにも困りますし。 COMMON文で自由な型で変数を使うにはどうしたらいいのでしょうか? 教えてください。お願いします。

  • 共用体の配列 [C言語]

    今C言語のプログラムを組んでいたのですが、共用体の配列あるわけないと思いつつ共用体の配列を宣言したソースをコンパイルして見ました。そしたら普通にコンパイルできてしまったんです。びっくりしてその配列に値を代入したのですが、それはコンパイルエラーが出ました。共用体の配列なんてあるのでしょうか?回答よろしくお願いします。

  • #ifdef _DEBUGが効かない

    こんにちは。 Win2000、VC++6.0使用。 今までC言語でプログラムを組んではいましたが、 #define _DEBUG #ifdef _DEBUG print(...); #endif というようにデバッグ用のコードを入れたことはありませんでした。 このような便利なものがあると知り、早速使ってみたのですが、 #define _DEBUG の一文をコメントアウトして、再コンパイル(リビルド) して実行してみたのですが、 普通に #ifdef _DEBUG #endif で囲まれた部分が実行されてしまいます。 #define _DEBUG を宣言しなければ、実行されないと思っていたのですが 自分の勘違いでしょうか? よくわかりません。 どなたかご存知の方、よろしくお願いします。

  • VBAはコンパイルされる?

    初心者です。基本的なことを教えていただきたいです。 アドインのプログラムを書く際に、コメントやデバッグ用の記述など余分なものはアドインを読み込む際に文字として読み込まれ、その都度コンパイルされるのでしょうか? それともコンパイルされたものが読み込まれるのでしょうか?

  • Delphiの変数について

    Delphiでプログラムを作成しています。 現状はとりあえずうまく動作しているようですが、グローバル変数、ローカル変数、クラス内のpublic、private内の変数?とかの宣言が整理できていません。 ほとんどがローカル変数とグローバル変数として宣言してしまっています。 今、整理している最中ですが、変数の宣言の場所を移動しても、コンパイルでエラーが出なければ、OKと考えてもいいのでしょうか? (動作中にエラーがでることはないと考えていいものでしょうか?)

このQ&Aのポイント
  • 紙が中に詰まってしまった場合、EPSON社製品の紙詰まりを解消する方法をご紹介します。
  • 紙が中に詰まってしまった場合、簡単な方法でEPSON社製品の紙詰まりを解消することができます。
  • 紙が中に詰まってしまった場合、EPSON社製品の紙詰まりを解消するための手順をご説明します。
回答を見る

専門家に質問してみよう