{{indexmenu_n>9}} ======== HW 09 (Nucleo) - Jednobajtová komunikace ======== ^ Termín odevzdání | 28.04.04.05.2018 23:59 PDT | ^ Povinné zadání | 2b | ^ Volitelné zadání | není | ^ Bonusové zadání | není | ^ Počet uploadů | 5 | Cílem úlohy je získat zkušenost s využitím sériového portu pro komunikaci aplikace v počítači s programem na desce Nucleo a práci s více vlákny pro zpracování více zdrojů událostí. Program vychází z předchozích programů pro seriovou komunikaci s Nucleo a více-vláknové aplikace. Výsledné programy představují dílčí kroky pro snažší implementaci HW 10 a následně semestrální práci. Binární obraz funkční aplikace pro Nucleo pro testování a funkce pro čtení ze sériového portu s timeoutem (''prg_serial_nonblock'') {{:courses:b3b36prg:hw:prg-hw09.zip|}} Pro korektní ukončení programu (po stisku klávesy 'q') je nutné ukončit načítání znaku ze seriového portu, proto realizujte načítání v tzv. //non-bloking// režimu s využitím ''poll'' funkce, implementace můžete založit na modulu ''prg_serial_nonblocking'', např. viz [[courses:b3b36prg:tutorials:serial_nonblock|]]. ===== Povinné zadaní ===== Realizujte programy pro desku Nucleo STM32F446RE a program pro ovládací počítač, kterým bude řízeno blikání LED na desce Nucleo seriovou komunikací (115200 bps, 8 bitů, bez parity). Úloha se tak skládá ze dvou částí: 1) programu pro Nucleo a 2) programu pro ovládací počítač. **Ovládací program**: * Čte klávesy (bez nutnosti stisku klávesy enter) a reaguje na stisk kláves se znaky 's', 'e', 'h', 'b', a '1'-'5', které přeposílá Nucleo desce. * Při stisku klávesy 'q' ukončuje program svou činnost (koretně zastaví všechna vlákna). * Průběžně zobrazuje stav LED, poslední odeslaný a přijatý příkaz, peridou blikání a počet přijatých informací o počtu rozsvěcení LED ve tvaru: ''"\rLED %3s send: '%c' received: '%c', T = %4d ms, ticker = %4d"'' kde jednotlivé řidící znaky formátování znamenají: * ''%3s'' je on nebo off podle stavu LED, * ''%c'' je poslední vyslaný znak (' ' po startu'), další * ''%c'' posledně přijatý znak ('?' v případě nové zprávy zatím bez odpovědi), * ''%4d'' je perioda rozsvěcení/zhasínání LED (uvažujeme doba kdy LED svítí a kdy je zhasnutá je identická, tj. PWM se střídou 1:1) odhadnutá na základě přijatých zpráv od Nucleo desky za časový interval 5 sekund (výpis hodnoty periody je zarovnaný na 4 pozice), poslední * ''%4d'' je počet přijatý znaků 'x' indikující změnu stavu LED při blikání. Pro výpis využijte přepisování řádku znakem '\r'. Po odeslaní znaku 's' a 'e' je stav LED (''on'' nebo ''off'') nastaven až po přijeti potvrzovacího znaku 'a'. Program lze založit na kombinaci výsledných programů [[courses:b3b36prg:labs:lab08|cvičení 8]] a [[courses:b3b36prg:labs:lab09|cvičení 9]]. Důležitou částí je organizace kódu a dedikování jednotlivých vláken pro 1) čtení z klávesnice; 2) překreslování řádku, 3) čtení ze seriového portu; 4) měření periody blikání LED jednou za 5 sekund; případně další hlavní vlákno v //boss/worker// modelu. /* Po přijetí znaku 'b' od Nucleo desky, program korektně ukončuje svou činnost tak, jako by uživatel stiskl klávesu se znakem 'q'. V případě chyby komunikace s Nucleo deskou program ohlásí chybu na ''stderr'' a ukončí svou činnost, opět korektním postupem s notifikací dílčích vláken. */ Implementačně (na počet řádků) náročnější variantou je realizovat v program frontu zpráv a řešit logiku programu v rámci hlavního vlákna, které přijímá zprávy od ostatních vláken a realizuje příslušné výstupy (tj. seriový port a textový výstup na stdout. Benefitem takto organizovaného programu je snadné rozšíření. Jednodušší variantou je dedikovat zápis do sériového portu vláknu pro čtení vstupu z klávesnice a notifikace překreslování z jednolivých vláken na základě přijaté události (tak jako v programu na [[courses:b3b36prg:labs:lab09|cvičení 9]]). **Nucleo program**: * Po startu/zapnutí pošle inicializační znak 'i' * Následně čeká na příjem některého z řidích znaků ze seriového portu a případně bliká LED dle definované periody * Po přijetí znaku 'b' ukončuje program svou činnost **Jednobytový komunikační protokol**: * 'i' - //init// - vysílá Nucleo po startu, žádná reakce není očekávána * 's' - //start// - vysílá PC, Nucleo reaguje rozsvícením LED a odpovědí 'a' * '1' - //set 1// - vysílá PC, Nucleo reaguje nastavením periody blikání LED na 50 ms (tj. 50 ms LED svítí a 50 ms je zhasnuta) a odpovědí 'a' * '2' - //set 2// - vysílá PC, Nucleo reaguje nastavením periody blikání LED na 100 ms a odpovědí 'a' * '3' - //set 3// - vysílá PC, Nucleo reaguje nastavením periody blikání LED na 200 ms a odpovědí 'a' * '4' - //set 4// - vysílá PC, Nucleo reaguje nastavením periody blikání LED na 500 ms a odpovědí 'a' * '5' - //set 5// - vysílá PC, Nucleo reaguje nastavením periody blikání LED na 1000 ms a odpovědí 'a' * 'e' - //end// - vysílá PC, Nucleo reaguje zhasnutím LED a odpovědí 'a' * 'h' - //hello// - vysílá PC, Nucleo reaguje zasláním 'h' * 'b' - //bye// - vysílá PC, Nucleo odpovídá 'b' a reaguje opuštěním ''main()'' funkce a ovládací program následně po přijetí 'b' ukončuje svou činnost. Aby bylo možné ukončit program po přijetí znaku 'b', je nutné ukončit načítání znaku ze ''stdin'', např. neblokovaným přístup s //pollingem// podobně jako čtení ze sériového portu. Dále Nucleo v případě, že periodicky bliká LED, vysílá znak 'x' při rozsvícení LED a znak 'o' při zhasnutí led. Program pro Nucleo je možné založit na výsledném programu z [[courses:b3b36prg:labs:lab08|8. cvičení]] důležitou změnou je organizace programu tak, aby k vysílání bytů docházelo pokud možno mimo obsluhu přerušení časovače a LED tak pravidelně blikala i za cenu zpožděného odesílání. ====== Odevzdání a hodnocení ====== Program pokud možno realizujte na cvičení, nahrajte do odevzdávacího systému. Funkčnost programu ověří učitel na cvičení nebo na dalším cvičení. Program můžete implementovat jak v prostředí ''mbed'' tak přímo s křížovou kompilací. V případě ''mbed'' pojmenujte soubor ''hw09-mbed.cpp'' a v případě křížové kompilace pak ''hw09-cross.c''. V případě ovládacího programu pojmenujte hlavní soubor s ''main()'' funkcí ''hw09-main.c'' ^ ^ Povinné zadání ^ ^ Název v BRUTE | HW09 | ^ Odevzdávané soubory | ''hw09-main.c'' a ''hw09-mbed.cpp'' nebo ''hw09-cross.c'' | ^ Argumenty při spuštění | žádné | ^ Procvičované oblasti | programování pro Nucleo |