• ベストアンサー

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

組み込み用マイコン向けのファームウェアを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があるので, 正常な リセット時には何か書いておくことで異常リセット と正常リセットの区別をつけようかと考えています. ご回答ありがとうございました.

関連するQ&A

  • 組み込みOSでスタックオーバーフローしたら?

    マイコンにて組み込みOSでスタックオーバーフローするとその振る舞いはどうなるのでしょうか? SH2を使っています。 組み込みOSはNorti4を使っています。 タスク作成したときにスタック容量を指定しています。 タスクはひとつです。 タスクのスタックより前の領域には定義メモリ(グローバルメモリ)の領域になっています。 タスクのスタックより後の領域は大きな領域(数Kbyte)ほどあいています。 この場合にタスクのある関数の動作中にスタックオーバーフローが起きた場合、どうなるのでしょうか? 思いついた選択肢は以下のとおりです。 1.定義メモリ(グローバルメモリ)の領域をオーバーフロー分書き換えて、その関数が終了したら呼び出し元の関数に戻る。 その後、書き換えられた定義メモリ(グローバルメモリ)による影響で処理によってはマイコンが意図しない動作になる。 2.スタックオーバーフローした時点でアドレス例外などの例外処理に飛んでしまう。 3.スタックオーバーフローした時点で、暴走し戻れなくなる。 4.その以外 どんなことが考えられますでしょうか?

  • 組み込みマイコン

    組み込みマイコンでプログラミングしていると以下の様なエラーがでるのですが原因が分かりません。 教えてください。 C:\WorkSpace\sample\sample\sample.c(33) : C5020 (E) Identifier "PORTA" is undefined C5020 (E) Identifier "名前" is undefined シンボル"名前"の定義がありません。 プログラムは以下のようになっています。マイコンはAKI-RX621。 /***********************************************************************/ /* */ /* FILE :sample.c */ /* DATE :Tue, Apr 23, 2013 */ /* DESCRIPTION :Main Program */ /* CPU TYPE :RX62N */ /* */ /* This file is generated by Renesas Project Generator (Ver.4.53). */ /* NOTE:THIS IS A TYPICAL EXAMPLE. */ /* */ /***********************************************************************/ //#include"iodefine,h" //#include "typedefine.h" #ifdef __cplusplus //#include <ios> // Remove the comment when you use ios //_SINT ios_base::Init::init_cnt; // Remove the comment when you use ios #endif void main(void); #ifdef __cplusplus extern "C" { void abort(void); } #endif void main(void) { long int t; /* 変数tの設定 */ PORTA.DDR.BYTE=0xff; /* ポートAの端子は全て出力端子に設定する */ PORTA.DR.BYTE=0x00; /* ポートAの出力端子を初期設定する */ while(1) /* 無限ループ */ { for(t=0;t<6000000;t++); /* 約1秒間の時間保持 */ PORTA.DR.BYTE=0x01; /* LED(赤)を点灯、LED(緑)を消灯 */ for(t=0;t<6000000;t++); /* 約1秒間の時間保持 */ PORTA.DR.BYTE=0x02; /* LED(緑)を点灯、LED(赤)を消灯 */ } } #ifdef __cplusplus void abort(void) { } #endif

  • オープン系とか、組込み系とかって何?

    よく、ソフトウェア開発の世界では、「オープン系」とか、「組込み系」、「汎用系」などと言う分野がありますよね。 これってそれぞれどう違い、どのような特徴があるのでしょうか。 また、上記以外のもので他にも「~系」ってあるのでしょうか。あればそれについても概要が知りたいのです。 「アプリ系」などというのもありますか。市販の、例えばグラフィック関連のソフトとか、ゲーム・ソフトや、会計ソフトなどはこう呼ぶのでしょうか。 また、Webプログラミングはどの分野の系統に属するのでしょうか。 ただ、「組込み系」だけは、多少わかりました。例えば電化製品などに内蔵されているマイコンを制御するプログラムを開発するのですよね。国内でも、この分野の技術者が不足しているということも知りました。 自分のイメージですが、この組込み系というのは、いわゆる市販のパソコン・ソフトを開発する分野と比べると、出力する画面のデザインなどの見た目については、あまりこだわらず、制御にいそしむ、ある意味、地味な領域なのかなという気もしました。 それに、結構、マイコンに関するハードの知識も必要とされるのですよね。 私は、ソフト開発のみというよりも結構、電子基盤の操作などに魅力を感じるので、組込みの仕事もしてみたいなとも思うですが、実は、これからVisualBasic.NETを学習しようかと思っています。 これはまったく、的外れな努力でしょうかね。やっぱり、組込みはC言語で無ければならないのでしょうか。 反対に、VisualBasic.NETを生かす道としてはどのような分野が考えられますか。Webやデータベース、サーバサイドのプログラミングなどでしょうか。 ASP.NETなどもありますしね。 どなたか貴重な解説・御意見を頂けましたら、よろしくお願い致します。

  • ATTINY13のリセット端子は無効にできるか?

    ATTINY13マイコンをAtmel Studio6.2でプログラミングしています。8ピンのマイコンなので、リセット端子でもある1番ピンを入力ピンとして使用したいと思っています。DDRレジスタでPB0端子を入力端子に設定して、この端子にスイッチをつけたのですが、スイッチONでLOWレベルにすると、マイコンの動作が止まってしまいます。 現在リアルタイムデバッガ機能は使用していないのですが、RESETが有効で動作しているのではないかと思われるのですが、RESET機能を無効にすることは可能でしょうか? どうぞ、ご教示頂きますよう、よろしくお願い致します。

  • 組み込みシステム メモリマップ割り当てについて

    職業としてH8マイコンなどを使った 組込みシステムを設計している人に質問です。 (1)変数の作成 変数(型は問わず)を作成する際、割り当てる領域の メモリマップのアドレスを指定して作成する、という話を聞きました。 趣味として組み込みを楽しむ分には気にすることではないらしいですが アドレスを指定する必要性は何でしょうか? (2)メモリマップの未使用領域 とあるプログラムで、ログをCPUのメインメモリではなく データ格納用の外部メモリ(EEPROM)に保存するという 仕様のプログラムがあり、ログを保存するメモリマップが 下記にようになっていました。 0h - 1Fh データA 20h - FFh 未使用 100h - 1000h データB 1001h - 1FFFh 未使用 2000h - 3FFFh データC ¦ 素人考えですが、ログデータならデータとデータの間に 「未使用」の領域を入れる必要はないのでは? 未使用領域の分だけ、多くログデータを保存できるでは? と思っています。 これには何か意図があるのでしょうか? また、ログに限らず(1)の変数やプログラムの使用領域を 割り当てる際も間に未使用領域を作った方が良いのでしょうか? 分かりずらい文章かと思いますが、ご回答宜しくお願い致します。

  • マイコンボード上のポートと端子の違いについて

    こんにちは。 現在、マイコンボードを使って、組込みシステムについて勉強しています。 マイコンボードには、CPUとメモリと入出力ポートが搭載されています。 このマイコンボードのLSIマニュアルを読むと、 データの出入り口となる場所に、 PA0/AN0/TM0IOA/SEG24 といった表記がされています。 この表記の場合は、マニュアルによると、それぞれ ポートAのビット0/アナログ入力0/タイマ0入出力/セグメント24 という意味だそうです。 ポートAのビット0以外は、端子として使われており、 「ポートと端子の兼用」といった説明がされていました。 この「ポート」と「端子」の違いについて、いまいち理解できないでいます。 Wikipediaなどでそれぞれの説明を読んでも、上手くイメージがつかめません。 ハードウェアについて詳しい方がいらっしゃれば、分かりやすく説明して頂けませんでしょうか? よろしくお願い致します。

  • ルネサスマイコン(R8C) ビルドエラーについて

    マイコン:R8C(R5F21226) 開発環境:HEW(Windows7) マイコン開発初心者です。 恐れ入りますが、ご教授頂きたく質問させて頂きます。 とあるプログラムを組んでいるのですが、 下記ビルドエラーが発生し、原因がわからず困っています。 『L2321 (E) Section "vector" overlaps section "program"』 文面から見るに、「ベクタ領域のアドレうがROM領域に重複している」 ということで宜しいのでしょうか? 各領域のアドレス値、並びベクタ領域も変更していません。 ※全て初期値のままです。 お手数ですが、このエラーが発生する主な原因を 教えて頂けないでしょうか?

  • H8/3048FのWDTについて

    H8/3048FのWDTについて 今学校でH8マイコンについて学習している者です。 その中でウォッチドッグタイマについて分からないことがあり、質問させていただきます。 プログラムはROMではなくRAMに書き込んでいます。そのプログラムの動作中にWDTが働いてLSIがリセットされるとRAMの中身もすべてリセットされてしまうのでしょうか? ハードウェアマニュアルには「LSI全体が初期化される」との記述がありましたので、個人的にはRAMも初期化されてしまうと考えています。 もしRAMまで初期化されてしまうのであれば、リセットがかかった際にプログラムをリスタートすることができず、再びマイコンにプログラムを転送しなければならないということなのでしょうか? また、どこかにプログラムを退避させることでリスタートすることが可能になるのでしょうか?

  • Chrome の設定をリセットしたい

    Chromebook の設定を初期化したいのですが、リセットボタンを押すと「起動ページ、新しいタブページ、検索エンジン、固定タブをリセットします。」と出てきて 気になる点がいくつかあります。 『起動ページをリセット』というのは、今開いているタブを閉じるということでしょうか。 あと、『検索エンジン』というと、Google が消えてしまうのでしょうか。 『すべての拡張機能を無効にする』とも書いてあるので、もう1回拡張機能を入れる方法も教えてください。

  • ハードウェアアーキテクチャ?

    ハードウェアアーキテクチャ? プログラムがコンピュータで実行されるまでの筋道が知りたいです。 C言語を勉強していたのですがmalloc();などの動的メモリの部分や #pragmaを使って変数のパッキングを弄る方法、部分的にアセンブラ命令を書いて処理を軽くするインラインアセンブラなどのテクニック、 レジスタ上にメモリを確保するregisterをつけて変数を宣言する方法など、ハードウェアに近い根幹的部分のほうを知りたいです。 メモリにしろヒープ領域とスタック領域があるだとかC言語の入門書には載っていないことがよくあります。 CPUの仕組みや、メモリの動作や、根本的なことが知りたいです。 このようなハードウェア寄り?なことを専門に扱っているHPや本などありましたら教えてください。

専門家に質問してみよう