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, a localtime() 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() i sleep_us().

Pozivanje sleep(), uključujući sleep(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ći sleep_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 funkcije ticks_diff() i ticks_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() ili ticks_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() i ticks_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 modula time, 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 funkcija ticks_ms(), ticks_us() ili ticks_cpu() (ili prethodnog poziva funkcije ticks_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 funkciju ticks_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() ili ticks_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 kao ticks1 - ticks2. Međutim, vrijednosti koje vraćaju funkcije ticks_ms() itd. mogu se omotati, pa će izravno korištenje oduzimanja na njima proizvesti neispravan rezultat. Zato je potrebna ticks_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() funkciji ticks_diff(), na njima biste trebali koristiti uobičajene matematičke operacije. No imajte na umu da time() 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 funkcije ticks_ms() i ticks_us(). Ako trebate kalendarsko vrijeme, gmtime() ili localtime() 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.

time.time_ns() int

Slično funkciji time(), ali vraća nanosekunde od epohe, kao cijeli broj (obično veliki cijeli broj, pa će alocirati na gomili).

Konstruktori

class time.clock

Vraća objekt sata.

Metode

tick() None

Započinje praćenje proteklog vremena.

fps() float

Zaustavlja praćenje proteklog vremena i vraća trenutni FPS (sličica po sekundi).

Uvijek pozovite tick prije pozivanja ove funkcije.

avg() float

Zaustavlja praćenje proteklog vremena i vraća trenutno prosječno proteklo vrijeme u milisekundama.

Uvijek pozovite tick prije pozivanja ove funkcije.

reset() None

Resetira objekt sata.