Kø i Micro:bit

Jeg påstår at en Micro:bit kan udføre de samme opgaver, som en Arduino. Dertil en Micro:bitten nemmere at komme igang med (indbyggede sensorer og LED’ere) og har mere hukommelse og hurtigere processor end Arduino.

Micro:bittens ry for “at være til børn” skyldes nok, at den er udleveret til 4. klasser, og de fleste online kilder er henvendt til børn. Micro:bit er yngre, og derfor er der mindre materiale, den er britisk, så det amerikanske og asiatiske marked udviser begrænset interesse. Dertil skal den ofte forbindes til et breakout-board for at lave avancerede ting.

Selv kodningen er også lidt anderledes. Arduino kodes traditionelt i et c++ lignende sprog, mens Micro:bit normalt begynder med blokke, derefter JavaScript og til slut MicroPython, hvis der skal meget funktionalitet på.

Et Arduino-program afvikles sekventielt fra A til B til C, der er ingen andre veje. Noget der har irriteret min underbevidsthed er, at på Micro:bit afvikles en start-sekvens og derefter et forever-loop. Men forever er ikke forever, for smider jeg en “onButtonAPressed” funktion ind bliver den afviklet, når knap A trykkes.

Forever afbrydes -der er noget ulogisk i den sekvens. Noget jeg ikke har kontrol over.

Eksemplet herunder kører netop et blinkende hjerte i forever-funktionen, men trykkes på knap A kommer et Happy-face pludselig frem.

Heldigvis har jeg fået genoprettet min logiske sindsro ved at lære om Micro:bits scheduler, som holder styr på, hvad der afvikles hvornår. Funktionerne på Micro:bit afvikles via en runtime-kø. Scheduleren checker hver 6. millisekund rækkefølgen i runtime-køen, og Forever-loopet har laveste prioritet (kører i baggrunden) i runtime-køen.

Dvs. når der sker en event køres en event-handler fx input.something, og denne kommer ind forrest i runtime-køen og bliver straks afviklet. Sker der andre events kommer de ind bag i køen. Funktioner der afvikler en pause stilles i en pause-kø og fortsættes, når pausen er slut. Imens der er pause, kan næste funktion i runtime-køen starte/fortsætte.

Derfor vil eksemplet herunder også vise et blinkende hjerte (forever-loopet). Men når der trykkes A, afvikles en event-funktion og en smiley vil straks fremkomme. Derefter går eventhandler-funktionen på 5 sekunders pause, og imens kører forever-loopet igen, indtil pausen er forbi, eventhandler-funktionen kører videre, som ses ved en sur smiley.

Arduinoen kan selvfølgelig noget lignende via Interrupts, der lytter efter events, men disse skal hardkodes, hvorimod Micro:bitten umiddelbart er født med interrupts.

Mere info: https://makecode.microbit.org/reference/event-handler, https://lancaster-university.github.io/microbit-docs/ubit/messageBus/

Dette indlæg blev udgivet i Arduino, Micro:bit, Programmering. Bogmærk permalinket.