उद्धृत वाक्यांश एक चेतावनी नहीं है, यह केवल एक बयान है कि चीजें कैसे काम करती हैं।
सही तरीके से लिखे गए इंटरप्ट रूटीन का उपयोग करने millis()
या उसके micros()
भीतर आंतरिक रूप से कुछ भी गलत नहीं है।
दूसरी ओर, अनुचित तरीके से लिखी गई बाधित दिनचर्या में कुछ भी करना परिभाषा के अनुसार गलत है।
एक बाधा दिनचर्या जो अपना काम करने के लिए कुछ माइक्रोसेकंड से अधिक समय लेती है, सभी संभावना में, अनुचित रूप से लिखा गया है।
संक्षेप में: एक ठीक से लिखा बाधा दिनचर्या का कारण या के साथ मुठभेड़ मुद्दों नहीं होगा millis()
या micros()
।
संपादित करें: "क्यों micros ()" गलत तरीके से व्यवहार करना शुरू करता है ", जैसा कि" Arduino micros function " की परीक्षा में बताया गया है , वेबपेज, micros()
एक साधारण Uno पर कोड कार्यात्मक रूप से इसके बराबर है
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
यह एक चार-बाइट से रहित लंबी रिटर्न देता है जिसमें timer0_overflow_count
टाइमर और 0 काउंट रजिस्टर से तीन सबसे कम बाइट शामिल हैं ।
बाधित हैंडलर timer0_overflow_count
द्वारा प्रति मिलीसेकंड के बारे में एक बार वृद्धि की जाती है TIMER0_OVF_vect
, जैसा कि arduino millis webpage की एक परीक्षा में बताया गया है ।
एक बाधा हैंडलर शुरू होने से पहले, AVR हार्डवेयर बाधित होता है। यदि (उदाहरण के लिए) एक बाधा हैंडलर को पांच मिलीसेकंड के लिए चलाना था, तो अभी भी अक्षम होने के साथ, कम से कम चार टाइमर 0 ओवरफ्लो छूट जाएंगे। [Arduino सिस्टम में C कोड में लिखी गई रुकावटें रीएंन्टेंट (एक ही हैंडलर के भीतर कई ओवरलैपिंग निष्पादन को सही ढंग से संभालने में सक्षम) नहीं हैं, लेकिन एक रीइंक्रैंट असेंबली लैंग्वेज हैंडलर लिख सकता है, जो रीइनवेबल्स को बाधित करता है, इससे पहले कि यह समय लेने वाली प्रक्रिया शुरू हो।]
दूसरे शब्दों में, टाइमर ओवरफ्लो "स्टैक अप" नहीं करता है; जब भी पिछले ओवरफ्लो से बाधित होने से पहले एक अतिप्रवाह होता है, millis()
काउंटर एक मिलीसेकंड खो देता है, और timer0_overflow_count
बदले में विसंगति micros()
एक मिलीसेकंड भी गलत बनाता है।
व्यवधान प्रसंस्करण के लिए एक ऊपरी समय सीमा के रूप में "500 μs से कम" के बारे में, "बहुत लंबे समय के लिए टाइमर की रुकावट को रोकने के लिए", आप 1024 μs (जैसे 1020 μs) के नीचे जा सकते हैं और millis()
अभी भी काम करेंगे, अधिकांश समय। हालाँकि, मैं एक बाधा हैंडलर के बारे में सोचता हूं जो एक सुस्ती के रूप में 5 μs से अधिक लेता है, सुस्ती के रूप में 10 μs से अधिक, घोंघा की तरह 20 μs से अधिक।