Search
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í.
io_open_write()
./binaries/bab36prga-hw9-module
tail -f /tmp/prga-hw9.in
Realizujte program, kterým bude řízeno blikání LED v Modulu. Program musí obsahovat následující funcionality:
Modulu
"\rLED %3s send: '%c' received: '%c', T = %4d ms, ticker = %4d"
%3s
%c
%4d
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'.
on
off
stdout
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.
Program obsluhuje dva zdroje asynchronních událostí - z klavesnice a z modulu. Pro každý takový zdroj je výhodné realizovat samostatné vlákno, které řeší konkrétní vstup. Kromě toho můžeme identifikovat proces počítání periody na základě přijatých zpráv z Modulu, ze kterých počítáme průměrnou periodu za 5 sekund, což můžeme realizovat samostatným vláknem, které periodicky po 5 sekundách spočítá průměr. V neposlední řadě máme společný sdílený prostředek, kterým je výstup na terminál v podobě stavového řádku, to můžeme realizovat jako sdílený přístup ke zdroji prostřednictvím zámku (mutexu), nicméně pak by každé vlákno musele vypisovat celý řádek. Proto může být výhodnější realizovat samostnatné vlákno, které bude vypisovat stav aplikace pokud dojde k nějaké změně (realizujeme jako čekání na podmíněnou proměnnou conditional variable. Dalším sdíleným prostředkem je zasílání zpráv modulu, nicméně z principu funkce programu se to děje pouze po uživatelské interakce, tj. stisku klávesy. Program tak realizujeme Boss/worker architekturou, kde hlavní vláknou vytvoří jednotlivá vlákna a následně bude čekat na jejich ukončení, podobně jako v příkladu z přednášky 11.
Mezi vlákny můžeme sdílet společnou strukturu, ve které budeme mít informace potřebné k výpisu na stdout, tj. stav LED, poslední odeslaný znak, poslední přijatý znak, odhadnutá perioda blikání. Dále pak informaci o požadavkuna ukončení programu, tak abychom korektně ukončili všechna vlákna, informaci o počtu přijatých bliknutích LED, případně odkazy na soubory pro čtení a zápis (file descriptor) pojmenované roury pro čtení a zápis realizující komunikaci s Modulem, to pokud otevření souborů realizujeme v hlavním vlákně, což může být výhodné, pokud se otevření nezdaří, nebudeme ani ostatní vlákna pouštět. Dále též proměnnou typu mutex a podmíněnnou proměnnou pro synchronizaci vláken.
Modulem
modulu
pthread_cond_broadcast()
io_getc_timeout()
shared_data→quit = true;
getchar()
usleep()
pthread_cond_wait()
pop()
push()
EV_QUIT
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í.
prga-hw9-main.c