3.1. Mikrokontrollerit

OpenMV Cam toimii mikrokontrollerilla (MCU): yhdellä sirulla, joka yhdistää suorittimen, työmuistin (RAM), ohjelmamuistin (flash-muisti) ja joukon oheislaitteita – laitteistolohkoja, jotka ovat vuorovaikutuksessa ulkomaailman kanssa.

Oheislaitteet ovat kiinnostavin osa. Jokainen niistä on yhteen tehtävään omistettu piinpala: nastan asettaminen ylös tai alas, analogisen jännitteen mittaaminen, tavujen kellottaminen sarjaväylälle. Suoritin määrittää ja lukee jokaisen oheislaitteen rekisterien kautta – kiinteiden muistiosoitteiden, joita laitteisto tarkkailee ja päivittää.

MicroPython kääräisee nämä rekisterit luokiksi machine-moduulin sisällä. machine.Pin(...) palauttaa olion, joka ohjaa yleiskäyttöistä tulo-/lähtönastaa (GPIO) – johdinta, jonka siru voi pitää ylhäällä (noin 3,3 V) tai alhaalla (noin 0 V), tai lukea jompanakumpana näistä kahdesta tilasta, kun jokin ulkoinen ohjaa sitä. machine.ADC(...) tarjoaa analogia-digitaalimuuntimen, joka mittaa nastan jännitteen ja raportoi sen lukuna. machine.UART(...) ajaa universaalia asynkronista vastaanotinta/lähetintä (UART) – oheislaitetta, joka lähettää ja vastaanottaa tavuja bitti kerrallaan johdinparin kautta, TX (lähetys) ja RX (vastaanotto). Muut luokat kattavat loput oheislaitteet. Skripti lukee ja kirjoittaa Python-olioita; MicroPython muuntaa kunkin käytön vastaaviksi rekisterien luku- ja kirjoitustoiminnoiksi, ja ne siirtävät bittejä fyysisillä johtimilla.

Yhden sirun ääriviiva, joka sisältää nimettyjä lohkoja -- suoritin, RAM, flash-muisti ja rivi oheislaitelohkoja (GPIO, ADC, ajastin/PWM, UART/SPI/I2C, CAN), jotka on yhdistetty sisäisellä väylällä, ja jokaisesta oheislaitteesta lähtevät nuolet poistuvat sirusta kohti fyysisten nastojen nimiä.

MCU pakkaa suorittimen, muistin ja oheislaitteet yhdelle sirulle. Jokainen oheislaite on Pythonin käytettävissä machine-moduulin luokan kautta.

3.1.1. Pääsilmukka

Lähes jokainen mikrokontrolleriohjelma noudattaa samaa muotoa: kertaluonteinen alustus skriptin alussa (moduulien tuonti, nastojen määritys, väylien avaaminen) ja sitten ääretön while True: -silmukka alaosassa. Silmukan sisällä ohjelma lukee tuloja, tekee päätöksiä ja päivittää lähtöjä uudelleen ja uudelleen. Silmukka on ohjelma; kun skripti päättyy, laite lakkaa tekemästä mitään.

# setup, runs once
from machine import Pin
led = Pin("P0", Pin.OUT)

# main loop, runs forever
while True:
    led.value(1)
    # ... do work ...
    led.value(0)
    # ... do other work ...

Tämä muoto – alusta kerran, silmukoi sitten ikuisesti – on pääsilmukan malli. Kaikki seuraava käsittelee sitä, mitä sen sisään tulee.

3.1.2. Reaaliaikainen ohjaus

Pöytätietokoneen ohjelma toimii monien muiden rinnalla. Käyttöjärjestelmä aikatauluttaa sen työn yhdelle tai useammalle säikeelle – itsenäisille suoritusvirroille, joiden välillä se vaihtelee millisekunti millisekunnilta. Kun yksi säie odottaa I/O:ta (levy, verkko, käyttäjän hiiren liikutus), käyttöjärjestelmä luovuttaa suorittimen toiselle. Ohjelma on enimmäkseen tapahtumaohjattu: ikkunanhallinta kutsuu koodiisi, kun syöte saapuu, HTTP-kirjasto jatkaa koodiasi, kun tavuja saapuu pistokkeeseen. Jokin suurempi taho kutsuu sinua.

Mikrokontrolleriohjelma on päinvastainen. Oletuksena ei ole käyttöjärjestelmää, aikatauluttajaa eikä muuta säiettä. Juuri esitetty pääsilmukka on ainoa silmukka. Oheislaitteet laukaisevat keskeytyksiä tai tarjoavat tilalippuja; silmukka pollaa niitä tai käsittelee keskeytykset suoraan. Jos silmukka jumiutuu time.sleep_ms(1000) -kutsuun, laite ei tee mitään tuon sekunnin ajan; ei ole toista säiettä täyttämään aukkoa.

Tästä seuraa kaksi seurausta, jotka pätevät kaikkialla:

  • Aika on todellista. Nastan lukeminen kahdesti tiukassa silmukassa kestää mikrosekunteja; kymmenen millisekunnin nukkuminen tarkoittaa kymmentä millisekuntia, joiden aikana mitään muuta ei tapahdu. Estämättömän ajoituksen malli on vastaus tähän.

  • Laitteisto on todellista. machine.Pin.value -arvon asettaminen arvoon 1 asettaa noin 3,3 V fyysiselle johtimelle; sen asettaminen arvoon 0 asettaa siihen noin 0 V. Muut piirin osat näkevät kyseisen jännitteen välittömästi – mukaan lukien kaikki komponentit, joita nasta voi vaurioittaa, jos sitä ohjataan väärin.