こんにちは、ナナです。
前章ではタイマB1機能を学びましたが、タイマ繋がりということで本章ではウォッチドッグタイマについて学びましょう。
本記事では次の疑問点を解消する内容となっています。
では、密かに登場していたウォッチドッグタイマ機能を解説します。
ウォッチドッグタイマとはどんな機能なのか
ウォッチドッグタイマって不思議な名前ですね。どのような機能なのかをイメージから知っていきましょう。
ウォッチドッグタイマの動作イメージ
ウォッチドッグとは番犬のことなのですが、マイコンにおけるウォッチドッグタイマとは時間を利用したシステム異常を検知するための仕組みです。
タイマ機能に対してクロックが入力されるとタイマはカウントを行うのでした。ウォッチドッグタイマはカウンタ用のTCWDレジスタがオーバーフローするとシステムがリセット(再起動)します。
そのためオーバーフローしないように定期的にカウンタをクリアしてあげる必要があります。これはエサを一定期間与えないと吠える犬のようなものなのです。
ウォッチドッグタイマの役割
なぜ、このようなシステムを再起動する仕組みが設けられているのでしょうか。
プログラムにおいて不具合というのは避けられないものです。組み込みシステムにおいてソフトウェアのバグが要因となり、システムが正常に動かなくなってしまうこともあります。
実施されるべき処理が一定時間経過しても実施できない、このようなシーンでシステムを復旧するのがウォッチドッグタイマの役割です。
一定時間行われるべき処理がされないことを検知し、リセットすることでシステムを復旧するのです。
ウォッチドッグタイマ機能の使い方
ウォッチドッグタイマはデータシート「13章 ウォッチドッグタイマ」に記載されています。タイマB1と同じでプリスケーラの設定やクロックカウント用のレジスタがあることがわかります。
特徴
「13.1章 特徴」には次の記載があります。
- 9種類の内部クロックを選択可能
- カウンタのオーバフローでリセット信号を発生
- 初期状態で動作状態です(リセット解除でカウントアップ)
初期状態で動作としてあります。つまり、システムが起動したときに最初からウォッチドッグタイマ機能は有効な状態で起動するということです。
マイコンによってシステム起動時にウォッチドッグタイマが有効なのか無効なのかは異なる。H8/36064マイコンにおいては有効になっていることに注意!
レジスタ
ウォッチドッグタイマのレジスタは次の3つが存在します。
- タイマコントロール/ステータスレジスタWD(TCSRWD)
- タイマカウンタWD(TCWD)
- タイマモードレジスタWD(TMWD)
タイマコントロール/ステータスレジスタWD(TCSRWD)とは
ウォッチドッグタイマの動作を制御するためのレジスタです。データシートの説明を見るとわかりますが、非常にややこしいレジスタになっています。
下記太字にあるようにとあるビットに書き込むためには別のビットを1にする必要があるなど、それぞれのビットが別のビットに依存しているのがわかります。
なぜ、このような構成になっているかというと、ウォッチドッグタイマの動作というのは最悪の状態でシステムを救う機能なわけです。その動きを制御するレジスタが誤って値を書き換えられるようなことがあると「ウォッチドッグタイマが動作してない!」といったことになりかねません。
そのため、意識的に変更するようなプログラムでないとレジスタ設定値を変えられないような作りになっているのです。
タイマカウンタWD(TCWD)とは
TCWDはクロックをカウントするレジスタです。これはタイマB1におけるTCB1レジスタと同じ役割のレジスタです。1Byteのレジスタであるため0~255までカウントすることが可能です。
このレジスタがオーバーフローするとシステムが再起動してしまうため、一定時間以内にクリアし続ける必要があるのです。
タイマモードレジスタWD(TMWD)とは
このレジスタはプリスケーラの分周を設定するためのレジスタなのがわかりますね。8種類の分周から選択することができます。ビュートローバーではシステムクロックは12MHzのため、各分周においてオーバーフローするまでの最大時間は算出することができます。
最大分周の8192を使用しても174ミリ秒以内にはカウンタクリアをしないとリセットが掛かるのがわかります。
ウォッチドッグタイマ停止処理
本編におけるプログラムを動かした際に次のプログラムコードが存在していることに皆さん気づいていることでしょう。
//---------------------------------------------------
// ウォッチドッグタイマの停止(消さないこと)
//---------------------------------------------------
WDT.TCSRWD.BYTE = 0x92;
WDT.TCSRWD.BYTE = 0x92;
このプログラムはウォッチドッグタイマ機能を停止している処理です。システム開発途中などにおいてはウォッチドッグタイマが動いているとリセットが実施されて不便な時があるため今は起動時に停止にしてあります。
課題:ウォッチドッグタイマ機能を使ってみよう
本章は解説のみで課題はありません。
Q&A:ウォッチドッグタイマに関するよくある質問
これはプログラムミスではありません。意図的に2回同じ値を書き込んでいるのです。
上記はデータシートの説明文を抜粋したものですが「停止させるときは2回ライトしなさい」と書いてありますね。この制約を満たすために2回書き込んでいるのです。
1回だけの書き込みでは停止ができません。
リセットはマイコンを再起動させるための信号です。リセット信号というものが発生するとマイコンが再起動し、プログラムはまた最初から動き出すことになります。
リセットはウォッチドッグタイマ以外にも、プログラム上で起きてはいけない事象が起きた時に発生する信号であり、発生要因は複数あります。
そうですね。ウォッチドッグタイマといった万が一に備えた復旧機能というのはシステムを利用するユーザーを救うものです。
しかし、それは開発者にとっては不名誉なことなのです。システムが再起動しなければならないようなプログラムは本来作ってはなりません。リセットが起きないように設計・プログラムをしなければならないのです。
ですので、リセットという現象は企業や開発者にとっては非常に大きな問題であり、発生したときには早急に原因追及や対策が求められる不具合になります。