ソフトウェアリセット(?)動作

お世話になっております。entakeと申します。初歩的な内容かもしれませんが、もしお判りの方がいましたら教えていただけると助かります。

 

使用MCU:H8/36079Fなど

SCI3をUART通信として使用し電文解析させているのですが、"RESET"を受信した際に

PowerON_Reset(); をCallして再起動のような動作をさせています。(引き継いだソースがそうなっていた)

この時、通常のパワーオンリセットで初期化される各種機能レジスタは初期化されるでしょうか?

また、なぜ関数Callでリセットできるのでしょう?? (スタックがおかしくなりそうなものですが)

/*****************************************************************************/
#pragma section ResetPRG
/*****************************************************************************/
__entry(vect=0) VD PowerON_Reset(VD)
{
 set_imask_ccr((UC)1);
 _INITSCT();
 main();
 sleep();
}

  • こんにちは

    実際のプログラムがどうなっているのかは測りかねますがコンパイラのマニュアルによると
    「PowerON_Reset(); をCallして再起動」するのではなく、パワーオンリセットが起こった時にでレジスタの初期設定をPowerON_Resetで行うようにプログラミングするということのようです。

    www.renesas.com/.../rjj10j2552_r0c40008xsw07rum.pdf
    コンパイラパッケージVer.7.00 ユーザーズマニュアル
    「9.2.2 実行環境の設定」抜粋
    ・ベクタテーブル (VEC_TBL)
    パワーオンリセットでレジスタの初
    ・初期設定 (PowerON_Reset)
    レジスタの初期設定を行ったあと、初期設定ルーチンを順次呼び出します。
  • わわいです
    _entry のキーワードのついた関数は実行時にスタックを初期化するようになってます。
    周辺デバイスはリセットされずに以後の初期化の処理に入るので、もしかすれば、リセットの動作と違うところが出るかもしれません。
    これを防ぐには、初期化前に、モジュールストップを行っておくとか、関係するレジスタを一旦リセット値に設定してから初期化するようにする必要がありますね
  • H8のコンパイラではentry指定した関数では、先頭でSPを初期化するコードが出力されます
    SPの値は#pragma stacksizeで指定したサイズ分の領域が確保されて設定されます
    詳細はじまさんの書込みにあるコンパイラのマニュアルに書かれています
    ですので、リセットしているのではなくてCPUだけがパワーオンリセット時と同じ処理をしている事になります
    周辺モジュールはリセットされず動作中のままなので、この後で行うはずの初期化処理でキッチリ初期化する必要があります
    個人的には、WDTが使えるならWDTの機能でリセットした方が良いと思います
  • entakeさん、こんにちは。NoMaYと申します。

    PowerON_Reset()をCallしてCPUがリセットされるか/各種機能レジスタが初期化されるか/SPの値がどうなるかについては他の皆さんが書かれていますが、私が気になったことは、電文"RESET"を受信した時の装置の動作として仕様書にどの様に書かれているのだろうか、という点です。

    例えば、以下の様に書かれていたら、現在のプログラムの処理は仕様書の内容と違うことになります。

    ・ "RESET"を受信したら装置をハードウェア的にリセットすること(制御マイコンも含む)

    以下のように書かれていたら、現在のプログラムで不具合が起きていなければ大丈夫かなと思います。
    (いわゆる、壊れていないものを直そうとするな、というものですね。(その反対は、バグは早めに追い出せ、でしょうか、、、ちょっと違うかも知れません、、、))

    ・ "RESET"を受信したら装置を初期化すること(あるいは、初期状態に戻すこと、とか)

  • みなさま、ご回答ありがとうございます。
    entry指定が付いている関数をCallするとSPが初期化されるんですね! モヤモヤが晴れました。
    周辺モジュールはリセットベクタに飛んでも動作継続しているんですね。何か非常にまずそうな気配がしますが、よくよく考えると使っていない機能レジスタは初期値のまま動かさないし、使っているものは重ねて設定されるだけで実害はないのかもしれません。
    windypon 様からご指摘いただいたWDTですが全くもって同感です。ROHMとかの専用ICを用いた時はパワーオンリセットと同じ動作なので安心ですね。
    内蔵WDTの場合はどうなのか調べましたが、内部リセット信号が出るということで周辺モジュールの初期化も実行されるっぽいですね。(自信なし。。)
  • NoMaYさん、こんにちは。entakeと申します。

    ご指摘ありがとうございます。
    仕様書には単に”リセットする”というアバウトな表現になっており、それほど心配いらなさそうです。
    (特に不具合の報告はないので直さないようにします!)