RL78/l1Aでマイコンリセットしてしまいます

R5F107AEで意図しないタイミングでソフトリセットが発生します。
RESFレジスタによりリセット要因を調査すると、「WDT」や「パリティエラー」や「不正命令」など、
色々な要因でリセットしていますが、「不正メモリアクセス」でリセットすることが多いです。
・PCとUART通信を1sec毎に行っていて、リセット発生頻度は連続通電で1日に1回程度です。
・リセットタイミングは、送信転送完了割り込み処理を終了し次の1バイトを送信時にリセットしています。
・CS+のスタックメモリ見積ツールを使用し、スタック領域破壊は無いことを確認しました。
・リンクディレクティブファイルに問題ないことはメーカーに確認しました。
・今のところE2Liteを接続してのオンチップデバッグではリセットしていません。
・EEPROMエミュレーション・ライブラリPack01 パッケージVer2.1.0を使用しています。

コードとコード生成ツールを確認した限りでは変な割り込みはなさそうですが(再度調査します)
何かマイコンリセットしてしまう要因は何か考えられますでしょうか。アドバイスいただけたらと思います。

Parents
  • 詳しくコメントいただきありがとうございます!

    コードを確認しつつ、とりあえず最適化無しにして駆動させてみたところそれ以来1度もリセットが発生しておらず、このまま終わらせていいのか悩んでいたところです。

    アドバイスいただいた点も確認していこうと思います。

  • 現状のプログラム、最適化をオンにしてまだ問題が起こる場合、自動変数(静的確保じゃなくてスタックフレームに存在する変数)の参照関係が最適化で本来必要なタイミングより前に解放されてしまってるようなこともあるかもしれません。

    SH2のコンパイラではそういうのが結構起こってました。その時の経験からポインタ渡しの関数には要注意だなと感じました。おそらく、ルネサス純正コンパイラには似たような最適化の手法が使われていると思います。volatile指定してもダメだったり・・・場合によっては(void)を使って明示的に参照範囲をコンパイラに教えてやるのがいいです。

    int x = 12345;

    func(&x);

    (void)x;

    こうすると(void)x;のところまでxは有効です。値渡しなら関数funcは正しく値を受け取れますが、ポインタ渡しだと(void)x;を書かないでおくと最適化でxのポインタ値をfuncに渡してスタックフレームからxが解放されてfunc関数の中でxの値が参照できなくなるということです。

Reply
  • 現状のプログラム、最適化をオンにしてまだ問題が起こる場合、自動変数(静的確保じゃなくてスタックフレームに存在する変数)の参照関係が最適化で本来必要なタイミングより前に解放されてしまってるようなこともあるかもしれません。

    SH2のコンパイラではそういうのが結構起こってました。その時の経験からポインタ渡しの関数には要注意だなと感じました。おそらく、ルネサス純正コンパイラには似たような最適化の手法が使われていると思います。volatile指定してもダメだったり・・・場合によっては(void)を使って明示的に参照範囲をコンパイラに教えてやるのがいいです。

    int x = 12345;

    func(&x);

    (void)x;

    こうすると(void)x;のところまでxは有効です。値渡しなら関数funcは正しく値を受け取れますが、ポインタ渡しだと(void)x;を書かないでおくと最適化でxのポインタ値をfuncに渡してスタックフレームからxが解放されてfunc関数の中でxの値が参照できなくなるということです。

Children
No Data