time — aikaan liittyvät funktiot

time-moduuli tarjoaa funktioita nykyisen ajan ja päivämäärän hakemiseen, aikavälien mittaamiseen sekä viiveisiin.

Aikaepookki: Alif- ja i.MX RT -pohjaiset OpenMV Camit käyttävät POSIX-epookkia 1970-01-01 00:00:00 UTC. STM32-pohjaiset OpenMV Camit käyttävät epookkia 2000-01-01 00:00:00 UTC. Epookkivuosi voidaan selvittää ajonaikaisesti komennolla gmtime(0)[0].

Todellisen kalenteripäivämäärän ja -ajan ylläpito: Tämä edellyttää reaaliaikakelloa (RTC). OpenMV Cam -laitteessa järjestelmän ajan tarjoaa machine.RTC-objekti. Nykyinen kalenteriaika voidaan asettaa komennolla machine.RTC().datetime(tuple), ja sitä ylläpitää jokin seuraavista:

  • Varmistusparisto (valinnainen komponentti joissakin OpenMV Cameissa).

  • Verkkopohjainen aikaprotokolla, kuten ntptime (vaatii verkkoyhteyden).

  • Manuaalinen asetus jokaisella käynnistyksellä. RTC tyypillisesti säilyy pehmeiden uudelleenkäynnistysten yli, mutta menetetään virrankatkaisussa, ellei varmistusparistoa ole asennettu.

Jos kalenteriaikaa ei ylläpidetä, alla olevat funktiot, jotka viittaavat nykyiseen absoluuttiseen aikaan, eivät toimi odotetusti.

Funktiot

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]

Muuntaa sekunteina epookista (katso yllä) ilmaistun ajan secs 8-monikoksi, joka sisältää: (year, month, mday, hour, minute, second, weekday, yearday) Jos secs-arvoa ei anneta tai se on None, käytetään RTC:n nykyistä aikaa.

gmtime()-funktio palauttaa päivämäärä-aika-monikon UTC-ajassa, ja localtime() palauttaa päivämäärä-aika-monikon paikallisessa ajassa.

8-monikon merkintöjen muoto on:

  • year sisältää vuosisadan (esimerkiksi 2014).

  • month on 1-12

  • mday on 1-31

  • hour on 0-23

  • minute on 0-59

  • second on 0-59

  • weekday on 0-6 maanantaista sunnuntaihin

  • yearday on 1-366

time.mktime(date_time_tuple: Tuple[int, int, int, int, int, int, int, int]) int

Tämä on localtime-funktion käänteisfunktio. Sen argumentti on täysi 8-monikko, joka ilmaisee ajan localtime-funktion mukaisesti. Se palauttaa kokonaisluvun, joka on aikaepookista kuluneiden sekuntien määrä.

time.sleep(seconds: float) None

Nukkuu annetun määrän sekunteja. seconds voi olla liukuluku, jolloin nukutaan murto-osan verran sekunteja. Tarkempia tai pelkästään kokonaislukuihin perustuvia viiveitä varten käytä funktioita sleep_ms() ja sleep_us().

Funktion sleep() kutsuminen, mukaan lukien sleep(0), kutsuu taatusti odottavat takaisinkutsufunktiot.

time.sleep_ms(ms: int) None

Viivästyttää annetun määrän millisekunteja, arvon tulisi olla positiivinen tai 0.

Tämä funktio viivästyttää vähintään annetun määrän millisekunteja, mutta voi kestää sitä kauemmin, jos muuta käsittelyä on tehtävä, esimerkiksi keskeytyskäsittelijöitä tai muita säikeitä. Arvon 0 antaminen ms-parametrille sallii silti tämän muun käsittelyn tapahtua. Käytä sleep_us() tarkempia viiveitä varten.

Funktion sleep_ms() kutsuminen, mukaan lukien sleep_ms(0), kutsuu taatusti odottavat takaisinkutsufunktiot.

time.sleep_us(us: int) None

Viivästyttää annetun määrän mikrosekunteja, arvon tulisi olla positiivinen tai 0.

Tämä funktio pyrkii tarjoamaan tarkan viiveen, joka on vähintään us mikrosekuntia, mutta se voi kestää kauemmin, jos järjestelmällä on muuta korkeamman prioriteetin käsittelyä suoritettavana.

time.ticks_ms() int

Palauttaa kasvavan millisekuntilaskurin, jolla on mielivaltainen vertailupiste ja joka kiertyy ympäri jonkin arvon jälkeen.

