ここでスティーブ・ロビラードが提供した質問と優れた回答に続きます:
Raspberry Piをハードリセットするにはどうすればよいですか?
Linuxウォッチドッグデーモンからではなく、自分のプログラムからBCM2708のハードウェアウォッチドッグにハートビート信号を送信するにはどうすればよいですか?言い換えれば、システム全体がフリーズしているときだけでなく、MYプログラムが実行されていない(起動時に実行される)場合にRPiをリセットしたいのです。
ありがとう。
ここでスティーブ・ロビラードが提供した質問と優れた回答に続きます:
Raspberry Piをハードリセットするにはどうすればよいですか?
Linuxウォッチドッグデーモンからではなく、自分のプログラムからBCM2708のハードウェアウォッチドッグにハートビート信号を送信するにはどうすればよいですか?言い換えれば、システム全体がフリーズしているときだけでなく、MYプログラムが実行されていない(起動時に実行される)場合にRPiをリセットしたいのです。
ありがとう。
回答:
できるし、それは非常に簡単です。RPiには、標準のLinuxウォッチドッグAPIを実装するLinuxモジュールがあります。こちらのドキュメントをご覧ください。
これを読むと、特別なデバイスファイルが呼び出されていることがわかります。/dev/watchdog
使用watchdog
するには、このファイルを開いてデータを書き込む必要があります(1バイト、「V」以外の何かを書き込むことをお勧めします。後で説明します)。このファイルに十分な時間何も書き込まないwatchdog
と、リブートがトリガーされます。サンプルプログラム(非常に単純な)をここで見つけることができます。
通常の状況では、を閉じると無効/dev/watchdog
にwatchdog
できることに注意してください。「マジッククローズ機能」と呼ばれる特別なモードがあります。これはRPiドライバーによって実装されているようですが、デフォルトのカーネル構成(CONFIG_WATCHDOG_NOWAYOUTオプション)で有効になっていません。この場合、/dev/watchdog
アプリを終了する直前に「V」を書き込まない限り、閉じても再起動がトリガーされます。
本当に無効になっている場合は自分でテストする必要があります(テストするためのRPiが今のところありません)。アプリケーションがクラッシュした場合、ウォッチドッグデバイスファイルは閉じられ、再起動はトリガーされません。これが必要な理由です。この状況では、カーネル構成を変更して再構築するか、メインアプリケーションが動作しているかどうかを監視するカスタマイズされたアプリケーションを作成できます(たとえば、IPCメソッドを使用)。
ioctl APIもありますwatchdog
。たとえば、異なるタイムアウトを設定することができます-WDIOC_SETTIMEOUTでIOCTL(RPIドライバーによってサポートされているようです)またはWDIOC_GETTIMEOUTでIOCTLを取得します(これもサポートされているようです)。デフォルトのタイムアウト(10秒)を変更するために使用できます。ただし、16秒に厳しい制限があります。以下に例を示します。
int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
必要に応じて、文字を書き込む代わりに、WDIOC_KEEPALIVEでIOCTLを使用することもできます。どちらの方法も有効です。
0x80045705