{{indexmenu_n>9}}
======== HW 09 (Nucleo) - Jednobajtová komunikace ========
^ Termín odevzdání | 30.04.2022 23:59 AoE |
^ Povinné zadání | 2 b |
^ Počet uploadů | bez omezení |
^ Výchozí soubory | {{ :courses:b3b36prg:hw:b3b36prg-hw09.zip |}} |
/*
^ **[[courses:b3b36prg:hw:start#Úlohy HW08, HW09 a HW10 | Časný termín]]** | **[[courses:b3b36prg:hw:start#Úlohy HW08, HW09 a HW10 | (st) 06.05.2020 23:59 PDT]]** |
^ Termín odevzdání | **(st) 06.05.2020 23:59 PDT** |
^ **[[courses:b3b36prg:hw:start#Úlohy HW08, HW09 a HW10 | Finální termín]]** | **[[courses:b3b36prg:hw:start#Úlohy HW08, HW09 a HW10 | 09.05.2020 23:59 PDT]]** |
^ Povinné zadání | 2b kontrola [[courses:b3b36prg:tutorials:coding_style|Coding Stylu]]|
^ Volitelné zadání | není |
^ Bonusové zadání | není |
^ Počet uploadů | bez omezení |
*/
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:b3b36prg-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#seriovy_port_v_neblokovanem_rezimu|Nastavení sériového portu]].
===== 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
V ''mbed.org'' lze opět využít objekt [[https://os.mbed.com/docs/mbed-os/v5.15/apis/ticker.html | Ticker]] pro peridické volání //callback// funkce předané objektu metodou ''attach''. V tomto případě je však nutné ještě reportovat blikání nadřazenému počítači zasíláním znaků 'x' a 'o'. Z důvodu doporučovaného rychlého kódu v //callback// funkci lze zasílání realizovat v hlavní smyčce, do které je nutné vhodným způsobem reportovat změnu stavu LED.
**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. PC program dále běží dokud není ukončen stiskem 'q'.
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 |