Přeskočit na hlavní obsah

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í:

částvýznam
int i = 0počítadlo začíná na nule
i < 10cyklus 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.

Pozor na konec pole

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ě.