Programování mikropočítačů Programování HCS08 v C s využitím operačního systému RTMON
Co je Real-time programování Je programování počítačů se speciálními požadavky na dobu odezvy. Mluvíme-li u počítače o době odezvy, plyne z toho, že tento počítač komunikuje s okolím (člověkem nebo s technickým zařízením) Požadavky na dobu odezvy mohou být velmi různé, viz příklady dále
Příklady real-time systémů DVD přehrávač: spustit přehrávání po stisku tlačítka PLAY. Řídit polohu laserového snímače = Dvě úlohy s různými požadavky na dobu odezvy Mobilní telefon: Reakce na stisk tlačítka uživatelem Zároveň zpracovávat GSM data Letadlo: Řízení motorů, podvozku… Řízení polohy, rychlosti
Real-time operační systém (RTOS) Real-time program potřebuje prostředky k práci s časem a pro souběžné provádění několika činností. K tomu může být využit real-time operační systém (RTOS) Programy se souběžným prováděním několika činností mohou být napsány i bez real-time OS, s využitím obyčejného OS, např. Windows – ale horší možnosti splnit požadavky na dobu odezvy Program splňující požadavky na dobu odezvy lze napsat bez využití OS – běžné u malých embedded systémů (mikropočítač)
Změna myšlení Využití operačního systému změna myšlení Jestliže proběhne určitá doba zapracování a změna ve stylu programování a myšlení, RTOS mimořádně usnadňuje vývoj software. Mechanizmy RTOS, které jsou k dispozici, umožňují provádět mnoho věcí jednodušeji a programovat rychleji.
Příklad programu s více úlohami Aplikace, má plnit následující úkoly: Regulovat motor Vyhodnocovat snímač otáček Dotazovat se na stav klávesnice Aktualizovat informace na displeji Komunikovat přes sériovou linku Úlohy lze snadno oddělit. Ideálně pro každou úlohy napsat samostatný program. Problém: úlohy musejí běžet na jednom procesoru a vzájemně si předávat data (např. snímač -> displej) Zde pomáhá RTOS – každý program je pak založen jako samostatný proces neboli úloha (task).
Procesy a prováděcí toky Jednotlivé činnosti, které se mají souběžně provádět se označují jako procesy nebo thready (vlákna, prováděcí toky), někdy také úlohy (tasks). Obvyklá terminologie (např. ve Windows): Proces = jedna z paralelně prováděných činností, což může být běžící program (např. Word), ale i činnost prováděná systémem (např. komunikace s uživatelem). OS umožňuje aby se několik programů vykonávalo souběžně (např. Word, Internet Explorer, …) Thread = činnost, která se provádí uvnitř procesu. Např. IE může obsahovat několik threads běžících současně – jedna komunikuje s uživatelem, druhá přijímá a odesílá data přes internet…
Co je proces Název proces budeme používat pro každou z paralelně prováděných činností = úlohu. Definice: Proces je určitý úsek kódu programu, který se může začít vykonávat, jehož vykonávání může být dočasně pozastaveno a později znovu pokračovat. A to vše jednoznačně daným způsobem. V RTMON proces == funkce jazyka C.
Výhody rozdělení aplikace na více procesů (výhody použití RTOS) Kód procesu muže být mnohem jednodušší pokud se soustředí na provádění jen jedné věci. Složitost zvětšuje pravděpodobnost chyby a chyba navíc pravděpodobně ovlivní všechny úkoly o které se proces stará. Je snadné přidat nebo odebrat procesy z aplikace, tj. aplikace jsou škálovatelné (scalable). Přidání nových vlastností = přidání nových procesu. Procesy mohou být zastavovány a spouštěny za běhu, což se hodí pro dynamické změny konfigurace nebo i jen proto aby se zastavil „problémový“ proces. Zpracování procesu muže být snadno rozděleno na několik procesorů. Různí programátoři mohou pracovat na různých procesech bez nebezpečí, že si vzájemně přepíší svou práci. Každý proces existuje ve svém paměťovém prostoru. Je-li v něm nějaká chyba, ohrozí jen tento proces a ne jiný (nemůže přepsat paměť jinému procesu). - toto platí u RTOS se správou paměti, ne pro náš RTMON u HC-08.
Operační systém RTMON Jednoduchý operační systém pro mikropočítač HC-08 Umožňuje souběžný běh několika úloh, preemptivní multitasking. Úlohy mohou mít přiděleny priority v rozsahu 1 až 254. Priorita 1 je nejvyšší, proces má přednost před procesy s nižší prioritou (vyšším číslem). Úlohy mohou být spuštěny jednorázově a nebo periodicky (RTMON opakovaně spouští úlohu se zadanou periodou). Časové údaje se uvádějí v ticích OS. Tik je nastaven na 50 ms.
Základní objekty RTMON Proces = úloha Operace s procesy: vytvořit, spustit, pozastavit, zastavit, zrušit. Schránka = pro předávání dat mezi procesy Operace se schránkou: vytvořit, zapsat do schránky zprávu, číst ze schránky zprávu.
Vybrané služby RTMON Podrobněji viz dokument Přehled funkcí RTMON. char rtm_init(IDPROC** init_id); Inicializace systému RTMON. Musí být volána na začátku programu. char rtm_end(IDPROC* init_id); Ukončení činnosti RTMON. Volá se na konci programu. char rtm_create_p(const char* pname, unsigned char prio, void(*pfunc)( ), int stack_size, IDPROC** proc_id ); Vytvoří nový proces. Pname – jméno procesu, nevyužívá se. Prio – priorita procesu, 1 až 254. Pfunc – ukazatel na funkci, která představuje tělo procesu. Stack_size – velikost zásobníku pro proces. Doporučená hodnota 32 Byte a více. Proc_id – proměnná, do které se uloží identifikátor vytvořeného procesu. (IDPROC)
Služby RTMON 2 char rtm_start_p(IDPROC* proc_id, int time_to_start, int time_period); Spuštění procesu Proc_id – identifikátor procesu, který se má spustit Time_to_start – počet tiků do startu procesu. 0 pokud se má spustit okamžitě. Time_period – perioda spouštění procesu v ticích. 0 pokud má být proces spuštěn jednorázově. char rtm_delay_p(IDPROC* proc_id, int time_to_delay); Pozastavení běhu procesu. Proc_id – identifikátor procesu, který se má pozastavit. Time_to_delay – doba pozastavení v ticích. 0 pokud se má pozastavit na neomezenou dobu (dokud nebude spuštěn jiným procesem). char rtm_continue_p(IDPROC * proc_id); Pokračování v běhu pozastaveného procesu.
Použití RTMON v našem programu Rozhraní v jazyku C Rtmon_08.H – hlavičkový soubor s deklaracemi služeb RTMON a dat Rtmon.lib – knihovna s kódem služeb
Omezení RTMON Maximální počet procesů: 10 Maximální velikost zásobníků pro všechny procesy: 1000 Byte Maximální počet schránek: 4 Maximální velikost dat ve všech schránkách: 32 byte. Žádné dva procesy nesmějí mít stejnou prioritu (není podporováno cyklické střídání procesů se stejnou prioritou na procesoru). Není podporováno dynamické rušení a vytváření procesů. Volání funkce rtm_abort_p proces sice vyřadí z plánování, ale neodstraní jeho datovou strukturu z paměti, takže stále platí celkové omezení maximálně 10 vytvořených procesů.
Příklad 1 - Stopky Zadání Program má na displeji zobrazovat čas. Stiskem tlačítka SW1 musí být možno stopky zastavit, stiskem SW2 opět spustit a stiskem SW3 resetovat. Řešení Srovnejme náročnost řešení bez využití operačního systému (RTMON) a s jeho využitím – tj. s rozdělením programu na několik procesů (úloh)…
Srovnání řešení Bez využití RTOS: Uběhl již čas? -> aktualizuj hodiny Je stisknuta klávesa? –> proveď akci >> Vše řešíme najednou, což je obtížné. Co když při obsluze stisku klávesy nestihneme včas aktualizovat čas? S využitím RTOS: Procesy běží současně (paralelně), můžeme řešit 2 oddělené úlohy: čas a reakce na klávesnici. Operační systém se stará o to, aby se úlohy vykonávaly souběžně. Priorita úlohy hodin může být vyšší, pak v případě potřeby přeruší méně důležitý proces obsluhy klávesnice a hodiny poběží správně
Program STOPKY RTMON Proces 1 Proces 2 hodiny klávesnice Dva procesy: Proces 1 = běh času a jeho zobrazení Proces 2 = komunikace s uživatelem (obsluha tlačítek) RTMON Proces 1 hodiny Spuštěn periodicky T = 1 sekunda Proces 2 klávesnice
Procesy Proces 2 - klávesnice Proces 1 - hodiny void hodiny() Aktualizuj počitadlo sekund Vypiš počitadlo sekund void klavesnice() while(1) { Je stisknuta klávesa? Pokud ano, pak proveď určenou činnost }
Řešení – funkce main() #include <stdio.h> #include “disp_gb60.h“ #include “rtmon_08.h“ // definice datovych struktur procesu IDPROC* init, *p1, *pk; // definice promennych programu int cas; char buff[20]; void main(void) { dinit(); dcls(); dtext("RTMON!"); rtm_init(&init); // vytvoreni procesu rtm_create_p("proc1", 5, proc1, 100, &p1 ); rtm_create_p("proc2", 30, prockey, 48, &pk ); // spusteni procesu 1 rtm_start_p(p1, 0, 20); rtm_start_p(pk, 0, 0); // pozastaveni init procesu (main) rtm_delay_p(init, 0); // ukonceni cinosti programu rtm_ch_period_p(p1, 0); rtm_stop_p(p1); rtm_stop_p(pk); rtm_abort_p(p1); rtm_abort_p(pk); // ukonceni cinnosti rtmon rtm_end(init); for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ }
Řešení - procesy void proc1(void) { cas++; if ( cas > 99 ) cas = 0; void prockey(void) { while(1) __RESET_WATCHDOG(); // test tlacitka if ( PTAD_PTAD4 == 0 ) rtm_ch_period_p(p1,0); rtm_stop_p(p1); rtm_delay_p(pk, 10); // do uvolneni tlacitka } if ( PTAD_PTAD5 == 0 ) rtm_start_p(p1, 0, 20); rtm_delay_p(pk, 10); if ( PTAD_PTAD6 == 0 ) cas = 0; // RESET STOPEK dcls(); douta('0'); } // while rtm_stop_p(pk); void proc1(void) { cas++; if ( cas > 99 ) cas = 0; sprintf(buff, "%d", cas); dcls(); dtext(buff); // Ukonceni procesu rtm_stop_p(p1); }
Vytvoření projektu Vytvoříme „mixed“ projekt: ASM a C Do projektu vložíme soubory: rtmon_08.h rtmon.lib disp_gb60.h disp_gb60.asm
POZOR V záložce projektu „Link Order“ přesuňte rtmon.lib na konec seznamu. Před nahráním nového programu s RTMON do vývojového kitu vždy mikropočítač restartujte (tlačítkem RESET). Bez restartu se sice program nahraje správně, ale nepoběží!
Úkol 1 Upravte ukázkový program stopky tak, aby se na displeji zobrazoval čas ve formátu minuty:sekundy, např. 02:45 Dále zdvojnásobte rychlost běhu stopek. Přidejte možnost ukončení programu stiskem tlačítka SW4. Program se ukončí a vypíše na displej hlášení „RTMON konec“. Nápověda: pro ukončení programu s RTMON se použije znovuspuštění inicializačního procesu – rtm_continue_p(init);
Úkol 2 Vytvořte program hodiny s budíkem. Program bude na displeji zobrazovat čas ve formátu HH:MM:SS. Čas poběží reálnou rychlostí. Zároveň každou sekundu blikne LED1. Tlačítkem SW1 bude možno nastavit hodiny a stiskem SW2 minuty a to tak, že pokud je tlačítko stisknuto, pak se běh hodin zastaví a otáčením potenciometru lze měnit příslušnou hodnotu hodin nebo minut. Po uvolnění tlačítka hodiny opět běží. Ošetřete správný rozsah 0-23 hod resp. 0-59 min aby byl využit celý rozsah dráhy potenciometru. Tlačítkem SW3 se bude přepínat zobrazení hodin a nastavený čas budíku. V režimu zobrazení budíku bude možno změnit čas budíků stejným způsobem jako se nastavují hodiny. Program musí obsahovat alespoň 4 procesy RTMON, např. proces pro zobrazení hodin, proces pro obsluhu tlačítek, proces pro budík a proces pro blikání LED.
Zvládli jste základy RTMON Konec Zvládli jste základy RTMON