Tohle má jako spoluautor na starosti:

Můj ukol:

Odkaz na stránku minulých autorů: KLIK ZDE


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.


Veřejné rozhraní pro CLOCK TASK:

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:

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


Popis vnitřní struktury pro CLOCK TASK:

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.


TOP