time — funkcije povezane s vremenom¶
Modul time pruža funkcije za dohvaćanje trenutnog vremena i datuma, mjerenje vremenskih intervala i za odgode.
Vremenska epoha: OpenMV Cam temeljene na Alif i i.MX RT koriste POSIX epohu 1970-01-01 00:00:00 UTC. OpenMV Cam temeljene na STM32 koriste epohu 2000-01-01 00:00:00 UTC. Godina epohe može se odrediti tijekom izvođenja pomoću gmtime(0)[0].
Održavanje stvarnog kalendarskog datuma/vremena: Ovo zahtijeva sat stvarnog vremena (RTC). Na OpenMV Cam sistemsko vrijeme pruža objekt machine.RTC. Trenutno kalendarsko vrijeme može se postaviti pomoću machine.RTC().datetime(tuple) i održava se jednim od sljedećih načina:
Pomoćna baterija (neobavezna komponenta na nekim OpenMV Cam).
Mrežni vremenski protokol poput
ntptime(zahtijeva mrežnu vezu).Ručno postavljanje pri svakom uključivanju. RTC se tada obično održava tijekom mekih ponovnih pokretanja, ali se gubi pri gubitku napajanja osim ako je ugrađena pomoćna baterija.
Ako se kalendarsko vrijeme ne održava, funkcije navedene u nastavku koje se referiraju na trenutno apsolutno vrijeme neće se ponašati kako se očekuje.
Funkcije¶
- 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]¶
Pretvara vrijeme secs izraženo u sekundama od epohe (vidi gore) u 8-torku koja sadrži:
(year, month, mday, hour, minute, second, weekday, yearday)Ako secs nije naveden ili je None, tada se koristi trenutno vrijeme iz RTC-a.Funkcija
gmtime()vraća n-torku datuma i vremena u UTC-u, alocaltime()vraća n-torku datuma i vremena u lokalnom vremenu.Format unosa u 8-torki je:
year uključuje stoljeće (na primjer 2014).
month je 1-12
mday je 1-31
hour je 0-23
minute je 0-59
second je 0-59
weekday je 0-6 za pon-ned
yearday je 1-366
- time.mktime(date_time_tuple: Tuple[int, int, int, int, int, int, int, int]) int¶
Ovo je inverzna funkcija od localtime. Njezin argument je puna 8-torka koja izražava vrijeme prema localtime. Vraća cijeli broj koji predstavlja broj sekundi od vremenske epohe.
- time.sleep(seconds: float) None¶
Spava zadani broj sekundi. seconds može biti decimalni broj, za spavanje frakcijskog broja sekundi. Za finije ili isključivo cjelobrojne odgode koristite funkcije
sleep_ms()isleep_us().Pozivanje
sleep(), uključujućisleep(0), zajamčeno poziva povratne pozive na čekanju.
- time.sleep_ms(ms: int) None¶
Odgađa zadani broj milisekundi, treba biti pozitivan ili 0.
Ova funkcija odgodit će barem zadani broj milisekundi, ali može potrajati i dulje ako se mora obaviti drugo procesiranje, na primjer rukovatelji prekida ili druge dretve. Prosljeđivanje 0 za ms i dalje će omogućiti odvijanje tog drugog procesiranja. Za preciznije odgode koristite
sleep_us().Pozivanje
sleep_ms(), uključujućisleep_ms(0), zajamčeno poziva povratne pozive na čekanju.
- time.sleep_us(us: int) None¶
Odgađa zadani broj mikrosekundi, treba biti pozitivan ili 0.
Ova funkcija pokušava pružiti točnu odgodu od barem us mikrosekundi, ali može potrajati dulje ako sustav ima drugo procesiranje višeg prioriteta za obaviti.
- time.ticks_ms() int¶
Vraća rastući brojač milisekundi s proizvoljnom referentnom točkom, koji se omata nakon neke vrijednosti.
Vrijednost omatanja nije eksplicitno izložena, ali ćemo je radi pojednostavljenja rasprave nazivati TICKS_MAX. Period vrijednosti je TICKS_PERIOD = TICKS_MAX + 1. Zajamčeno je da je TICKS_PERIOD potencija broja dva, ali inače se može razlikovati od porta do porta. Ista vrijednost perioda koristi se za sve funkcije
ticks_ms(),ticks_us(),ticks_cpu()(radi jednostavnosti). Stoga će ove funkcije vraćati vrijednost u rasponu [0 .. TICKS_MAX], uključivo, ukupno TICKS_PERIOD vrijednosti. Imajte na umu da se koriste samo nenegativne vrijednosti. Uglavnom biste vrijednosti koje vraćaju ove funkcije trebali tretirati kao neprozirne. Jedine operacije dostupne za njih su funkcijeticks_diff()iticks_add()opisane u nastavku.Napomena: Izvođenje standardnih matematičkih operacija (+, -) ili relacijskih operatora (<, <=, >, >=) izravno na ovim vrijednostima dovest će do neispravnog rezultata. Izvođenje matematičkih operacija i zatim prosljeđivanje njihovih rezultata kao argumenata funkcijama
ticks_diff()iliticks_add()također će dovesti do neispravnih rezultata iz potonjih funkcija.
- time.ticks_us() int¶
Baš kao
ticks_ms()gore, ali u mikrosekundama.
- time.ticks_cpu() int¶
Slično funkcijama
ticks_ms()iticks_us(), ali s najvišom mogućom razlučivošću u sustavu. To je obično CPU takt, i zato je funkcija tako nazvana. No ne mora biti CPU takt, umjesto njega može se koristiti neki drugi vremenski izvor dostupan u sustavu (npr. mjerač vremena visoke razlučivosti). Točna vremenska jedinica (razlučivost) ove funkcije nije specificirana na razini modulatime, ali dokumentacija za pojedini port može pružiti specifičnije informacije. Ova funkcija namijenjena je za vrlo fino mjerenje performansi ili vrlo uske petlje u stvarnom vremenu. Izbjegavajte je koristiti u prenosivom kodu. Dostupna je na svim OpenMV Cam.
- time.ticks_add(ticks: int, delta: int) int¶
Pomiče vrijednost otkucaja (ticks) za zadani broj, koji može biti pozitivan ili negativan. Za zadanu vrijednost ticks, ova funkcija omogućuje izračun vrijednosti otkucaja delta otkucaja prije ili nakon nje, slijedeći definiciju vrijednosti otkucaja modularne aritmetike (vidi
ticks_ms()gore). Parametar ticks mora biti izravan rezultat poziva funkcijaticks_ms(),ticks_us()iliticks_cpu()(ili prethodnog poziva funkcijeticks_add()). Međutim, delta može biti proizvoljan cijeli broj ili numerički izraz.ticks_add()je koristan za izračun rokova za događaje/zadatke. (Napomena: za rad s rokovima morate koristiti funkcijuticks_diff().)Primjeri:
# 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¶
Mjeri razliku otkucaja između vrijednosti koje vraćaju funkcije
ticks_ms(),ticks_us()iliticks_cpu(), kao predznačenu vrijednost koja se može omotati.Redoslijed argumenata je isti kao za operator oduzimanja,
ticks_diff(ticks1, ticks2)ima isto značenje kaoticks1 - ticks2. Međutim, vrijednosti koje vraćaju funkcijeticks_ms()itd. mogu se omotati, pa će izravno korištenje oduzimanja na njima proizvesti neispravan rezultat. Zato je potrebnaticks_diff(), koja implementira modularnu (ili točnije, prstenastu) aritmetiku za proizvodnju ispravnog rezultata čak i za omotane vrijednosti (sve dok nisu predaleko jedna od druge, vidi u nastavku). Funkcija vraća predznačenu vrijednost u rasponu [-TICKS_PERIOD/2 .. TICKS_PERIOD/2-1] (to je tipična definicija raspona za predznačene binarne cijele brojeve u zapisu dvojnog komplementa). Ako je rezultat negativan, znači da se ticks1 dogodio vremenski ranije od ticks2. U suprotnom znači da se ticks1 dogodio nakon ticks2. To vrijedi samo ako su ticks1 i ticks2 udaljeni jedan od drugog za najviše TICKS_PERIOD/2-1 otkucaja. Ako to ne vrijedi, vratit će se neispravan rezultat. Konkretno, ako su dvije vrijednosti otkucaja udaljene za TICKS_PERIOD/2-1 otkucaja, funkcija će vratiti tu vrijednost. Međutim, ako je između njih prošlo TICKS_PERIOD/2 otkucaja stvarnog vremena, funkcija će umjesto toga vratiti -TICKS_PERIOD/2, tj. vrijednost rezultata omotat će se u negativni raspon mogućih vrijednosti.Neformalno obrazloženje gornjih ograničenja: Pretpostavimo da ste zaključani u sobi bez ikakvog načina za praćenje protoka vremena osim standardnog sata s 12 zareza. Tada ako sada pogledate brojčanik i ne pogledate ponovno još 13 sati (npr. ako utonete u dugi san), kada konačno ponovno pogledate, može vam se činiti da je prošao samo 1 sat. Da biste izbjegli ovu pogrešku, samo redovito gledajte sat. Vaša aplikacija trebala bi činiti isto. Metafora „predugog spavanja” također se izravno preslikava na ponašanje aplikacije: ne dopustite da vaša aplikacija izvodi bilo koji pojedinačni zadatak predugo. Izvodite zadatke u koracima i obavljajte mjerenje vremena između njih.
ticks_diff()je dizajniran za prilagodbu raznim obrascima korištenja, među kojima su:Ispitivanje (polling) s istekom vremena. U ovom slučaju redoslijed događaja je poznat i baratat ćete samo s pozitivnim rezultatima funkcije
ticks_diff()# 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
Raspoređivanje događaja. U ovom slučaju rezultat funkcije
ticks_diff()može biti negativan ako događaj kasni:# 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)
Napomena: Ne prosljeđujte vrijednosti funkcije
time()funkcijiticks_diff(), na njima biste trebali koristiti uobičajene matematičke operacije. No imajte na umu datime()također može (i hoće) preteći. To je poznato kao https://en.wikipedia.org/wiki/Year_2038_problem .
- time.time() int¶
Vraća broj sekundi, kao cijeli broj, od epohe, pod pretpostavkom da je pripadni RTC postavljen i održavan kako je opisano gore. Ako RTC nije postavljen, ova funkcija vraća broj sekundi od referentne točke u vremenu specifične za port (za ugrađene pločice bez RTC-a s pomoćnom baterijom, obično od uključivanja ili ponovnog pokretanja). Ako želite razviti prenosivu MicroPython aplikaciju, ne biste se trebali oslanjati na ovu funkciju da pruži preciznost veću od jedne sekunde. Ako trebate veću preciznost, apsolutne vremenske oznake, koristite
time_ns(). Ako su prihvatljiva relativna vremena, tada koristite funkcijeticks_ms()iticks_us(). Ako trebate kalendarsko vrijeme,gmtime()ililocaltime()bez argumenta bolji su izbor.Razlika u odnosu na CPython
U CPythonu ova funkcija vraća broj sekundi od Unix epohe (1970-01-01 00:00 UTC) kao decimalnu vrijednost, obično s mikrosekundnom preciznošću. Na OpenMV Cam vraća cijeli broj s preciznošću od jedne sekunde – hardver ne može u decimalnom broju predstaviti i dugi vremenski raspon i pod-sekundnu preciznost – a epoha se razlikuje ovisno o pločici (vidi Vremenska epoha gore). Bez RTC-a s pomoćnom baterijom koji je postavljen, umjesto toga broji sekunde od uključivanja/ponovnog pokretanja.
Konstruktori¶
- class time.clock¶
Vraća objekt sata.
Metode¶
- fps() float¶
Zaustavlja praćenje proteklog vremena i vraća trenutni FPS (sličica po sekundi).
Uvijek pozovite
tickprije pozivanja ove funkcije.