Kendi programımdan donanım izleme köpeğine kalp atışı gönderebilir miyim?


14

Steve Robillard'ın sunduğu soru ve mükemmel cevaptan sonra:

Bir Raspberry Pi'yi nasıl sıfırlayabilirim?

Linux programımı arka plan programı yerine BCM2708'in donanım izleme cihazına kendi programımdan nasıl bir kalp atışı sinyali gönderebilirim? Başka bir deyişle, MY programı çalışmıyorsa (sadece başlangıçta yürütülürse) RPi'yi sadece tüm sistem dondurulduğunda değil sıfırlamak istiyorum.

Teşekkürler.


Yanıtlar:


7

Yapabilirsin ve oldukça kolay. RPi, standart Linux watchdog API'sini uygulayan bir Linux modülüne sahiptir. Bunun belgelerini burada bulabilirsiniz .

Şimdi, bunu okursanız, adı verilen özel bir cihaz dosyası olduğunu bilirsiniz /dev/watchdogve kullanmak watchdogiçin bu dosyayı açmanız ve bazı veriler yazmanız gerekir (bir bayt, 'V' dışında bir şey yazmak en iyisidir. Daha sonra açıklamak için m). Bu dosyaya yeterince uzun bir süre yazmayacaksanız, watchdogyeniden başlatmayı tetikler. Burada örnek bir program bulabilirsiniz (çok basit) .

Normal bir durumda, kapatmak eğer Not /dev/watchdog, watchdogengelli olabilir. RPi sürücüsü tarafından uygulanmış gibi görünen 'Magic Close özelliği' adı verilen özel bir mod var, ancak AFAIK varsayılan çekirdek yapılandırmasında (CONFIG_WATCHDOG_NOWAYOUT seçeneği) etkin değil. Bu durumda, /dev/watchdoguygulamadan çıkmadan hemen önce 'V' yazmazsanız, kapatsanız bile yeniden başlatma tetiklenir .

Gerçekten devre dışı olup olmadığını test etmelisiniz (test etmek için şu anda burada bir RPi'm yok), ancak değilse, sizin için iyi değil. Uygulamanız çökerse, watchdog cihaz dosyası kapatılacak ve yeniden başlatma tetiklenmeyecektir ve bu yüzden onu istemektedir. Bu durumda, çekirdek yapılandırmasını değiştirebilir ve yeniden oluşturabilir veya ana uygulamanızın çalışıp çalışmadığını izleyecek özelleştirilmiş bir uygulama yazabilirsiniz (örneğin, bazı IPC yöntemlerini kullanarak).

Daha fazlasını yapmanıza izin veren ioctl API'sı da var watchdog. Örneğin, WDIOC_SETTIMEOUT (RPI sürücüsü tarafından destekleniyor gibi görünüyor) ile farklı bir zaman aşımı - IOCTL ayarlayabilirsiniz veya WDIOC_GETTIMEOUT (destekleniyor gibi görünüyor) ile IOCTL zaman aşımı alabilirsiniz. Varsayılan zaman aşımını değiştirmek için (10 saniye) kullanmak isteyebilirsiniz. Bununla birlikte, 16 saniyede katı sınırlama vardır. İşte bir örnek:

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

İsterseniz bir karakter yazmak yerine IOCTL'yi WDIOC_KEEPALIVE ile de kullanabilirsiniz. Her iki yöntem de geçerlidir.


Oh, ve unuttum - bunun için watchdogd kullanabilirsiniz. Sistem durumunu kontrol edecek ve raporlayacak harici programı çağırmayı destekler. Bu sayfadaki
Krzysztof Adamski

Teşekkürler. Çalıştırdım! / Etc / modüllerine bcm2708_wdog ekledikten sonra, anlayışımı kontrol etmek için basit bir VB.NET test uygulaması oluşturdum: Dim fs Yeni Sistem olarak. H) daha sonra kalp atışlarını göndermek için fs.Flush (). Harika çalışıyor!
Guy

WDIOC_KEEPALIVE'ın sayısal gösterimi nedir? hiçbir yerde bulamıyorum.
Flash Thunder

@FlashThunder: Burada tanımlanmıştır: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29 ancak kesin değeri bulmak için birkaç makro düzeyini çözmeniz gerekir. En iyi yol, değeri yazdırmak için basit C programı yazmaktır. Sadece <linux / watchdog.h> dosyasını ekleyin. Benim sistemimde0x80045705
Krzysztof Adamski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.