HW 8 - Interaktivní aplikace s meziprocesovou komunikací
Cílem úlohy je získat zkušenost s využitím pojmenované roury pro komunikaci aplikace v počítači s poskytnutým Modulem a práci s více vlákny pro zpracování více zdrojů událostí.
Program vychází ze cvičeních 7, 8, 9 s pojmenovanou rourou a více-vláknové aplikace.
Výsledné programy představují dílčí kroky pro snažší implementaci následně HW9.
Povinné zadání
Realizujte program, kterým bude řízeno blikání LED v Modulu.
Program musí obsahovat následující funcionality:
Č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á Modulu.
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
je 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 Modulu 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'.
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í z roury; 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. pojmenovaná roura a textový výstup na stdout. Benefitem takto organizovaného programu je snadné rozšíření. Jednodušší variantou je dedikovat zápis do roury 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).
Komunikace mezi aplikací a Modulem
'i' - init - může vyslat Modul po startu, žádná reakce není očekávána
's' - start - vysílá PC, Modul reaguje rozsvícením LED a odpovědí 'a'
'1' - set 1 - vysílá PC, Modul 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, Modul reaguje nastavením periody blikání LED na 100 ms a odpovědí 'a'
'3' - set 3 - vysílá PC, Modul reaguje nastavením periody blikání LED na 200 ms a odpovědí 'a'
'4' - set 4 - vysílá PC, Modul reaguje nastavením periody blikání LED na 500 ms a odpovědí 'a'
'5' - set 5 - vysílá PC, Modul reaguje nastavením periody blikání LED na 1000 ms a odpovědí 'a'
'e' - end - vysílá PC, Modul reaguje zhasnutím LED a odpovědí 'a'
'h' - hello - vysílá PC, Modul reaguje zasláním 'h'
'b' - bye - vysílá PC, Modul 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í z roury.
Dále Modul v případě, že periodicky bliká LED, vysílá znak 'x' při rozsvícení LED a znak 'o' při zhasnutí LED.
Odevzdání a hodnocení
Veřejné příklady + Makefile: bab36prga-hw08.zip
— Jan Faigl 2020/05/02 22:42 Update: Přídání binárek pro OS X a arch64
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í.
| Povinné zadání |
Název v BRUTE | HW08 |
Odevzdávané soubory | prga-hw08-main.c |
Argumenty při spuštění | žádné |
Procvičované oblasti | vlákna, pojmenovaná roura |