ウォッチドッグタイマの安全設計とは?

このQ&Aのポイント
  • ウォッチドッグタイマ(WDT)は組み込み系(車載系)のマイコンプログラムにおいて、マイコンの暴走を検知し、Resetを発生させる役割を持っています。
  • しかし、暴走した原因がわからないまま簡単にResetをかけることは問題です。ハード的な異常が発生しており、Resetをかけても必ず暴走してしまう可能性があるからです。
  • このような状態を防ぐためには、ウォッチドッグタイマ割り込みを使用して、割り込みルーチン内でソフトウェアリセットを行い、同時に発生回数を記憶し、ある回数を超えた場合にエラーモードに遷移するという方法が考えられます。
回答を見る
  • ベストアンサー

ウォッチドッグタイマ(WDT)の安全設計について。

組み込み系(車載系)の質問です。 マイコンのプログラムにて、ウォッチドッグタイマ の仕様検討をしています。 通常ウォッチドッグはマイコン暴走時の検知として、 Resetを発生させるような作りになっていると思うのですが、 なぜ暴走したかわからないまま、単純にResetを かけて、何もなかったように再び起動してよいものか? と疑問に感じております。 (例えば、すでにハード的に異常が発生しており、マイコンの  Resetをかけてもある事象が発生すると必ず暴走してしまい。  それが原因で恐ろしい事態へとつながる・・等) このような状態を防ぐためにも、何か定石的な考え方は ありませんでしょうか?例でも結構ですので、ご教示 頂きたく思っております。 ■例(自分なりに検討してみました)  例えばウォッチドッグタイマ割り込みを使用して、  割り込みルーチン内でソフトウェアリセットを掛ける。  その時同時に E2PROM等にウォッチドッグタイマ割り込み発生  回数を記憶しておき、Resetスタート後この発生回数を確認し、  ある回数を超えた時点で、エラーモードへ遷移する。

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

かなり昔の話で間違いも多くて恐縮なのですが、交換器などの顧客の利用状況のデータが最重要なシステムではシステムのリセットにグレードを設けております。 かなりうろおぼえなのですが、どのようなグレードかと申しますと  0.5:現状発生しているイベントを保障する(新規のイベントは棄てる)  1.0:現状のイベントで重要度の高いもののみ保障する  1.5:課金情報のみを保障する  2.0:メモリのダンプを取って一部の装置をリセットする  2.5:メモリの全ダンプを取って全リセットする→再起動を数回失敗するとOFFの状態に のような感じだったかと・・・(正確でなくてごめんなさい)。 一応、多重構成になっているのでWDTがオーバーフロー(数百ミリ秒単位)するとまず系が切り替わり、その繰り返し回数が一定量を超えると上記のような試みが複数回ずつ実行されて遷移してゆきます。 このようなクリティカルなイベントをフェーズ番号という番号(0.5,1,1.5,2,2.5)で表していた記憶があります。 ご参考になりますかどうか・・・。

sima06029
質問者

お礼

なるほど。。 大変参考になりました。 「エラーの頻度によってフェーズを切り替え、最終的にはシステムダウンさせる。」 使えそうです!有り難うございます。

その他の回答 (3)

noname#242220
noname#242220
回答No.3

この様な時に『フェイルセーフ』と言う考え方が有ります。 自動車はエンジンが故障した場合、エンジンの回転を制御できないような故障ではなく、回転が停止するような故障であれば車自体が止まることになり安全である。このため、回転を止めるような故障モードに自動的に(自然に)落とし込むような設計思想がフェイルセーフとなる。 * ウィキペディアより と言う事ですのでウォッチドッグタイマ割り込みで転移する動作モードが 上記の様に成っていれば問題は無いでしょうね。

sima06029
質問者

お礼

ご回答ありがとうございます。 ウォッチドッグタイマ割り込みが発生した要因で、 >エンジンの回転を制御できないような故障ではなく、 >回転が停止するような故障 の判定ができれば良いのですが、デバッグをしない限り、 ウォッチドッグの要因を判定するのは難しいですよねぇ?

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

