time — zamanla ilgili işlevler¶
time modülü, geçerli saati ve tarihi almak, zaman aralıklarını ölçmek ve gecikmeler için işlevler sağlar.
Zaman Başlangıcı (Epoch): Alif ve i.MX RT tabanlı OpenMV Cam’ler 1970-01-01 00:00:00 UTC POSIX başlangıcını kullanır. STM32 tabanlı OpenMV Cam’ler ise 2000-01-01 00:00:00 UTC başlangıcını kullanır. Başlangıç yılı çalışma zamanında gmtime(0)[0] ile belirlenebilir.
Gerçek takvim tarih/saatini koruma: Bu, bir Gerçek Zamanlı Saat (RTC) gerektirir. OpenMV Cam üzerinde sistem saati machine.RTC nesnesi tarafından sağlanır. Geçerli takvim saati machine.RTC().datetime(tuple) ile ayarlanabilir ve aşağıdakilerden biri tarafından korunur:
Bir yedek pil (bazı OpenMV Cam’lerde isteğe bağlı bir bileşen).
ntptimegibi ağ tabanlı bir zaman protokolü (bir ağ bağlantısı gerektirir).Her açılışta manuel olarak ayarlama. RTC genellikle yazılımsal sıfırlamalar (soft reset) boyunca korunur, ancak bir yedek pil takılı değilse güç kaybında kaybedilir.
Takvim saati korunmazsa, geçerli mutlak zamana başvuran aşağıdaki işlevler beklenildiği gibi davranmaz.
İşlevler¶
- time.gmtime(secs: int | None = None) Tuple[int, int, int, int, int, int, int, int]¶
- time.localtime(secs: int | None = None) Tuple[int, int, int, int, int, int, int, int]¶
Başlangıçtan (Epoch, yukarıya bakın) bu yana saniye cinsinden ifade edilen secs zamanını, şunları içeren 8 öğeli bir demete dönüştürür:
(year, month, mday, hour, minute, second, weekday, yearday). secs sağlanmazsa veya None ise, RTC’den alınan geçerli saat kullanılır.gmtime()işlevi UTC cinsinden bir tarih-saat demeti döndürür,localtime()ise yerel saat cinsinden bir tarih-saat demeti döndürür.8 öğeli demetteki girişlerin biçimi şöyledir:
year, yüzyılı da içerir (örneğin 2014).
month 1-12 arasındadır
mday 1-31 arasındadır
hour 0-23 arasındadır
minute 0-59 arasındadır
second 0-59 arasındadır
weekday Pzt-Paz için 0-6 arasındadır
yearday 1-366 arasındadır
- time.mktime(date_time_tuple: Tuple[int, int, int, int, int, int, int, int]) int¶
Bu, localtime işlevinin tersidir. Argümanı, bir zamanı localtime biçiminde ifade eden tam 8 öğeli bir demettir. Zaman başlangıcından bu yana geçen saniye sayısı olan bir tamsayı döndürür.
- time.sleep(seconds: float) None¶
Verilen saniye sayısı kadar uyur. seconds bir kayan noktalı sayı olabilir; bu durumda kesirli sayıda saniye uyunur. Daha ince ayarlı veya yalnızca tamsayı gecikmeler için
sleep_ms()vesleep_us()işlevlerini kullanın.sleep(0)dahil olmak üzeresleep()çağrısının, bekleyen geri çağırma (callback) işlevlerini çağıracağı garanti edilir.
- time.sleep_ms(ms: int) None¶
Verilen milisaniye sayısı kadar gecikir; pozitif veya 0 olmalıdır.
Bu işlev en az verilen milisaniye kadar gecikir, ancak başka işlemler (örneğin kesme işleyicileri veya diğer iş parçacıkları) gerçekleşmesi gerekiyorsa daha uzun sürebilir. ms için 0 geçilmesi yine de bu diğer işlemlerin gerçekleşmesine olanak tanır. Daha hassas gecikmeler için
sleep_us()kullanın.sleep_ms(0)dahil olmak üzeresleep_ms()çağrısının, bekleyen geri çağırma (callback) işlevlerini çağıracağı garanti edilir.
- time.sleep_us(us: int) None¶
Verilen mikrosaniye sayısı kadar gecikir; pozitif veya 0 olmalıdır.
Bu işlev en az us mikrosaniyelik doğru bir gecikme sağlamaya çalışır, ancak sistemin gerçekleştirmesi gereken başka, daha yüksek öncelikli işlemler varsa daha uzun sürebilir.
- time.ticks_ms() int¶
Keyfi bir referans noktasına sahip, belirli bir değerden sonra başa saran, artan bir milisaniye sayacı döndürür.
Başa sarma değeri açıkça açığa çıkarılmaz, ancak tartışmayı kolaylaştırmak için ona TICKS_MAX diyeceğiz. Değerlerin periyodu TICKS_PERIOD = TICKS_MAX + 1 şeklindedir. TICKS_PERIOD değerinin ikinin bir kuvveti olacağı garanti edilir, ancak bunun dışında porttan porta değişebilir. (Basitlik adına) tüm
ticks_ms(),ticks_us(),ticks_cpu()işlevleri için aynı periyot değeri kullanılır. Dolayısıyla bu işlevler [0 .. TICKS_MAX] aralığında, sınırlar dahil, toplam TICKS_PERIOD değer döndürür. Yalnızca negatif olmayan değerlerin kullanıldığını unutmayın. Çoğunlukla, bu işlevlerin döndürdüğü değerleri opak (anlamı dışarıdan görünmeyen) değerler olarak ele almalısınız. Bunlar için kullanılabilecek tek işlemler, aşağıda açıklananticks_diff()veticks_add()işlevleridir.Not: Bu değerler üzerinde doğrudan standart matematiksel işlemler (+, -) veya ilişkisel operatörler (<, <=, >, >=) gerçekleştirmek geçersiz sonuçlara yol açar. Matematiksel işlemler gerçekleştirmek ve ardından sonuçlarını
ticks_diff()veyaticks_add()işlevlerine argüman olarak geçirmek de bu işlevlerden geçersiz sonuçlar alınmasına neden olur.
- time.ticks_us() int¶
Yukarıdaki
ticks_ms()gibi, ancak mikrosaniye cinsinden.
- time.ticks_cpu() int¶
ticks_ms()veticks_us()işlevlerine benzer, ancak sistemdeki olası en yüksek çözünürlükle. Bu genellikle CPU saatleridir ve işlevin bu şekilde adlandırılmasının nedeni budur. Ancak bunun bir CPU saati olması gerekmez; bunun yerine sistemde mevcut başka bir zamanlama kaynağı (örneğin yüksek çözünürlüklü bir zamanlayıcı) kullanılabilir. Bu işlevin tam zamanlama birimi (çözünürlüğü)timemodülü düzeyinde belirtilmemiştir, ancak belirli bir portun belgeleri daha spesifik bilgi sağlayabilir. Bu işlev çok ince ayarlı performans karşılaştırması veya çok sıkı gerçek zamanlı döngüler için tasarlanmıştır. Taşınabilir kodda kullanmaktan kaçının. Tüm OpenMV Cam’lerde kullanılabilir.
- time.ticks_add(ticks: int, delta: int) int¶
Bir ticks değerini, pozitif veya negatif olabilen belirli bir sayı kadar ötelemektedir. Verilen bir ticks değeriyle, bu işlev tick değerlerinin modüler-aritmetik tanımını izleyerek (yukarıdaki
ticks_ms()öğesine bakın) ondan delta tick önceki veya sonraki ticks değerini hesaplamaya olanak tanır. ticks parametresi,ticks_ms(),ticks_us()veyaticks_cpu()işlevlerine yapılan bir çağrının (ya da önceki birticks_add()çağrısının) doğrudan sonucu olmalıdır. Ancak delta, keyfi bir tamsayı veya sayısal ifade olabilir.ticks_add(), olaylar/görevler için son tarihleri (deadline) hesaplamak açısından yararlıdır. (Not: son tarihlerle çalışmak içinticks_diff()işlevini kullanmalısınız.)Örnekler:
# Find out what ticks value there was 100ms ago print(ticks_add(time.ticks_ms(), -100)) # Calculate deadline for operation and test for it deadline = ticks_add(time.ticks_ms(), 200) while ticks_diff(deadline, time.ticks_ms()) > 0: do_a_little_of_something() # Find out TICKS_MAX used by this port print(ticks_add(0, -1))
- time.ticks_diff(ticks1: int, ticks2: int) int¶
ticks_ms(),ticks_us()veyaticks_cpu()işlevlerinden döndürülen değerler arasındaki tick farkını, başa sarabilen işaretli bir değer olarak ölçer.Argüman sırası çıkarma operatörüyle aynıdır;
ticks_diff(ticks1, ticks2),ticks1 - ticks2ile aynı anlama gelir. Ancakticks_ms()vb. işlevlerin döndürdüğü değerler başa sarabilir, bu nedenle bunlar üzerinde doğrudan çıkarma kullanmak yanlış sonuç üretir.ticks_diff()işlevine bu yüzden ihtiyaç vardır; başa sarma değerleri için bile (aralarındaki mesafe çok büyük olmadığı sürece, aşağıya bakın) doğru sonuç üretmek için modüler (daha spesifik olarak halka) aritmetiği uygular. İşlev, [-TICKS_PERIOD/2 .. TICKS_PERIOD/2-1] aralığında işaretli bir değer döndürür (bu, iki’nin tümleyeni işaretli ikili tamsayılar için tipik bir aralık tanımıdır). Sonuç negatifse, ticks1 zaman olarak ticks2‘den daha erken gerçekleşmiştir. Aksi takdirde, ticks1, ticks2‘den sonra gerçekleşmiştir. Bu yalnızca ticks1 ve ticks2 birbirinden en fazla TICKS_PERIOD/2-1 tick uzaktaysa geçerlidir. Bu koşul sağlanmazsa, yanlış sonuç döndürülür. Özellikle, iki tick değeri TICKS_PERIOD/2-1 tick uzaktaysa, işlev bu değeri döndürür. Ancak aralarında gerçek zamanlı TICKS_PERIOD/2 tick geçmişse, işlev bunun yerine -TICKS_PERIOD/2 döndürür; yani sonuç değeri olası değerlerin negatif aralığına başa sarar.Yukarıdaki kısıtlamaların gayri resmi gerekçesi: Diyelim ki, zamanın geçişini izlemek için standart 12 çentikli bir saat dışında hiçbir aracınız olmadan bir odaya kilitlendiniz. O halde, şimdi kadrana bakıp 13 saat boyunca tekrar bakmazsanız (örneğin uzun bir uykuya dalarsanız), sonunda tekrar baktığınızda yalnızca 1 saat geçmiş gibi görünebilir. Bu hatadan kaçınmak için saate düzenli olarak bakmanız yeterlidir. Uygulamanız da aynısını yapmalıdır. “Çok uzun uyku” mecazı doğrudan uygulama davranışına da eşlenir: uygulamanızın tek bir görevi çok uzun süre çalıştırmasına izin vermeyin. Görevleri adımlar halinde çalıştırın ve aralarında zaman tutma işlemi yapın.
ticks_diff(), aralarında şunların da bulunduğu çeşitli kullanım kalıplarını karşılamak üzere tasarlanmıştır:Zaman aşımlı yoklama (polling). Bu durumda olayların sırası bilinir ve yalnızca
ticks_diff()işlevinin pozitif sonuçlarıyla ilgilenirsiniz:# Wait for GPIO pin to be asserted, but at most 500us start = time.ticks_us() while pin.value() == 0: if time.ticks_diff(time.ticks_us(), start) > 500: raise TimeoutError
Olay zamanlama. Bu durumda, bir olay gecikmişse
ticks_diff()sonucu negatif olabilir:# This code snippet is not optimized now = time.ticks_ms() scheduled_time = task.scheduled_time() if ticks_diff(scheduled_time, now) > 0: print("Too early, let's nap") sleep_ms(ticks_diff(scheduled_time, now)) task.run() elif ticks_diff(scheduled_time, now) == 0: print("Right at time!") task.run() elif ticks_diff(scheduled_time, now) < 0: print("Oops, running late, tell task to run faster!") task.run(run_faster=true)
Not:
time()değerleriniticks_diff()işlevine geçirmeyin; bunlar üzerinde normal matematiksel işlemler kullanmalısınız. Ancaktime()değerinin de taşabileceğini (ve taşacağını) unutmayın. Bu, https://en.wikipedia.org/wiki/Year_2038_problem olarak bilinir.
- time.time() int¶
Temeldeki RTC’nin yukarıda açıklandığı gibi ayarlandığını ve korunduğunu varsayarak, Başlangıçtan (Epoch) bu yana geçen saniye sayısını bir tamsayı olarak döndürür. Bir RTC ayarlanmamışsa, bu işlev porta özgü bir referans zaman noktasından bu yana geçen saniye sayısını döndürür (pille beslenen RTC’si olmayan gömülü kartlar için, genellikle açılıştan veya sıfırlamadan bu yana). Taşınabilir bir MicroPython uygulaması geliştirmek istiyorsanız, bu işlevin saniyeden yüksek hassasiyet sağlamasına güvenmemelisiniz. Daha yüksek hassasiyet, mutlak zaman damgaları gerekiyorsa,
time_ns()işlevini kullanın. Göreli zamanlar kabul edilebilirseticks_ms()veticks_us()işlevlerini kullanın. Takvim zamanı gerekiyorsa, argümansızgmtime()veyalocaltime()daha iyi bir seçimdir.CPython’dan Farkı
CPython’da bu işlev, Unix başlangıcından (1970-01-01 00:00 UTC) bu yana geçen saniye sayısını, genellikle mikrosaniye hassasiyetiyle, bir kayan noktalı değer olarak döndürür. OpenMV Cam üzerinde ise bir saniye hassasiyetiyle bir tamsayı döndürür – donanım, hem uzun bir zaman aralığını hem de saniye altı hassasiyeti bir kayan noktalı sayıda gösteremez – ve başlangıç karta göre farklılık gösterir (yukarıdaki Zaman Başlangıcı bölümüne bakın). Ayarlanmış, pille beslenen bir RTC olmadan, bunun yerine açılıştan/sıfırlamadan bu yana geçen saniyeleri sayar.
Yapıcılar¶
- class time.clock¶
Bir clock nesnesi döndürür.
Yöntemler¶
- fps() float¶
Geçen zamanın takibini durdurur ve geçerli FPS (saniye başına çerçeve) değerini döndürür.
Bu işlevi çağırmadan önce her zaman önce
tickçağırın.