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, jalocaltime()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()jasleep_us().Funktion
sleep()kutsuminen, mukaan lukiensleep(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 lukiensleep_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()jaticks_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 funktiotticks_diff()jaticks_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()taiticks_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()jaticks_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ääriteltytime-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 funktioidenticks_ms(),ticks_us()taiticks_cpu()kutsusta (tai aiemmastaticks_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()taiticks_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 kuinticks1 - ticks2. Funktioidenticks_ms()jne. palauttamat arvot voivat kuitenkin kiertyä ympäri, joten suoraan vähennyksen käyttäminen niihin tuottaa virheellisen tuloksen. Siksiticks_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 funktiolleticks_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ä funktioitaticks_ms()jaticks_us(). Jos tarvitset kalenteriaikaa,gmtime()tailocaltime()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ä.
Konstruktorit¶
- class time.clock¶
Palauttaa kello-objektin.
Metodit¶
- fps() float¶
Lopettaa kuluneen ajan seuraamisen ja palauttaa nykyisen FPS-arvon (kuvaa sekunnissa).
Kutsu aina
tickensin ennen tämän funktion kutsumista.