Cykly
Cyklus říká programu: "Opakuj tuto část kódu."
Bez cyklů bychom museli stejný kód psát pořád dokola. To by bylo nudné, dlouhé a velmi snadno by se v tom udělala chyba.
while
Cyklus while se opakuje,
dokud platí podmínka.
while (tlacitko_stisknuto) {
led_blikej();
}
Program bude blikat LED, dokud je tlačítko stisknuté. Jakmile podmínka přestane platit, cyklus skončí.
Nekonečný cyklus
V embedded programech je velmi častý nekonečný cyklus:
while (1) {
// hlavní práce programu
}
Mikrokontrolér většinou nemá "konec programu". Po zapnutí má pořád něco dělat: měřit, čekat, blikat, komunikovat nebo spát a probouzet se.
Proto je while (1) v embedded světě normální.
Není to chyba.
Je to hlavní smyčka programu.
for
Cyklus for se hodí,
když víme,
kolikrát chceme něco zopakovat.
for (int i = 0; i < 10; i++) {
blikni();
}
Tento kód zavolá blikni() desetkrát.
Části cyklu znamenají:
| část | význam |
|---|---|
int i = 0 | počítadlo začíná na nule |
i < 10 | cyklus běží, dokud je i menší než 10 |
i++ | po každém průchodu se i zvětší o 1 |
Procházení pole
Cyklus for se často používá pro pole:
uint16_t hodnoty[8];
for (int i = 0; i < 8; i++) {
hodnoty[i] = 0;
}
Tento kód projde všech osm prvků pole a nastaví je na nulu.
Když má pole 8 prvků,
poslední index je 7.
Proto je v podmínce i < 8.
Kdyby tam bylo i <= 8,
program by sáhl na devátý prvek,
který neexistuje.
Cyklus nesmí zbytečně blokovat
V embedded programu je potřeba přemýšlet, co se během cyklu děje. Když cyklus dlouho čeká, program mezitím nemusí stihnout jiné věci.
Například:
while (1) {
cti_tlacitka();
mer_senzory();
posli_zpravy();
}
Tohle je typická hlavní smyčka. Program pořád dokola čte vstupy, měří senzory a posílá zprávy. Kdyby jedna část trvala moc dlouho, ostatní se dostanou na řadu pozdě.
Cyklus je tedy mocný nástroj, ale v malém zařízení se k němu chováme opatrně.