RL78のソフトリセット

こんにちは、SANSと申します。

 

RL78/L1Cを使って開発を進めていますが、起動時にリセットがかかってしまいmain()に戻る→少し処理が進んでまたmain()に戻るというループする挙動をします。

H/Wに問題はないようです(問題ないというのは推測ですが、少なくともVDDは安定しています)。

このようにソフト的にリセットが掛けられてしまう状況って何がありますか。

何でも良いので考えられる要因が思い当れば列挙して頂きたく。

ちなみにWDTはOFFにしています。

 

曖昧な質問であることは承知していますが、宜しくお願いします。

Parents Reply
  • SANSさん NAKAといいます。
    fujita nozomu先生が確認して欲しいと言われているのは、RESF(リセット・コントロール・フラグ・レジスタ)を確認してみたら?ということではないでしょうか?WDTなのか?不正命令なのか?RAMパリティエラーなのか?不正メモリアクセスなのか?LVDなのか?とかの状態が残っていると思います。RL78/L1Cにはないのでしょうか?
Children
  • 回答の意図を読み取れませんでした、すみません。
    RESFは確認済みで、特にフラグは立っていませんでいた。
    仕様書によるとフラグが立っていないときは外部リセットと書いていますが、これは何を指すのでしょうか。
  • はじめまして、Hosです。

    外部リセットはRESET端子に信号を入力してCPUをリセットすることを指します。
    RESET端子の信号を確認してみましょう。
    ハードウェアマニュアルの24章に詳しい記載がありますね。

    また、1点気になったのですがSANSさんがRESFを確認する前のタイミングで、すでにRESFをクリアしていたのでALL 0に見えているといったことはないですか。
    ハードウェアマニュアルでは「RESFレジスタのデータを読み出すことにより,TRAP, WDTRF, RPERF, IAWRF, LVIRFフラグはクリアされます。」とあります。
    コード生成でリセット要因確認にチェックを入れていると、R_CGC_Get_ResetSourceで読み込んでしまっていたりします。
  • Hosさん

    RESFを正しく出力できました。2度呼び出しており、それがフラグ無しに見えてしまっているのが原因でした。
    リセットの内容はRAMパリティエラーでした。
    おかげさまで一歩前進しました。
    ありがとうございます。
  • NAKAです。

    RPERDIS = 1; //RAMパリティエラー・リセット発生を禁止

    としたらどうでしょう?

  • RAMパリティエラーリセットを禁止することで、期待する動作をするようになりました。
    ありがとうございます。

    次々と追加で質問して申し訳ないのですが、2点気になっています。
    1.RAMパリティエラーが発生する要因は何なのか
    ・コードを見ないと結局わからないと思いますが、よくある事例や確認方法などがあれば教えてください。

    2.RAMパリティエラーを無効にしても安全なのか
    ・当然セーフティを外すわけなので何か弊害が出そうです。最悪マイコンの故障につながるなどはあるのでしょうか。

    どうぞよろしくお願いします。
  • > 1.RAMパリティエラーが発生する要因は何なのか

    1. 宇宙線等の影響で化けたRAMを読み出した場合
    2. 未初期化のRAMを読み出した場合
    大体このどちらかだと思います。RAMのパリティは本来的には 1. の検出の為に用意されており、RAM が化けた状態で動作させるよりは止めるかリセットした方がマシな場合を想定してそのような機能が用意されています。
    2. は RL78 では
    Ⅰ 未初期化の変数を読み出す
    Ⅱ プログラムの不具合でおかしな領域を読み出す
    Ⅲ 初期化されていないスタブ領域を含んだ構造体を代入等する
    大体このような原因で起こりうる問題です。ⅠとⅡは本来的にプログラムの不具合なので修正すべき問題です。
    Ⅲは RL78 固有の問題として偶に報告があります。本来的にプログラムの不具合ではなくコンパイラの出力コードを把握しないと解決しない問題なので根が深いです。下記のスレッドが参考になるかもしれません。
    『RAMパリティ・エラーについて』
    japan.renesasrulz.com/.../ram

    > 2.RAMパリティエラーを無効にしても安全なのか

    プログラムに不具合がなく、宇宙線等も滅多にないことだろうと判断できれば無効にしても構わないと思いますが、先に挙げたⅠとⅡは本来的に修正するべきものなので、その点はよく確認する必要があるでしょう。

  • NAKAです。

    以前、チョコ先生に教えてもらいました(^^♪

    "安全装置"とは安全機能の中の悪名高き"RAMパリティ・エラー検出機能"のことでしょう。
    ディフォルトでONなので,初期化してないRAMをリードすると,パリティ・エラーを検出して
    リセットがかかります。(第27章を参照してください。)
    これを避けるには,RAMパリティ・エラー検出機能を停止した状態で,RAMを読み出し,
    同じ値を書き戻す処理をやれば,パリティは正しくなるので,RAMパリティ・エラー検出を
    許可しても,その領域をリードしてもリセットしなくなります。

     

    P.S.

    fujita nozomu先生に1分負けた!(T_T)

  • fujita nozomuさん

    ありがとうございます。
    返事が非常に早く、とても助かります。

    最初に書いておくべき内容だったのですが、このリセットは「FW書き込み直後の起動時に高確率で発生し、何度かON/OFFを繰り返すと、とふとした瞬間から希望通りの通常動作をする」といった挙動をします。
    一度リセットせず起動に成功できれば、その後は時間を空けようが電源を落とそうが、次にFWを書き込まない限りは発生しません。

    これらを考えたとき、2. の初期化関係に何か潜んでいるんじゃないかと思いました。
    重点的にチェックしてみます。
  • NAKAさま

    お返事頂けるだけで幸いです。
    リセットがかかるタイミングだげRAMパリティエラー検知を無効にするということですね。

    >同じ値を書き戻す処理
    すみません、この意味がよくわかりませんでした。。。
  • SANSさん

    NAKAさんがおっしゃっているのは、RAMに書き込んだ時にパリティが付与されるので、どんなデータであろうと一旦書き込んでさえしまえば、(不正に変更されなければ)読み込み時にパリティエラーに引っかからなくなる、ということだと思います。

    1.RAMパリティ・エラー検出機能をOFF
    2.RAMを読み込む
    3.書き戻す(ここで書き込んだデータに対するパリティがつく)
    4.2~3を必要な領域に対してすべて行う
    5.RAMパリティ・エラー検出機能をON

    ということになるかと思います。
    NAKAさん、意図していることと違っていたらごめんなさい。補足をお願いします。

    >「FW書き込み直後の起動時に高確率で発生し、何度かON/OFFを繰り返すと、とふとした瞬間から希望通りの通常動作をする」
    8bitにつき1bitのパリティなので、偶然パリティチェックをパスしたので、その後はうまく動いている、とかなのかな?