Warning
This page is located in archive. Go to the latest version of this course pages.

HW 09 (Nucleo) - Jednobajtová komunikace

Časný termín 22.04.2019 23:59 PDT
Termín odevzdání 29.04.2019 23:59 PDT
Finální termín 3.05.2019 23:59 PDT
Povinné zadání 2b
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) 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.

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ů 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
V mbed.org lze opět využít objekt 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.

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

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
courses/b3b36prg/hw/hw09.txt · Last modified: 2019/04/29 18:01 by faiglj