>その時同時に E2PROM等にウォッチドッグタイマ割り込み発生回数を記憶しておき、Resetスタート後この発生回数を確認し、ある回数を超えた時点で、エラーモードへ遷移する。 E2PROM等に記録される発生回数はずっとカウントアップでしょうか? 気になるのは、稀にハードに起因するとかで発生する問題の積み重ねで1年後とか2年後とかエラー遷移した場合で、その場合は原因がわからないんじゃないでしょうか? それにエラーモードに遷移されても困る状況って無いのか気になります。車が走らないとかなって、それが多発したらリコールが怖そうです^^; って事でWDTが発生する時間間隔についても知らべないとまずいと思います。

sima06029
質問者

補足

アドバイスありがとうございます。 そうですね。時間測定の機能を使用出来れば、 時間間隔に関しても考慮することで詳細な エラー判定ができそうですね! 一言でエラーモードと言っても”何のエラーで?”といった所を 考慮する必要がありそうですね。。難しそうですが・・ >それにエラーモードに遷移されても困る状況って無いのか気になりま>す。車が走らないとかなって、それが多発したらリコールが怖そうで>す^^; ⇒  信頼をとるか安全をとるかですね。。  

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

なるほど、ですね。 昔、汎用機をやっていたころはウォッチドックタイマ割込みは 即メモリダンプを取って原因を1件ずつ追求していましたが、 車載用は、無限ループ解除、に使っているのですね。 確かに、解除、リセットでは現象を回避するだけで根本問題の 解決にはならないですね。 回数を記録するだけでも、進歩と思います。欲を言えば動いて た場所なども記録して、原因追及の足がかりも作りたいですが、 欲が大きいでしょうか。

sima06029
質問者

お礼

車載に限らず、民生品等に関しても無限LOOPや暴走等の検知で リセットをかけるような仕組みになっています。 民生品であれば即リセットでも特に問題ないと思うのですが、 (当然ユーザーはびっくりしますが、命にかかわることは  ないと思います。) しかし車となる話は別になるのかなと・・ デバッグ時であれば、オンチップデバッグ等のトレース機能を 用いて、ある程度原因追究できそうですけどね!

