3.3. Timer virtual¶
Halaman Timing membahas timestamp dan loop non-blocking yang digerakkan oleh time.ticks_diff(). Timer virtual adalah kebalikannya: perangkat lunak meminta runtime untuk memanggil sebuah fungsi sesuai jadwal, dan runtime memanggil callback tanpa skrip harus memeriksa jam sendiri.
3.3.1. Kelas machine.Timer¶
machine.Timer membuat timer virtual. Perilaku lintas-port memerlukan id khusus -1; semua yang lainnya -- period, mode, callback -- diatur melalui argumen kata kunci:
from machine import Timer
def tick(t):
print("tick")
tim = Timer(-1)
tim.init(period=100, callback=tick) # 10 Hz
Callback dipanggil seperti panggilan fungsi biasa -- ia dapat mengalokasikan objek, print(), dan memanggil kode pustaka lain tanpa batasan khusus apa pun.
3.3.2. Periodik dan one-shot¶
Dua mode tersedia:
Timer.PERIODIC(default). Callback dipicu setiapperiodmilidetik, selamanya, hinggadeinit()dipanggil atau timer diinisialisasi ulang.Timer.ONE_SHOT. Callback dipicu sekali,periodmilidetik setelahinit(), lalu timer berhenti.
Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)
deinit() menghentikan timer periodik dan membatalkan callback yang tertunda:
tim.deinit()
3.3.3. Kapan menggunakan timer¶
Timer virtual dan pola polling ticks_diff() dari Timing memecahkan masalah yang sama dari arah yang berlawanan. Loop polling memeriksa jam setiap iterasi dan bertindak ketika cukup waktu telah berlalu; timer meminta runtime untuk membangunkan skrip ketika cukup waktu telah berlalu.
Polled
ticks_diff. Semua tetap di satu tempat -- loop memiliki timing, tidak ada callback tambahan untuk dilacak. Terbaik untuk pekerjaan singkat dan terdefenisi dengan baik yang menghubungkan beberapa tugas berbasis waktu.Timer virtual. Memindahkan jadwal keluar dari tubuh loop. Terbaik ketika tugas periodik tidak bergantung pada aliran utama (LED heartbeat, sampel sensor periodik) dan membiarkan loop utama menghabiskan waktunya untuk pekerjaan lain.
Kedua pendekatan menggunakan jam dasar yang sama dan memberikan akurasi yang sama pada periode satu milidetik atau lebih. Tidak satu pun yang cocok untuk toggling pin presisi atau pembuatan gelombang sub-milidetik -- latensi callback berada pada orde tick penjadwal, bukan nanodetik.