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 setiap period milidetik, selamanya, hingga deinit() dipanggil atau timer diinisialisasi ulang.

  • Timer.ONE_SHOT. Callback dipicu sekali, period milidetik setelah init(), 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.