Tohle má jako spoluautor na starosti:
Můj ukol:
Odkaz na stránku minulých autorů: KLIK ZDE
OBECNÝ POPIS CLOCK TASKU:
Při spuštění TUOXu se zavolá funkce clock_task(), ve které
se inicializují hodiny a je spuštěna nekonečná smyčka pro odchytávaní zpráv.
Jedná se o zprávy: set_alarm - nastavení alarmu, tzn. času
po kterém chce být proces upozorněn. Pokud je nastavovaný čas nulový, je
daný alarm zrušen(dále viz níže).
set_time - nastavení času v sekundách.
get_time - zjištění momentálního času.
clock_tick - zpráva generovaná obslužnou rutinou přerušení
vždy při tiku hodin. Voláno ideálně každý tik hodin, jinak vždy, když je
clock task ochoten zprávu převzít (tehdy se musí kompenzovat lost_ticks).
Jak do_clock_tick() funguje:
pokud běží proces, je třeba vyřídit alarm => hledají se procesy k vyvolání
alarmu a vyvolá se alarm.Pokud došlo k vypršení kvanta, zavolá se scheduler
(prev_ptr je proces, který běžel před vstupem do CLOCK tasku, protože v
proc_ptr je zde vždy CLOCK).
Při ukončení TUOXu je ještě třeba zavolat finkci clock_stop(),
která nastaví frekvenci hodin zpět na původní hodnotu.
Zprávy typu m6 a m2:
m_type |
CLOCK_PROC |
FUNC |
NEW_TIME |
SET_ALARM |
proc_nr |
func_ptr |
delta |
SET_TIME |
newtime |
. | . |
GET_TIME |
. | . | . |
CLOCK_TICK |
. | . | . |
Popis:
SET_ALARM -Volá se, pokud chce byt proces po určitém intervale upozorněn. Tento interval je v sekundách. Proces chce alarm signál, task chce danou watch_dog funkci volanou po určitém intervale. Jestliže je alarm ukončen a volající je user proces je mu poslán signál SIGALRM. Je-li to task, je funkce specifikovaná volajícím vyvolána.
proc_nr - číslo procesu.
func_ptr - ukazatel na alarm funkci (u tasku).Ukazatel je near ptr v rámci
společného kódového segmentu jádra a tasku.
delta - za jak dlouho se má poslat alarm (v sekundách).
SET_TIME - Volá se, když chce proces nastavit čas v sekundách.
newtime - novy cas v sekudách (od 1.1.1970).
GET_TIME - Volá se, když chce proces zjistit čas. Je vrácen aktualní čas v sekundách a počet milisekund.
CLOC_TICK - Informace pro clock task, že doslo k HW prerušení od hodin.
Popis parametrů zpráv:
Parametry jednotlivých funkcí jsou uloženy ve zprávě typu m6 a m2. Konkrétně :
CLOCK_PROC m_u.m_m2.m2i1 - číslo procesu (první integer).
FUNC m_u.m_m6.m6f1 - ukazatel na alarm funkci (první float).
NEW_TIME m_u.m_m2.m2l1 - delta v sekundách (první long).
Popis návratových zpráv:
SET_ALARM:
message.RET_ERROR_CODE = OK - návratový chybový kód.
message.m_type = TASK_REPLY - že se jedná o odpověď.
GET_TIME:
message.RET_REAL_TIME_S - počet sekund od 1.1.1970.
message.RET_REAL_TIME_M - počet milisekund.
message.RET_ERROR_CODE = OK - návratový chybový kód.
message.m_type = TASK_REPLY - že se jedná o odpověd.
SET_TIME:
message.RET_ERROR_CODE = OK - návratový chybový kód.
message.m_type = TASK_REPLY - že se jedná o odpověď.
Používané makra a proměnné:
#define CLOCK_PROC m_u.m_m2.m2i1 - číslo procesu.
#define FUNC m_u.m_m6.m6f1 - ukazatel na alarm funkci.
#define NEW_TIME m_u.m_m2.m2l1 - čas, který se má nastavit (delta) v sekundách.
#define RET_ERROR_CODE m_u.m_m2.m2i1 - chybový kód vrácený z funkcí.
#define RET_PROC_NR m_u.m_m2.m2i2 - číslo procesu, který vrací zprávu.
#define RET_REAL_TIME_S m_u.m_m2.m2l1 - návratová hodnota z funkce GET_TIME
- počet sekund od 1.1.1970.
#define RET_REAL_TIME_M m_u.m_m2.m2l2 - návratová hodnota z funkce GET_TIME
- počet milisekund.
EXTERN real_time realtime - počet milisekund.
Funkce:
PUBLIC void clock_task() - smyčka, která odchytává zprávy (pouští se
jednou na začátku TUOXu).
PUBLIC void clock_stop() - nastavení frekvence hodin počítače na původní
hodnotu (volá se při ukončení TUOXu).
Ostatní používané makra a proměnné:
#define MILLISEC 100 - jak často volat scheduler (v milisekundách).
#define SCHED_RATE (MILLISEC*HZ/1000) - počet tiků.
PRIVATE real_time next_alarm - čas dalšího alarmu.
PUBLIC real_time boot_time - čas v sekundách od bootu systemu (1.1.1970).
PRIVATE int sched_ticks = SCHED_RATE - čítač: pokud je 0 volá se scheduler.
PRIVATE void (*watch_dog[NR_TASKS+NR_PROCS])() - watch dog funkce, která
se má volat.
Ostatní funkce:
PRIVATE void do_set_alarm(message* m_ptr) - nastavení alarmu.
PRIVATE void do_get_time(message * m_ptr) - vratí čas v sekundách.
PRIVATE void do_set_time(message* m_ptr) - nastavení času.
PRIVATE accounting() - zvýšení počtu tiků.
PRIVATE void init_clock() - nastavení systémových hodin (8253), čas se
počítá od 1.1.1970 v sekundách.
PRIVATE void do_clock_tick() - zpráva generovaná obslužnou rutinou přerušení
vždy při tiku hodin.