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
) 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 serial_nonblock.
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ů
cvičení 8 a
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.
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
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
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í.
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 |