क्या मैं अपने खुद के प्रोग्राम से हार्डवेयर वॉच डॉग को हार्ट बीट भेज सकता हूं?


14

स्टीव रोबिलार्ड द्वारा यहां दिए गए प्रश्न और उत्कृष्ट उत्तर के बाद:

मैं हार्ड रास्पबेरी पाई को कैसे रीसेट करूं?

मैं अपने खुद के कार्यक्रम से BCM2708 के हार्डवेयर वॉचडॉग के बजाय लिनक्स वॉचडॉग डेमन से दिल की धड़कन का संकेत कैसे भेज सकता हूं? दूसरे शब्दों में, मैं आरपीआई को रीसेट करना चाहता हूं यदि मेरा प्रोग्राम नहीं चल रहा है (जो स्टार्टअप पर निष्पादित होता है), न केवल जब पूरा सिस्टम जमी है।

धन्यवाद।


जवाबों:


7

आप कर सकते हैं और यह काफी आसान है। आरपीआई में एक लिनक्स मॉड्यूल है जो मानक लिनक्स वॉचडॉग एपीआई को लागू करता है। आप इसका प्रलेखन यहाँ पा सकते हैं ।

अब, यदि आप इसे पढ़ते हैं, तो आपको पता चलेगा कि एक विशेष उपकरण फ़ाइल है, जिसे /dev/watchdogउपयोग करने के लिए और watchdogआपको इस फ़ाइल को खोलना होगा और कुछ डेटा (एक बाइट) लिखना होगा, 'V' के अलावा कुछ और लिखना सबसे अच्छा है, जिसे मैं ' बाद में इसे समय-समय पर समझाता हूं। यदि आप इस फ़ाइल के लिए लंबे समय तक कुछ भी नहीं लिखेंगे, watchdogतो रिबूट को ट्रिगर किया जाएगा। आप एक उदाहरण कार्यक्रम (बहुत सरल) पा सकते हैं यहाँ

नोट है कि एक सामान्य स्थिति में, यदि आप इसे बंद /dev/watchdog, watchdogविकलांग हो सकता है। एक विशेष मोड है जिसे 'मैजिक क्लोज फीचर' कहा जाता है जिसे आरपीआई ड्राइवर द्वारा कार्यान्वित किया जाता है लेकिन AFAIK इसे डिफ़ॉल्ट कर्नेल कॉन्फ़िगरेशन (CONFIG_WATCHDOG_NOWAYOUT विकल्प) में सक्षम नहीं करता है। इस स्थिति में, रिबूट /dev/watchdogतब भी चालू हो जाएगा जब आप ऐप छोड़ने से ठीक पहले इसे 'V' लिखेंगे।

यदि आप वास्तव में अक्षम हैं तो आपको खुद का परीक्षण करना चाहिए (मेरे पास परीक्षण करने के लिए अभी आरपीआई नहीं है), लेकिन अगर ऐसा नहीं है, तो यह आपके लिए अच्छा नहीं है। यदि आपका एप्लिकेशन क्रैश हो जाता है, तो वॉचडॉग डिवाइस फ़ाइल बंद हो जाएगी और रिबूट ट्रिगर नहीं होगा और यही कारण है कि आप इसे चाहते हैं। इस स्थिति में, आप या तो कर्नेल कॉन्फ़िगरेशन को बदल सकते हैं और इसका पुनर्निर्माण कर सकते हैं या एक अनुकूलित एप्लिकेशन लिख सकते हैं जो मॉनिटर करने जा रहा है यदि आपका मुख्य एप्लिकेशन काम कर रहा है (उदाहरण के लिए कुछ आईपीसी विधि का उपयोग करके)।

Ioctl एपीआई भी है जो आपको कुछ और करने की अनुमति देता है watchdog। उदाहरण के लिए, आप एक अलग टाइमआउट सेट कर सकते हैं - IOCTL WDIOC_SETTIMEOUT के साथ (RPI ड्राइवर द्वारा समर्थित प्रतीत होता है) या Timeout प्राप्त करें - IOCTL WDIOC_GETTIMEOUT के साथ (जो समर्थित प्रतीत होता है)। आप इसे डिफ़ॉल्ट टाइमआउट (10 सेकंड) को संशोधित करने के लिए उपयोग करना चाह सकते हैं। हालांकि 16 सेकंड की कठिन सीमा है। यहाँ एक उदाहरण है:

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

आप चाहें तो चरित्र लिखने के बजाय WDOCC_KEEPALIVE के साथ IOCTL का उपयोग कर सकते हैं। दोनों विधियां मान्य हैं।


ओह, और मैं भूल गया - आप वास्तव में इसके लिए वॉचडॉग का उपयोग कर सकते हैं। यह बाहरी प्रोग्राम को कॉल करने का समर्थन करता है जो सिस्टम स्थिति की जांच और रिपोर्ट करेगा। इस मैन पेज
Krzysztof Adamski

धन्यवाद। मैं इसे काम कर रहा हूँ! Bcm2708_wdog को / etc / मॉड्यूल में जोड़ने के बाद मैंने अपनी समझ की जांच के लिए एक सरल VB.NET टेस्ट ऐप बनाया: डिम fs as New System.IO.FileStream (fn, IO.FileMode.Open) टाइमर रनिंग और fs.WriteByte शुरू करने के लिए ( एच) तो fs। फ़्लश () इसे दिल की धड़कन भेजने के लिए। बहुत अच्छा काम करता है!
गाइ

WDIOC_KEEPALIVE का संख्यात्मक प्रतिनिधित्व क्या है? कहीं भी नहीं मिल सकता।
फ्लैश थंडर

@FlashThunder: यह यहाँ परिभाषित किया गया है: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29 लेकिन आपको सटीक मान ज्ञात करने के लिए मैक्रोज़ के कुछ स्तरों को हल करना होगा। बेहतर तरीका यह है कि मूल्य को प्रिंट करने के लिए केवल सरल सी प्रोग्राम लिखें। बस <linux / watchdog.h> शामिल करें। मेरे सिस्टम पर यह है0x80045705
Krzysztof Adamski
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.