自分のプログラムからハードウェアウォッチドッグにハートビートを送信できますか?


14

ここでスティーブ・ロビラードが提供した質問と優れた回答に続きます:

Raspberry Piをハードリセットするにはどうすればよいですか?

Linuxウォッチドッグデーモンからではなく、自分のプログラムからBCM2708のハードウェアウォッチドッグにハートビート信号を送信するにはどうすればよいですか?言い換えれば、システム全体がフリーズしているときだけでなく、MYプログラムが実行されていない(起動時に実行される)場合にRPiをリセットしたいのです。

ありがとう。


回答:


7

できるし、それは非常に簡単です。RPiには、標準のLinuxウォッチドッグAPIを実装するLinuxモジュールがあります。こちらのドキュメントをご覧ください

これを読むと、特別なデバイスファイルが呼び出されていることがわかります。/dev/watchdog使用watchdogするには、このファイルを開いてデータを書き込む必要があります(1バイト、「V」以外の何かを書き込むことをお勧めします。後で説明します)。このファイルに十分な時間何も書き込まないwatchdogと、リブートがトリガーされます。サンプルプログラム(非常に単純な)をここで見つけることができます。

通常の状況では、を閉じると無効/dev/watchdogwatchdogできることに注意してください。「マジッククローズ機能」と呼ばれる特別なモードがあります。これは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を使用することもできます。どちらの方法も有効です。


ああ、忘れてしまった-実際にwatchdogdをこれに使用できます。システム状態をチェックして報告する外部プログラムの呼び出しをサポートします。このマニュアルページの
Krzysztof Adamski

ありがとう。うまくいきました!bcm2708_wdogを/ etc / modulesに追加した後、理解を確認するために簡単なVB.NETテストアプリを作成しました。 H)次にfs.Flush()でハートビートを送信します。よく働く!

WDIOC_KEEPALIVEの数値表現は何ですか?どこでも見つけることができません。
フラッシュサンダー

@FlashThunder:ここで定義されています:lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29しかし、正確な値を見つけるには、いくつかのレベルのマクロを解決する必要があります。より良い方法は、単純なCプログラムを作成して値を出力することです。<linux / watchdog.h>を含めるだけです。私のシステムでは0x80045705
クシシュトフアダムスキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.