3.3. المؤقتات الافتراضية

غطّت صفحة التوقيت الطوابع الزمنية والحلقات غير الحاجبة المدفوعة بـ time.ticks_diff(). أما المؤقت الافتراضي فهو الوجه الآخر للعملة: يطلب البرنامج من زمن التشغيل أن يستدعي دالة وفق جدول، ويستدعي زمن التشغيل دالة رد النداء دون أن يضطر البرنامج النصي إلى التحقق من الساعة بنفسه.

3.3.1. صف machine.Timer

يُنشئ machine.Timer مؤقتاً افتراضياً. يتطلب السلوك المتنقل بين المنافذ المعرّف الخاص -1؛ وكل شيء آخر -- الفترة، والوضع، ودالة رد النداء -- يُضبط من خلال وسائط مفتاحية:

from machine import Timer

def tick(t):
    print("tick")

tim = Timer(-1)
tim.init(period=100, callback=tick)   # 10 Hz

تُستدعى دالة رد النداء مثل أي استدعاء دالة عادي -- يمكنها تخصيص كائنات، وطباعة print()، واستدعاء شيفرة مكتبية أخرى دون أي قيود خاصة.

3.3.2. الدوري وذو اللقطة الواحدة

يتوفر وضعان:

  • Timer.PERIODIC (الافتراضي). تطلق دالة رد النداء كل period مللي ثانية، إلى الأبد، حتى يُستدعى deinit() أو يُعاد تهيئة المؤقت.

  • Timer.ONE_SHOT. تطلق دالة رد النداء مرة واحدة، بعد period مللي ثانية من init()، ثم يتوقف المؤقت.

Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)

deinit() يوقف مؤقتاً دورياً ويلغي أي دالة رد نداء معلقة:

tim.deinit()

3.3.3. متى تلجأ إلى المؤقت

تحل المؤقتات الافتراضية ونمط الاستطلاع ticks_diff() من التوقيت المشكلة نفسها من اتجاهين متعاكسين. تتحقق الحلقة المستطلِعة من الساعة في كل تكرار وتتصرف عند انقضاء وقت كافٍ؛ بينما يطلب المؤقت من زمن التشغيل إيقاظ البرنامج النصي عند انقضاء وقت كافٍ.

  • المستطلِع ticks_diff. يبقى كل شيء في مكان واحد -- تملك الحلقة التوقيت، ولا توجد دوال رد نداء إضافية لتتبعها. الأفضل للأعمال القصيرة المحددة جيداً التي تربط معاً عدة مهام مدفوعة بالوقت.

  • المؤقت الافتراضي. ينقل الجدول خارج متن الحلقة. الأفضل عندما تكون المهمة الدورية مستقلة عن التدفق الرئيسي (مؤشر LED نابض، عينة مستشعر دورية) ويتيح للحلقة الرئيسية قضاء وقتها على أعمال أخرى.

يستخدم كلا النهجين الساعة الأساسية نفسها ويعطيان الدقة نفسها عند فترات تبلغ مللي ثانية أو أكثر. وليس أي منهما مناسباً لتبديل دقيق للدبابيس أو توليد موجة دون المللي ثانية -- فزمن استجابة دالة رد النداء بحجم نبضة المجدوِل، وليس بالنانوثانية.