<< | NXC základy | Proměnné a datové typy >>
Části programu
- NXC program se skládá z bloků kódu a proměnných
- typy kódových bloků
- Úlohy
- Funkce
- Makra a definice
- maximální úloh a funkcí je 256
Úlohy - tasky
- úloha je samostatný program definovaný klíčovým slovem task a pojmenovaný libovolným identifikátorem
- úloha může běžet samostatně a zároveň souběžně s jinou úlohou (vícevláknové zpracování dat)
- program musí obsahovat hlavní úlohu main, která se spustí při každém spuštění programu
- tělo úlohy se skládá ze seznamu příkazů
Zápis úlohy
task jmeno()
{
// seznam příkazů
}
Řízení úloh
- jedna z úloh (například main) může řídit běh jiných úloh pomocí speciálních příkazů
- Spuštění úlohy - StartTask(jmeno_ulohy)
- Ukončení úlohy - automaticky dosažením konce těla úlohy
- Postupné spuštění úloh - Follows(uloha_1, uloha_2,…, uloha_N)
- Současné spuštění úloh - Precedes(uloha_1, uloha_2,…, uloha_N)
- Zastavení běžící úlohy - StopTask(jmeno_ulohy)
- Zastavení aktuální úlohy a spuštění jiné - ExitTo(jmeno_dalsi_ulohy)
- Zastavení všech úloh - StopAllTasks()
- Zastavení celého programu - Stop()
- Ukázka víceúlohového programu
task zvuk() { // definuj úlohu zvuk
while (true) { // opakuj dokola
PlayTone(TONE_A4, MS_500); // generuj zvuk A4 o délce 500 ms
Wait(MS_600); // čekej 600 ms
}
}
task pohyb() { // definuj úlohu pohyb
while (true) { // opakuj dokola
OnFwd(OUT_A, Random(100)); // nastav různý výkon motoru na portu A (0-100 %)
Wait(Random(SEC_1)); // nastav různý čas pohybu motoru (0-1 sekunda)
}
}
task rizeni() { // definuj úlohu rizeni
Wait(SEC_10); // po 10-ti sekundách
StopTask(zvuk); // zastav úlohu zvuk
Wait(SEC_5); // po dalších 5-ti sekundách
StopAllTasks(); // zastav všechny běžící úlohy
}
task main() { // spusť hlavní úlohu po spuštění programu
Precedes(zvuk, pohyb, rizeni);// souběžně spusť tři úlohy
}
Funkce
Definice funkce
- funkce - část programu, kterou je možné opakovaně volat z různých míst kódu
- umožní zjednodušení programu a zvýšení rychlosti programu
- jazyky Pascal, Fortran, Ada... rozlišují funkce (vracejí hodnotu) a podprogramy - procedury (nevracejí hodnotu)
- "Céčkové" jazyky nerozlišují pojem funkce a podprogram
- v objektovém programování se funkce dané třídy nazývá metoda
- NXC podporuje funkce s argumenty (parametry) a návratovými hodnotami
Zápis funkce
[typ_funkce] navratovy_typ jmenoFunkce(seznam_argumentu)
{
// tělo funkce
}
Typy funkcí
- běžná funkce - bez označení typu funkce
- nutná definice návratové hodnoty
- jediná definice kódu funkce šetří paměť
- opakované volání funkce může zpomalit běh programu
- omezení počtu funkcí a úloh na 256
- Použití běžné funkce
int mocnina(int x = 2)// definice běžné funkce včetně nastavení hodnoty argumentu
{
return x*x; // tělo funkce
}
task main()
{
NumOut(0, LCD_LINE1, mocnina(10)); // volání funkce a zobrazení vrácené hodnoty
NumOut(0, LCD_LINE1, mocnina()); // volání funkce a zobrazení výchozí hodnoty
Wait(SEC_10); // čekání 10 s před ukončením programu
}
- funkce bez návratové hodnoty - void nebo sub
- obdoba podprogramu v Pascalu
- odpadá definice návratového typu
- omezení počtu funkcí a úloh na 256
- s ohledem na zvyklosti "Céčkových" programů se preferuje použití klíčového slova void
- Použití podprogramu
void zpet(int vykon)
{
OnRev(OUT_C, vykon); Wait(900);
OnFwd(OUT_BC, vykon);
}
task main()
{
OnFwd(OUT_BC, 75);
Wait(1000);
zpet(75);
Wait(2000);
zpet(75);
Wait(1000);
zpet(75);
Off(OUT_BC);
}
- inline funkce - inline
- kód funkce nahradí při kompilaci její volání
- vhodné pro krátké kódy s požadavkem na rychlost zpracování
- použití neomezeného počtu funkcí
- chráněná funkce - safecall
- zabezpečí synchronizaci volání funkce ze souběžných úloh
- kód funkce v úloze bude vykonán po ukončení funkce v jiné úloze