Ympärikiertymisen arvoa ei paljasteta nimenomaisesti, mutta viittaamme siihen nimellä TICKS_MAX keskustelun yksinkertaistamiseksi. Arvojen jakso on TICKS_PERIOD = TICKS_MAX + 1. TICKS_PERIOD on taatusti kahden potenssi, mutta voi muutoin vaihdella portista toiseen. Samaa jaksoarvoa käytetään kaikissa funktioissa ticks_ms(), ticks_us() ja ticks_cpu() (yksinkertaisuuden vuoksi). Näin ollen nämä funktiot palauttavat arvon välillä [0 .. TICKS_MAX], rajat mukaan lukien, yhteensä TICKS_PERIOD arvoa. Huomaa, että vain ei-negatiivisia arvoja käytetään. Suurimmaksi osaksi näiden funktioiden palauttamia arvoja tulisi käsitellä läpinäkymättöminä. Ainoat niille käytettävissä olevat operaatiot ovat alla kuvatut funktiot ticks_diff() ja ticks_add().

Huomaa: Tavanomaisten matemaattisten operaatioiden (+, -) tai vertailuoperaattoreiden (<, <=, >, >=) suorittaminen suoraan näille arvoille johtaa virheelliseen tulokseen. Matemaattisten operaatioiden suorittaminen ja niiden tulosten välittäminen argumentteina funktioille ticks_diff() tai ticks_add() johtaa myös virheellisiin tuloksiin näistä jälkimmäisistä funktioista.

time.ticks_us() int

Aivan kuten ticks_ms() yllä, mutta mikrosekunteina.

time.ticks_cpu() int

Samankaltainen kuin ticks_ms() ja ticks_us(), mutta järjestelmän korkeimmalla mahdollisella resoluutiolla. Tämä on yleensä CPU:n kellopulsseja, ja siksi funktio on nimetty näin. Sen ei kuitenkaan tarvitse olla CPU-kello; sen sijaan voidaan käyttää jotakin muuta järjestelmässä saatavilla olevaa ajanlähdettä (esim. korkearesoluutioista ajastinta). Tämän funktion tarkkaa aikayksikköä (resoluutiota) ei ole määritelty time-moduulin tasolla, mutta tietyn portin dokumentaatio voi tarjota tarkempaa tietoa. Tämä funktio on tarkoitettu erittäin hienojakoiseen suorituskykytestaukseen tai erittäin tiukkoihin reaaliaikaisiin silmukoihin. Vältä sen käyttöä siirrettävässä koodissa. Se on käytettävissä kaikissa OpenMV Cameissa.

time.ticks_add(ticks: int, delta: int) int

Siirtää tick-arvoa annetulla määrällä, joka voi olla joko positiivinen tai negatiivinen. Annetulle ticks-arvolle tämä funktio mahdollistaa sen tick-arvon laskemisen delta tickiä ennen sitä tai sen jälkeen, noudattaen tick-arvojen modulaarisen aritmetiikan määritelmää (katso ticks_ms() yllä). ticks-parametrin on oltava suora tulos funktioiden ticks_ms(), ticks_us() tai ticks_cpu() kutsusta (tai aiemmasta ticks_add()-kutsusta). delta voi kuitenkin olla mielivaltainen kokonaisluku tai numeerinen lauseke. ticks_add() on hyödyllinen tapahtumien tai tehtävien määräaikojen laskemiseen. (Huomaa: sinun on käytettävä ticks_diff()-funktiota määräaikojen käsittelyyn.)

Esimerkkejä:

# 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

Mittaa tick-arvojen ero funktioiden ticks_ms(), ticks_us() tai ticks_cpu() palauttamien arvojen välillä etumerkillisenä arvona, joka voi kiertyä ympäri.

Argumenttien järjestys on sama kuin vähennysoperaattorilla, ticks_diff(ticks1, ticks2) tarkoittaa samaa kuin ticks1 - ticks2. Funktioiden ticks_ms() jne. palauttamat arvot voivat kuitenkin kiertyä ympäri, joten suoraan vähennyksen käyttäminen niihin tuottaa virheellisen tuloksen. Siksi ticks_diff() on tarpeen; se toteuttaa modulaarisen (tai tarkemmin sanottuna rengas-) aritmetiikan tuottaakseen oikean tuloksen myös ympärikiertyville arvoille (kunhan ne eivät ole liian kaukana toisistaan, katso alla). Funktio palauttaa etumerkillisen arvon välillä [-TICKS_PERIOD/2 .. TICKS_PERIOD/2-1] (tämä on tyypillinen alueen määritelmä kahden komplementin etumerkillisille binäärikokonaisluvuille). Jos tulos on negatiivinen, se tarkoittaa, että ticks1 tapahtui ajallisesti aiemmin kuin ticks2. Muuten se tarkoittaa, että ticks1 tapahtui ticks2:n jälkeen. Tämä pätee vain, jos ticks1 ja ticks2 ovat enintään TICKS_PERIOD/2-1 tickin päässä toisistaan. Jos tämä ei päde, palautetaan virheellinen tulos. Erityisesti, jos kaksi tick-arvoa ovat TICKS_PERIOD/2-1 tickin päässä, funktio palauttaa kyseisen arvon. Jos niiden välillä on kuitenkin kulunut TICKS_PERIOD/2 reaaliaikaista tickiä, funktio palauttaa sen sijaan -TICKS_PERIOD/2, eli tulosarvo kiertyy ympäri mahdollisten arvojen negatiiviselle alueelle.

