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