3.1. Mikrokontroleri¶
OpenMV Cam radi na mikrokontroleru (MCU): jednom čipu koji objedinjuje CPU, radnu memoriju (RAM), pohranu programa (flash memorija) i skup periferija – hardverskih blokova za interakciju s vanjskim svijetom.
Periferije su zanimljiv dio. Svaka je komad silicija posvećen jednom poslu: postavljanju pina na visoku ili nisku razinu, mjerenju analognog napona, slanju bajtova preko serijske sabirnice. CPU konfigurira i čita svaku periferiju kroz registre – fiksne memorijske adrese koje hardver prati i ažurira.
MicroPython te registre omata u klase unutar modula machine. machine.Pin(...) vraća objekt koji upravlja općenamjenskim ulazno/izlaznim (GPIO) pinom – žicom koju čip može držati na visokoj razini (oko 3,3 V) ili niskoj razini (oko 0 V), ili je pročitati kao jedno od ta dva stanja kada je vanjski izvor postavlja. machine.ADC(...) izlaže analogno-digitalni pretvarač, koji mjeri napon na pinu i prijavljuje ga kao broj. machine.UART(...) pokreće univerzalni asinkroni prijemnik/predajnik (UART) – periferiju koja šalje i prima bajtove bit po bit preko para žica, TX (predaja) i RX (prijem). Ostale klase pokrivaju preostale periferije. Skripta čita i piše Python objekte; MicroPython prevodi svaki pristup u odgovarajuća čitanja i pisanja registara, a to pomiče bitove na fizičkim žicama.
MCU pakira CPU, memoriju i periferije u jedan čip. Svaka je periferija izložena Pythonu putem klase u modulu machine.¶
3.1.1. Glavna petlja¶
Gotovo svaki program za mikrokontroler ima isti oblik: jednokratno postavljanje na vrhu skripte (uvoz modula, konfiguracija pinova, otvaranje sabirnica), zatim beskonačna petlja while True: na dnu. Unutar petlje program iznova i iznova čita ulaze, donosi odluke i ažurira izlaze. Petlja jest program; kada skripta završi, uređaj prestaje raditi bilo što.
# 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 ...
Taj oblik – jednom postaviti, zatim petlja zauvijek – jest obrazac glavne petlje. Sve što slijedi govori o tome što ide u njezinu nutrinu.
3.1.2. Upravljanje u stvarnom vremenu¶
Program na stolnom računalu radi uz mnoge druge. Operacijski sustav raspoređuje njegov rad preko jedne ili više niti – nezavisnih tokova izvođenja između kojih se prebacuje milisekundu po milisekundu. Kada jedna nit čeka na U/I (disk, mreža, korisnik koji pomiče miša), OS predaje CPU drugoj. Program je uglavnom vođen događajima: upravitelj prozora poziva vaš kod kada stigne unos, HTTP biblioteka nastavlja vaš kod kada bajtovi stignu na utičnicu. Nešto veće poziva vas.
Program za mikrokontroler je suprotnost. Po zadanome nema operacijskog sustava, nema raspoređivača i nema druge niti. Upravo prikazana glavna petlja jedina je petlja. Periferije aktiviraju prekide ili izlažu statusne zastavice; petlja ih prozire ili izravno obrađuje prekide. Ako se petlja zaustavi u time.sleep_ms(1000), uređaj ne radi ništa tijekom te sekunde; nema druge niti da popuni prazninu.
Iz toga proizlaze dvije posljedice koje vrijede posvuda:
Vrijeme je stvarno. Dvostruko čitanje pina u tijesnoj petlji traje mikrosekunde; spavanje od deset milisekundi znači deset milisekundi tijekom kojih se ništa drugo ne događa. Odgovor je obrazac neblokirajućeg mjerenja vremena.
Hardver je stvaran. Postavljanje
machine.Pin.valuena1stavlja otprilike 3,3 V na fizičku žicu; postavljanje na0stavlja otprilike 0 V. Drugi dijelovi sklopa odmah vide taj napon – uključujući bilo koje komponente koje pin može oštetiti ako je krivo upravljan.