R_MAIN_UserInitが何度も呼び出されてしまう。

以下の考えられる原因について教えてください。E1エミュレータとターゲットボードをつなげてデバッグ実行しているのですが、初期化関数のR_MAIN_UserInit()が実行中に何度も呼び出されてしまいます。メインループや割り込みの中に初期化関数R_MAIN_UserInitを実行する記述は全く書いておらず、メインループに入る前に一行だけ記述しております。ただ割り込み関数実行中に初期化関数が実行されているような気がします。

Parents
  • チョコです。

    もしかしたら、ウォッチドッグ・タイマが悪さをしているのではないでしょうか。

    そうなら、コード生成では、ディフォルトでウォッチドッグ・タイマはオンになっています。コード生成のウォッチドッグ・タイマを停止するように設定を変更してみてください。

    以上

  • チョコです。

    言葉足らずで、申し訳ありません。

    このような状況の原因としては、リセットが発生してことが考えられます。

    リセットが発生する原因として、よくあったのが、ウォッチドッグ・タイマのオーバーフローでのリセットです。

    コード生成で指定するほとんどの機能は未使用のものを使用する方向で設定するものです。ところが、ウォッチドッグ・タイマだけは、ディフォルト状態で動作するようになっています。このために、使用者が使っているとの意識がないまま動作してしまい、リセットがかかることになります。

    これ以外では、割り込み処理で、(割り込みプログラムが書かれていないところに分岐して)不正命令コード(0xFF)の実行によるリセットも考えられます。

    以上

  • リプありがとうございます。
    割り込み処理の不正命令コードについて詳しく教えていただくことはできますでしょうか?

  • 割り込み処理内でポートに値を代入しているのですがこれはまずいでしょうか?

  • チョコです。

    >不正命令コードについて詳しく教えていただくことはできますでしょうか?

    不正命令コード(0xFF)はコード・フラッシュメモリの初期値と同じ状態です。通常の処理の中では、命令が書かれていないところに分岐したりすることは考えられ難いです。割り込みの場合には、割り込み処理が書かれていない状態で、割り込みを受け付けてしまうと、命令が書かれていないメモリから命令を読み出し(当然、値は0xFF)不正命令コードでのリセットに繋がるというものです。

    (C記述では、このような割り込みがらみが考えられますが、アセンブラ記述ではもっと暴走しやすくなります。)

    以上

  • リプありがとうございます。
    割り込み処理には何かしらの処理を書かないと、0xFFを読みだしてしまい、不正命令コードでリセットにつながってしまうということでしょうか?

  • チョコです。

    >割り込み処理内でポートに値を代入しているのですがこれはまずいでしょうか?

    いいえ、それ自体は普通に行われる処理です。そのことが問題になることは考えにくいです。

    以上

  • チョコです。

    >割り込み処理には何かしらの処理を書かないと、0xFFを読みだしてしまい、不正命令コードでリセットにつながってしまうということでしょうか?

    はい、そうです。プログラムが暴走する典型的なパターンの一つです。これで悪さをしないように不正命令でリセットするようになっています。

    以上

  • リプありがとうございます。
    初期化関数で使っていない割り込み処理(AD変換)などを開始していて、それを無効にしたらリセットがかからなくなりました。解決いたしました。今回は、丁寧に対応いただきありがとうございます。

Reply
  • リプありがとうございます。
    初期化関数で使っていない割り込み処理(AD変換)などを開始していて、それを無効にしたらリセットがかからなくなりました。解決いたしました。今回は、丁寧に対応いただきありがとうございます。

Children
No Data