WDT WatchDogTimer 調査・設定準備 Raspberry Pi Zero WH(stretch lite版)
★ $ vcgencmd version #ファームウエアのバージョン確認
Jan 22 2019 16:54:23
★ $ cat /proc/cpuinfo #リビジョン確認
★ $ uname -a #オペレーティング・システムの情報確認(カーネル kernelなど)
Linux 000011 4.14.94+
★ $ lsb_release -a #オペレーティング・システムの情報確認(OSバージョン コードネーム Codenameなど)
Description: Raspbian GNU/Linux 9.6 (stretch)
★ $ ls -al /dev/watchdog*
crw——- 1 root root 10, 130 Feb 6 04:48 /dev/watchdog
crw——- 1 root root 252, 0 Feb 6 04:48 /dev/watchdog0
★ $ dmesg | grep bcm2835-wdt
[ 0.906432] bcm2835-wdt 20100000.watchdog: Broadcom BCM2835 watchdog timer
★ /etc/systemd/system.conf
#RuntimeWatchdogSec=0
#ShutdownWatchdogSec=10min
★ 推定・調査
多くのマイクロコントローラーは、watchdogtimer(タイムアウト秒数設定), watchdogon(ON), watchdogoff(OFF), watchdogclear(タイマークリア)の機能があるとして、省略できるとすると、ONとOFFは秒数設定の特定値で代替できる。タイムアウト秒数が固定だとすると、タイマークリアに秒数設定ができれば良い、それをどこで実行するかの設定も必要だけれど、ファームウエアによってクリティカルな場所は決まるので考慮済みで既に設定されているはず(割り込みルーチン内や周期タイマー内には入れない、理由はメインルーチンが暴走してもこれらはしぶとく動作していることが多いから)。#ShutdownWatchdogSec=10min は例外条件だとして、#RuntimeWatchdogSec=0 の値での挙動を調査。
RuntimeWatchdogSec=1 #SSHでアクセスできず
RuntimeWatchdogSec=4, =16, =28, =30 #通常動作
RuntimeWatchdogSec=32, =35, =40 #再起動繰り返す
★ 実験.1
RuntimeWatchdogSec=16(単に動作範囲の中間値) に設定後、watchdog が有効に動作するかどうかの実験
$ :(){ :|:& };: #処理オーバーを発生させる #コマンド後にしばらくしてリセット発生、動作OK
★ 実験.2
RuntimeWatchdogSec=0 に設定後、watchdog が動作するかどうかの実験
$ :(){ :|:& };: #処理オーバーを発生させる #コマンド後、暴走
SSHは受け付けない
この状態で、GPIO3/SCL/WUP – GND にしても無反応
この状態で、RUN/WUP – GND にするとリセットされ、正常起動する(SSHも受け付ける)