Puis-je envoyer un battement de cœur à un chien de garde matériel depuis mon propre programme?

14

Dans le prolongement de la question et de l'excellente réponse fournie par Steve Robillard ici:

Comment réinitialiser durement un Raspberry Pi?

Comment envoyer un signal de pulsation de mon propre programme au chien de garde matériel du BCM2708 au lieu du démon de chien de garde Linux? En d'autres termes, je veux réinitialiser le RPi si mon programme n'est pas en cours d'exécution (qui s'exécute au démarrage), pas seulement lorsque l'ensemble du système est gelé.

Merci.

Gars
la source
Démarrage utile ... mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt
Alex Chamberlain

Réponses:

7

Vous pouvez et c'est assez facile. RPi dispose d'un module Linux qui implémente l'API de surveillance Linux standard. Vous pouvez trouver la documentation de ceci ici .

Maintenant, si vous lisez ceci, vous saurez qu'il y a un fichier de périphérique spécial appelé /dev/watchdoget pour l'utiliser, watchdogvous devez ouvrir ce fichier et écrire des données (un octet, il est préférable d'écrire autre chose que 'V' que je ' m expliquant plus tard) de temps en temps. Si vous n'écrivez rien dans ce fichier assez longtemps, watchdogun redémarrage sera déclenché. Vous pouvez trouver un exemple de programme (très simple) ici .

Notez que dans une situation normale, si vous fermez /dev/watchdog, watchdogpeut être désactivé. Il existe un mode spécial appelé «fonctionnalité Magic Close» qui semble être implémenté par un pilote RPi mais AFAIK il n'est pas activé dans la configuration par défaut du noyau (option CONFIG_WATCHDOG_NOWAYOUT). Dans ce cas, le redémarrage sera déclenché même si vous fermez, /dev/watchdogsauf si vous y écrivez «V» juste avant de quitter l'application.

Vous devriez vous tester si elle est effectivement désactivée (je n'ai pas de RPi ici pour le tester), mais si ce n'est pas le cas, ce n'est pas bon pour vous. Si votre application plante, le fichier du périphérique de surveillance sera fermé et le redémarrage ne sera pas déclenché et c'est pourquoi vous le souhaitez. Dans cette situation, vous pouvez soit modifier la configuration du noyau et la reconstruire, soit écrire une application personnalisée qui va surveiller si votre application principale fonctionne (en utilisant une méthode IPC par exemple).

Il y a aussi l'API ioctl qui vous permet d'en faire plus avec watchdog. Vous pouvez, par exemple, définir un délai d'expiration différent - IOCTL avec WDIOC_SETTIMEOUT (semble être pris en charge par le pilote RPI) ou obtenir un délai d'expiration - IOCTL avec WDIOC_GETTIMEOUT (qui semble également être pris en charge). Vous souhaiterez peut-être l'utiliser pour modifier le délai d'expiration par défaut (10 secondes). Il y a cependant une limite stricte à 16 secondes. Voici un exemple:

int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);

Vous pouvez également utiliser IOCTL avec WDIOC_KEEPALIVE au lieu d'écrire un caractère si vous le souhaitez. Les deux méthodes sont valides.

Krzysztof Adamski
la source
Oh, et j'ai oublié - vous pouvez réellement utiliser watchdogd pour cela. Il prend en charge l'appel d'un programme externe qui vérifiera et rapportera l'état du système. Lire "Vérifier le binaire" dans cette page de manuel
Krzysztof Adamski
Merci. Je l'ai fait fonctionner! Après avoir ajouté bcm2708_wdog à / etc / modules, j'ai créé une application de test VB.NET simple pour vérifier ma compréhension: Dim fs As New System.IO.FileStream (fn, IO.FileMode.Open) pour démarrer le chronomètre et fs.WriteByte ( H) puis fs.Flush () pour lui envoyer des pulsations. Fonctionne très bien!
Guy
quelle est la représentation numérique de WDIOC_KEEPALIVE? ne le trouve nulle part.
Flash Thunder
@FlashThunder: Il est défini ici: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29 mais vous devrez résoudre quelques niveaux de macros pour trouver la valeur exacte. La meilleure façon est d'écrire simplement un programme C simple pour imprimer la valeur. Incluez simplement <linux / watchdog.h>. Sur mon système, c'est0x80045705
Krzysztof Adamski