関連するQ&A

  • 組み込みマイコンの誤動作について

    ある組み込みマイコン(ASSP)を使っています。AD変換と、コンパレータが入っていて、コンパレータは閾値以上の電圧が入ると割り込みをかけてくれます。 そのマイコンで誤動作が見つかり、AD変換値のレジスタにアクセスしているとき、コンパレータからの割り込み要求があると、マイコン自身がエラーが発生したと誤判定してプログラムをとめてしまいます。 コンパレータは電流を電圧に変えた信号が入るようになっていて、一定以上の電流が流れたら、スイッチ(FET)を切るため=保護のため使っているので、それをやめることはできません。 メーカーはマイコンを設計しなおすのはお金がかかるから、AD変換値を読んでいるときは、コンパレータを動作させない(=保護ができない)ようにして使ってくれといいます。 AD変換も電源電圧を読んでいてこれまた保護のために使っています。 もともと、そのコンパレータで保護もできるというのがウリであったのですが、メーカー・日本の販売商社の見解として、マイコンは不具合のまま(保護できないタイミングがある状態で)使ってくれというのですが(日本の販売商社がリクエストをとめている可能性もあります)、海外メーカーのマイコンというのはそういうものでしょうか? ちなみにこのマイコンはすでに売られている車にも搭載されているものです。 みなさんのご経験と「こんな風に回避またはメーカーに働きかけた」といったことがあったら教えていただけませんでしょうか? よろしくお願いいたします。

  • 電磁適合性(EMC)について

    機械にコロナ放電を発生する電気機器の組込みを考えております。 この電気機器は、DC100Vを100kVに昇圧する昇圧器と放電部を機械に組み込みます。 昇圧器は、樹脂等で覆いをつける考えですが、放電部は金属部品の近くに置く必要があります。 質問ですが、本装置をCEマーキング対応で検討しようと思うのですが、これについてまったく知識がありません。EMC指令および低電圧指令等検討項目があると思うのですが、機器の配置および設計する上で、対策および検討項目など具体例でなくても、設計検討の進め方、注意点等でも結構です。何かありましたら教えてください。 低レベルな質問かも知れませんが、よろしくお願いいたします

  • 設計安全率について

    安全率について質問があります。 色々な参考文献を見ても、安全率について規定されているわけではなく、それぞれの設計者によって安全率を決めるような感じに思うのですが、例えば吊り具の安全率はどのように決めれば良いのでしょうか?良い参考文献がありましたら、教えてください。

  • PWM制御のデューティ変更時におけるトラブル

    SH7211マイコンのPWM(モード1)を使用して、定電流制御をしています。 PWMの周期を10KHzとし、その割り込みの周期で電流値を増設のADコンバータで取得、PID演算の後にPWMのデューティを変更して電流を制御するフィードバック機構です。 この時、10KHzで割り込みをして電流を一定に保つようデューティを常に変更しているのですが、過度に電流を流さないようデューティの値を変更する時はデューティが50%以上にならないようにしています。 ですが、PWM出力をオシロで見ていると、例えば電流値を5Aから1Aへ変更しようとした時、変更するタイミングで何故かデューティが100%以上になってしまい、本来電流値が下がるべき所で一瞬だけ5A以上となる現象に悩まされています。 CPUのマニュアルに、「周期レジスタとデューティレジスタのコンペアマッチが同時に発生すると出力は変化しない」とあり、その時デューティが100%以上になってしまう動作例が載っているのですが、プログラム上でデューティは50%以上にならないようにしていますので、この箇所は問題ないかと思います。 今現在わかっている事ですが 1) 割り込みで常にデューティは書き換えているのですが、電流値を変化させた時、つまりデューティレジスタの値を急激に変化させた時に発生しているように見えます。2A→1A程度の変化では発生しません。 2) 5A→1Aと減らした時と、1A→5Aと増やした時両方で発生します。 3) デューティを変更する直前でブレークをかけて、適当なタイミングでブレーク解除した時、この現象が発生する時と発生しない時があります(デューティを変更するタイミングが問題?)。 4) デューティレジスタの値を0とした場合、上記に書きました「周期レジスタとデューティレジスタのコンペアマッチが同時に発生すると出力は変化しない」事に該当するかもしれないと考え、デューティレジスタの値が0の時は強制的に値を10としましたが、この現象が発生しました。 また、プログラムの中身ですが 1) 周期レジスタの値は3999、デューティレジスタの値は0~1999の値で変化。 2) 出力は初期出力がHi、コンペアマッチでLowというHi→Low出力。 3) 割り込み関数の中でADコンバータから値を取得→PID演算→デューティレジスタの値を変更という処理をしています。 4) 割り込みレベルを他の割り込みと比べて一番高くしているため、割り込み関数処理中に他の割り込みは発生しません。 長文申し訳ございませんが、何か同じような現象が起きた方、または何かしらの解決策をご存知の方、アドバイスを宜しくお願いします。

  • H8/3048F IRQポートを使った外部割込みについて

    秋月電子のH8/3048Fマイコンボードを購入し、C言語による組み込みプログラムの演習を行っていて、マイコンボードのIRQ端子を使った外部割込みを実装しようとしてつまずいてしまいました。 メインループでLED点灯などの処理を行い、タクトスイッチの押下があったら別の処理を割り込ませ、またもとの処理に戻るという外部割込み処理を行いたいのですが、うまくいきません。 今おきている問題としては、 (1)電源の投入して、メインの処理(LED点灯)が行われる前になぜか一度IRQ割り込みが発生し、別処理が行われ、その後メインの処理を行う。 (2)IRQポートには立下り割り込み処理を行いたいので、プルダウン抵抗回路を組み、通常状態では、 IRQポート→チャタリング防止用のシュミットトリガ74LS19(NOT回路が含まれている)→10KΩの抵抗器→GND という回路でHIGH状態からタクトスイッチによる押下が行われたら、 0.1μFのコンデンサ→+5V という回路につながり、LOWになって、立下りエッジが検出され、割り込み処理が行われるはずだが、タクトスイッチを押下してもなかなか反応せず、5~6回押さないと割り込みが行われない。 (3)割り込み処理実行後、元の処理に戻らない。(このとき、タクトスイッチ押下による割り込み処理は再度受け付けてくれる) の3点です。 C言語関連のH8マイコンの教材は無く、Web上の情報でしか勉強していないので、必要な知識が欠けているかもしれませんが、どなたかお知恵を貸していただけないでしょうか? 当方のH8/3048Fによるプログラミング暦は1ヶ月ほどで、LEDの制御、外部スイッチ入力による処理等基本的なことは出来ていると思います。 メイン処理と割り込み処理のソースコードを載せておきます。 void int_irq0() //割り込み処理関数 { /* lcd_init(); lcd_locate(0,0); lcd_print("ワリコンダYO!"); wait(500); lcd_locate(0,0); lcd_print("モトニモドルYO!"); */ P5.DR.BIT.B0 = 1; wait(300); P5.DR.BIT.B0 = 0; wait(300); INTC.ISR.BIT.IRQ0F = 0; //ISRフラグをクリアする } void main(void){ //char moji[16] = "AKI-H8"; unsigned int rand_seed = 100; P1.DDR = 0x00; P5.DDR = 0xff; PB.DDR = 0xff; INTC.ISCR.BYTE = 0; INTC.ISCR.BIT.IRQ0SC = 1; //立下りエッジで割り込み検出 INTC.IER.BIT.IRQ0E = 1; EI; srand(rand_seed); timer_init(); /* タイマーの初期化 */ lcd_init(); /* 液晶表示器の初期化 */ lcd_locate(0,0); /* カーソル位置の指定 */ lcd_print("スイッチオセ!"); /* 文字列の表示 */ while(1){ //disp_data(); led_randset(); wait(100); led_allclr(); wait(10); } /* 無限ループ */ }

  • 機械設計の安全基準に対する考え方

    機械設計(安全基準)に関する質問です。 装置(自動機)の仕様で数社の装置メーカーさんと話ししておりますが、 装置カバーのねじ穴について、「あれ?」と思いここで質問しました。  装置下側部(H=800まで)に駆動部やマニホールドが設置されていて、安全カバーで覆われています。そのカバー取り付けの穴をダルマ穴でお願いしたところ、「安全基準から外れる。法令で決まってます。」と言われました。他の装置メーカーさんからは言われません。  私はPL法などについて今まで接する事が無く、全く分かりません。 このような法令ってあるのか、教えてください。お願いします。

  • 耐震設計についての安全率について

    「建築設備耐震設計・施工指針」にもとづいた評価計算で 一般的な指標となるアンカーボルト1本あたりの許容引抜荷重は、実際にアンカーの引抜荷重カタログ値に比べるとかなり小さいものになっています。 (例:M12おねじのアンカーだと、指針での目安は670Kgfですがカタログの引抜強度は1500Kgfぐらい) これは、指針では「許容」と付くことからわかるように安全率を含んだ判定基準なため、実際のボルト1本あたりに作用する引抜力は、M12だと670Kgf以下なら良いのでしょうか?それとも、安全率を見なければいけないのでしょうか? 安全率を見なければいけないなら、判定基準はどのような安全率以上なら良いのでしょうか? 過去の森検索からは、2.3というのは本質問の前に確認は出来ているのですが、一般的に出てくるM12おねじ後施工なら670Kgfというのはその2.3を見込んでいるのか否かを確認したかった次第です。 色々なサイトで見たところ、670に対して安全率を算出して、あたかも安全率が必要そうな計算例から、670より少し小さい値で良判定になっている計算例の両方が存在していたためです。 自分は安全率をもともと見込んでいる数値で、1> なら良判定となるとおもうのですが・・

  • 設計強度の安全率

    機械の設計強度の安全率を6倍に取るという人がいます。 どういう根拠に基づくと6倍になるのでしょうか? 疲労限もだいたい引張強度の半分くらいと聞くし。 判る人がいましたら教えてください。 逆に言えば普通どの位に取るのでしょうか? 基本的なこと教えて頂けないでしょうか?

  • 構造設計の安全性証明書

    以前にも同じタイトルで質問してますが(笑)今回は別の質問です。 構造一級建築士が構造設計を行った場合、安全性証明書は必要無いと言われましたが、本当ですか?

  • ヒューマンエラーが起こっても安全を確保できる設計

    教えて下さい。 ヒューマンエラーが起こっても安全を確保できる設計(災害等を発生させない設計)を行うことを通称何と呼んでいますか? 確か人間工学の関係で聞いた記憶がありますが、忘れてしまいました。 宜しくお願い致します。

専門家に質問してみよう