निम्नलिखित स्निपेट्स टिमरने पुस्तकालय स्रोत कोड से हैं :
// TimerOne.h:
void (*isrCallback)();
// TimerOne.cpp:
ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt
{
Timer1.isrCallback();
}
// TimerOne.cpp:
void TimerOne::attachInterrupt(void (*isr)(), long microseconds)
{
if(microseconds > 0) setPeriod(microseconds);
isrCallback = isr; // register the user's callback with the real ISR
TIMSK1 = _BV(TOIE1); // sets the timer overflow interrupt enable bit
resume();
}
प्रश्न: यदि टाइमर पहले से चल रहा है, और मुख्य प्रोग्राम कॉल करता है attachInterrupt()
, तो क्या फ़ंक्शन पॉइंटर असाइनमेंट के दौरान टाइमर की बाधा हो सकती है isrCallback = isr;
? फिर, भाग्यशाली समय के साथ, Timer1.isrCallback();
फ़ंक्शन पॉइंटर आंशिक रूप से नए पते के पुराने और आंशिक रूप से शामिल होगा, जिससे आईएसआर एक फर्जी स्थान पर कूद जाएगा?
मुझे लगता है कि यह मामला हो सकता है, क्योंकि फ़ंक्शन पॉइंटर्स निश्चित रूप से 1 बाइट से अधिक व्यापक हैं, और एक्सेस> 1 बाइट डेटा परमाणु नहीं है। संभव workarounds हो सकता है:
- हमेशा
detachInterrupt()
यह सुनिश्चित करने के लिए कॉल करें कि कॉलिंग से पहले टाइमर नहीं चल रहा हैattachInterrupt()
, अर्थात टाइमर 1 डॉक्स को स्पष्ट करें। - या, टाइमर को संशोधित करें, टाइमर ओवरफ्लो को अक्षम करने से कुछ समय पहले अस्थायी रूप से व्यवधान उत्पन्न होता है
isrCallback = isr;
क्या यह समझ में आता है, या कुछ Timer1
स्रोत या फ़ंक्शन पॉइंटर असाइनमेंट में कुछ है जो मैंने याद किया है?