Zo, heb gister avond nog wat uitgetypt maar nog niet op CO gezet. Ik heb expres een hoop details weg gelaten en de focus gelegd op de vraag van Blackdog.
De microcontroller:
Een microcontroller bestaat uit meerdere delen. De relevante delen voor dit verhaal zijn: CPU, RAM en ROM. De ROM is in de praktijk vaak een stukje flash. Sommige processoren kunnen daar ook naar schrijven. Maar dat is voor nu niet relevant. Zoals je wellicht wel weet staat de software in de ROM. Dit is eigenlijk een lange lijst met instructies. De CPU doet niets anders dan een voor een alle instructies uitvoeren. Om een beetje idee te geven, in dit plaatje zie je hoe dit in de ROM staat opgeslagen. In het rode kader staan de adressen en de waardes die in de ROM staan. Als je erg veel geduld hebt kun je een Arduino programmeren op deze manier! Omdat dit natuurlijk vreselijk onhandig is, heeft men de zogenaamde assembly (ASM) taal uitgevonden. Hier zie je voorbeelden van staan in het blauwe kader. Links is de instructie, rechts zijn de parameters. Op iedere regel zie je de vertaling tussen ASM en de waardes die in de ROM staan. Het omzetten van de ASM naar de codes wordt gedaan door de assembler.

Compileren:
Assembly is al een heel stuk makkelijker dan zelf alle hex codes onthouden. Maar zoals je kan zien is zelfs dit nog behoorlijk onhandig om iets mee te maken. Dit gebeurde vroeger wel heel veel. Gelukkig hebben een aantal slimme koppen een nieuwe taal bedacht genaamd C. (Ik sla even dingen als basic over. Dat werkt weer heel anders en zorgt alleen voor verwarring.)
De truc was natuurlijk, hoe krijg je een C programma in de ROM. Als je letterlijk je code erin zou plakken, kan de CPU hier niets mee. Daar is de compiler voor uitgevonden. Deze zet de C code om naar ASM. Zoals je nu zelf wellicht al ziet aankomen. Wanneer je de arduino code 'upload' gebeurt het volgende:
1. De C code wordt gecompileerd naar ASM.
2. De ASM wordt geassembleerd naar HEX.
3. De HEX wordt naar de ROM geschoten.
4. De CPU wordt herstart.
De processor:
De CPU heeft een aantal registers. Deze registers staan dus niet in de RAM, maar zijn extra stukjes geheugen in de CPU zelf. Zoon register is niets anders dan een stukje geheugen waar je een waarde in kan opslaan. Een van deze registers is de Program counter. De Program counter of PC, Onthoud bij welke instructie de processor is gebleven. Dit verwijst naar een adres in de ROM. Bij iedere clockcycle wordt: (Ook weer een paar details weg gelaten.)
- Een instructie uitgelezen uit de ROM, Welke instructie wordt uitgelezen wordt bepaald door de program counter.
- De instructie uitgevoerd.
- De program counter wordt opgehoogd, zodat hij verwijst naar de volgende instructie.
Dus hoe werkt de GOTO? Nou je maakt gewoon een instructie waarbij je de program counter aanpast waar je naartoe wilt springen. Dit wordt in ASM ook wel de jump instructie genoemd. Hiermee spring je eenmalig naar een specifieke plek in de code. Een probleempje, je kan nu niet meer terug waar we vandaan kwamen. Dit is wel nodig om de functies zoals we die in C kennen te kunnen implementeren. Om dit probleem te verhelpen is de stack uitgevonden.
De stack:
De stack is een stukje geheugen dat geclaimd wordt in de RAM. De stack kan je zien als een stapel met borden. Je mag alleen borden bovenop de stack zetten of borden van de stack afhalen. Je kan nooit de middelste of onderste pakken, dan vallen alle borden kapot. De CPU zet natuurlijk geen borden op de stack. Wat hij er wel opzet zijn waarden die in de registers staan. De ASM instructies die hierbij horen worden vaak PUSH en POP genoemd. Push om iets op de stack te zetten en pop om er iets af te halen. Dus hoe kan je nu springen naar en terug springen van een functie? Simpel, Wanneer je een jump doet, zet je de program counter op de stack. Als je weer terug wilt haal je deze waarde weer van de stack en schrijft dit weer naar de program counter.
Iedere keer dat je naar een functie springt onthoud hij dus waar je vandaan bent gekomen. Als je nu 3x achter elkaar springt, dan staan er dus 3 waardes op de stack. Zoals je begrijpt is de stack niet oneindig groot. Je kunt dus maar een beperkt aantal sprongen maken. Als je het te bont maakt dan krijg je een 'stack overflow' error. Letterlijk, de stack is overstroomt.