Yllä olevien rajoitusten epävirallinen perustelu: Oletetaan, että olet lukittuna huoneeseen ilman keinoa seurata ajan kulumista lukuun ottamatta tavallista 12-loven kelloa. Jos siis katsot kellotaulua nyt etkä katso uudelleen 13 tuntiin (esim. jos vaivut pitkään uneen), niin kun lopulta katsot taas, sinusta voi tuntua, että vain 1 tunti on kulunut. Tämän virheen välttämiseksi katso kelloa säännöllisesti. Sovelluksesi tulisi tehdä samoin. ”Liian pitkä uni” -vertaus pätee suoraan myös sovelluksen toimintaan: älä anna sovelluksesi suorittaa mitään yksittäistä tehtävää liian kauan. Suorita tehtäviä vaiheittain ja tee ajanpitoa niiden välissä.

ticks_diff() on suunniteltu mukautumaan erilaisiin käyttötapoihin, joihin kuuluvat:

  • Kysely aikakatkaisulla. Tässä tapauksessa tapahtumien järjestys tunnetaan, ja käsittelet vain ticks_diff()-funktion positiivisia tuloksia:

    # 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
    
  • Tapahtumien ajoittaminen. Tässä tapauksessa ticks_diff()-tulos voi olla negatiivinen, jos tapahtuma on myöhässä:

    # 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)
    

Huomaa: Älä välitä time()-arvoja funktiolle ticks_diff(), vaan käytä niihin tavallisia matemaattisia operaatioita. Huomaa kuitenkin, että time() voi (ja tulee) myös ylivuotamaan. Tämä tunnetaan nimellä https://en.wikipedia.org/wiki/Year_2038_problem .

time.time() int

Palauttaa kokonaislukuna sekuntien määrän epookista, olettaen että taustalla oleva RTC on asetettu ja sitä ylläpidetään yllä kuvatulla tavalla. Jos RTC:tä ei ole asetettu, tämä funktio palauttaa sekuntien määrän porttikohtaisesta ajan vertailupisteestä (sulautetuissa korteissa, joissa ei ole paristovarmistettua RTC:tä, yleensä käynnistyksestä tai uudelleenkäynnistyksestä). Jos haluat kehittää siirrettävän MicroPython-sovelluksen, et saa luottaa tähän funktioon sekuntia tarkemman tarkkuuden tarjoamisessa. Jos tarvitset suurempaa tarkkuutta, absoluuttisia aikaleimoja, käytä time_ns(). Jos suhteelliset ajat ovat hyväksyttäviä, käytä funktioita ticks_ms() ja ticks_us(). Jos tarvitset kalenteriaikaa, gmtime() tai localtime() ilman argumenttia on parempi valinta.

Ero CPythoniin

CPythonissa tämä funktio palauttaa sekuntien määrän Unix-epookista (1970-01-01 00:00 UTC) liukulukuna, yleensä mikrosekunnin tarkkuudella. OpenMV Cam -laitteessa se palauttaa kokonaisluvun yhden sekunnin tarkkuudella – laitteisto ei voi esittää sekä pitkää aika-aluetta että sekunnin alittavaa tarkkuutta liukuluvussa – ja epookki vaihtelee korteittain (katso Aikaepookki yllä). Ilman asetettua paristovarmistettua RTC:tä se laskee sen sijaan sekunteja käynnistyksestä tai uudelleenkäynnistyksestä.

time.time_ns() int

Samankaltainen kuin time(), mutta palauttaa nanosekunnit epookista kokonaislukuna (yleensä suuri kokonaisluku, joten varaa muistia keosta).

Konstruktorit

class time.clock

Palauttaa kello-objektin.

Metodit

tick() None

Aloittaa kuluneen ajan seuraamisen.

fps() float

Lopettaa kuluneen ajan seuraamisen ja palauttaa nykyisen FPS-arvon (kuvaa sekunnissa).

Kutsu aina tick ensin ennen tämän funktion kutsumista.

avg() float

Lopettaa kuluneen ajan seuraamisen ja palauttaa nykyisen keskimääräisen kuluneen ajan millisekunteina.

Kutsu aina tick ensin ennen tämän funktion kutsumista.

reset() None

Nollaa kello-objektin.