止められないウォッチドッグタイマー

以前、新しく使うマイコンの実験用のプログラムをあれこれ書いている。

ウォームリセットとコールドリセット

こんなもんでいいんじゃないかというのが見えてきたので作っている。

アセンブラをけっこう書かないといけないとか、デバッグ環境がイマイチだとか、

いろいろ苦戦しつつも、輪郭は見えてきた気がする。


その中で驚愕したウォッチドッグタイマーのことを今日は書く。

ウォッチドッグタイマーはマイコンの暴走を検出する最後の砦である。

様々なものがあるので一概には言えない部分があるが、

典型的なものでは一定時間経過するとマイコンにリセットが発生するが、

定期的にタイマの値を戻すことで、正常時にはリセットが起きないようにする。

プログラムがハングアップしてタイマを戻す処理を通らなくなると、

タイムアップしてリセットが発生して、ハングアップから復帰出来るというわけ。


さっき「最後の砦」と書いたが、それがゆえの工夫がしばしばある。

適用例が多いのはウォッチドッグタイマーのレジスタを操作するときに、

マジックワードをライトしないといけないというもの。

ロックレジスタにマジックワードを書き込んでから、タイマの値を戻すとか。

ウインドウ付きのウォッチドッグタイマーというのもある。

一定時間空けないとレジスタの操作を受け付けないというものである。

タイマを戻す操作を繰り返すような形でハングアップした場合の対策だな。

これらの対策がどれぐらい効果あるのかはよくわからないんだけどね。


今回触ったウォッチドッグタイマーはこの両方の機能を備えているのだが、

それに加えて下記の操作をするとこんな機能まである。

  • 特定のレジスタ(起動含む)を操作すると タイマ設定値 がロックされる
  • 一度起動すると停止することが出来ない

これらのロックを解除できる方法はマイコン自体のリセットのみである。

メンテナンスモード中は暴走検出の必要が無いということで、

ウォッチドッグタイマーを切るような操作は今までよくやってきたが、

このマイコンはそういうことができないというから大変である。

さすがにこれはやりすぎだと思うのだけど……


本当にこのウォッチドッグタイマーを使うべきなのかはようわからん。

もしかしたらマイコンの外側で用立てすることも考えたほうがよいのかも。

ウォッチドッグタイマーが最後の砦であることを意識しすぎた結果、

とても使えないものになってしまったというのはどうかと思うところである。

なぜここまでしたのか理解に苦しむところである。


ウォッチドッグタイマーは暴走時にリセットを発生させる使い方だけでなく、

暴走時に割り込みを発生させるという使い方もある。

2つ使って、1つを予告割り込み発生用、1つをリセット発生用に使い、

割り込みでログの取得などの操作をして、リセットされるのを待つなど。

こういう目的があるので複数個のウォッチドッグタイマーを積んだマイコンも多い。


あと、ウォッチドッグタイマーとは異なる暴走検出の仕組みとして、

チェックポイントの通過時にカウントアップして、

一定箇所でカウント数が正しいことをチェックする方法がある。

これ自体は専らソフトウェアで実現されることが多いと思うのだが、

これ専用のペリフェラルを備えたマイコンを見て驚いたことがある。


というわけでウォッチドッグタイマーもいろいろという話だった。

それはある程度覚悟していたけど、さすがに一度起動すると止められないのは想定外だわ。