নিম্নলিখিত স্নিপেটগুলি টাইমারঅন লাইব্রেরি উত্স কোড থেকে এসেছে :
// 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 বাইট ডেটা অ্যাটমিক হয় না। সম্ভাব্য কাজের ক্ষেত্রগুলি হতে পারে:
- কল
detachInterrupt()
করার আগে টাইমারটি চলছে না তা নিশ্চিত হওয়ার জন্য সর্বদা কল করুনattachInterrupt()
, অর্থাৎ টাইমার 1 ডক্স পরিষ্কার করুন। - অথবা, টাইমার 1 সংশোধন করুন, টাইমার ওভারফ্লো ব্যাহত করার আগে সাময়িকভাবে অস্থায়ীভাবে বিরতি ঘটে
isrCallback = isr;
এটি কি অর্থবোধ করে, বা Timer1
উত্স বা ফাংশন পয়েন্টার অ্যাসাইনমেন্টগুলিতে এমন কিছু আছে যা আমি মিস করেছি?