• ベストアンサー

組み込みマイコンでのソフトウェアによるリセット

組み込み用マイコン向けのファームウェアをC言語で 書いています. ここで, ソフトウェア側からマイコンにリセットをかけ るにはどのような方法があるでしょうか? ※マイコン自体には内部的なハードウェアリセットを行 う機能は無いものとします. 素人考えで思いつく限りだと: ・リセットを行う場所の関数からmainまですべて戻る 経路を作っておく. main (または, mainを呼び出すスタートアップルーチ ンの部分)をループにしておき, その始めで内蔵周辺 機能のレジスタやstatic領域のメモリをすべて初期化 するようなコードを ひたすらハードコーディングしておく. (※static領域のメモリ初期化はどのみち行うからよ いとして, 内蔵周辺機能のレジスタをひたすら初期化 するのが面倒に思われます) ・ウォッチドッグタイマ機能があれば, わざとカウン タをオーバーフローさせてハードウェアリセットをか ける. ・外部リセット端子に何らかの形で出力ポートを 接続しておいて, 自分でハードウェアリセットをかける. 上記のものでもやればそれなりに動作しそうな気は しますが, どういう方法が一般的なのか知らないため どうしてよいか悩んでいます. どのようにリセットを行うのがスマートであるか ご教示いただけませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kabasan
  • ベストアンサー率44% (264/588)
回答No.2

確実さの順で行くと、 1、外部ポートからワンショット回路を経由してリセット端子へ 2、ウォッチドッグタイマで自滅 ソフト的にリセットベクタへ飛ぶのは、周辺デバイス(マイコン内臓も外部も)が初期化されませんから、初期化ルーチンがパワーオンリセット状態であることを前提に書かれていれば、予期せぬ状況を招きます。 マイコン外部に周辺デバイスを接続している場合は、2の方法も同様に危険です。 ちなみに、出力ポートをリセットピンに直結すると不完全なリセットになり、やはり予期せぬ事態になり得ます。 私は余計な回路を載せるのがいやなので、可能な限り2を、それがダメなら1の方法を使用しています。

likipon
質問者

お礼

今回は外部回路の増設が難しいので, ご回答を参考に WDTを利用してリセットを行うことにします. ご回答ありがとうございました.

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

簡単なのは外部ポートからリセット信号を入れさせることでしょうね。 ウォッチドッグを使うのは異常時と区別が付かなくて気持ち悪いですね。 ソフト的な対応については、通常の初期化シーケンスでは周辺H/Wのレジスタは初期化しないんですか。しているのだったらCPUのステータスレジスタとスタックレジスタをリセット時と同じにしてリセットベクタのアドレスにジャンプする(要するにCPUリセットのエミュレーション)だけで済むかもしれませんけど。C言語では無理なのでアセンブラ記述になりますが。 # 起動シーケンスの中でメモリマップを変更していたりすると戻さないといけないので大変になります

likipon
質問者

お礼

内蔵周辺機能の初期化はマイコンのリセットにより 行われてくれるので, それを利用したほうが簡単か なと考えました. (チップ外部の周辺機能や設定の必要な内蔵周辺機能 はもちろん初期設定しております) 結局, WDTを利用することにしたのですが, 現在扱っている回路ではEEPROMがあるので, 正常な リセット時には何か書いておくことで異常リセット と正常リセットの区別をつけようかと考えています. ご回答ありがとうございました.