Специфікація BTRON3 (Український переклад) | Розділ 5: Ядро операційної системи (Kernel)
Повернутися до змісту розділу Ядра
Попередня сторінка: 1.8 Менеджер пристроїв (Повернутися)
Наступна сторінка: 1.10 Системне управління (Перейти)

1.9 Системний годинник та таймери (Clock & Timer Management)

1.9.1 Функції керування часом та таймерами

Підсистема керування часом та таймерами забезпечує:

Локальний астрономічний час обчислюється за формулою:

  Локальний_час = Системний_час - adjust + (dst_flg ? dst_adj * 60 : 0)

1.9.2 Структури даних та константи

□ Специфікація часового поясу (TIMEZONE)

typedef struct {
    W   adjust;     /* Різниця із системним часом GMT у секундах (-43200..+43200) */
    W   dst_flg;    /* 0 = без DST, != 0 = увімкнено літній час */
    W   dst_adj;    /* Величина корекції DST у хвилинах (наприклад, 60 хв) */
} TIMEZONE;

□ Календарна дата та час (DATE_TIM)

typedef struct {
    W   d_year;     /* Рік як зсув від 1900 (наприклад, 126 відповідає 2026 року) */
    W   d_month;    /* Місяць (1..12; 0 = спецрежим з використанням d_days) */
    W   d_day;      /* День місяця (1..31) */
    W   d_hour;     /* Година (0..23) */
    W   d_min;      /* Хвилина (0..59) */
    W   d_sec;      /* Секунда (0..59) */
    W   d_week;     /* Номер тижня у році (1..54) */
    W   d_wday;     /* День тижня (0..6; 0 = неділя) */
    W   d_days;     /* Порядковий день від початку року (1..366) */
} DATE_TIM;

□ Визначення таймера-аларма (T_DALM)

typedef struct {
    VP      exinf;      /* Додаткова інформація розширення (Extended Information) */
    ATR     almatr;     /* Атрибути аларму (TA_ASM, TA_HLNG, TA_CYC, TA_ABS) */
    FP      almhdr;     /* Адреса функції обробника аларму (Alarm Handler) */
} T_DALM;

□ Запит спрацьовування аларма (T_RALM)

typedef struct {
    STIME   almtime;    /* Час першого спрацьовування (абсолютний або відносний) */
    UW      cyctime;    /* Циклічний інтервал у мілісекундах (0 = одноразовий) */
} T_RALM;

1.9.3 Системні виклики керування часом та таймерами

get_tim
Get System Time
Отримання поточного системного часу та часового поясу (Get System Time)

【Синтаксис / Прототип】

ERR get_tim(STIME *time, TIMEZONE *tz)

【Параметри】

STIME    *time  Буфер для збереження системного часу GMT (NULL = не повертати)
TIMEZONE *tz    Буфер для збереження параметрів часового поясу (NULL = не повертати)

【Значення, що повертається】

= 0     Успішне виконання (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Зчитує поточне значення астрономічного системного часу у секундах за Гринвічем (GMT), а також поточні налаштування часового поясу та літнього часу.

【Коди помилок】

ER_ADR : Неприпустима адреса вказівника time або tz у віртуальній пам'яті.
set_tim
Set System Time
Встановлення системного часу та часового поясу (Set System Time)

【Синтаксис / Прототип】

ERR set_tim(STIME time, TIMEZONE *tz)

【Параметри】

STIME     time  Нове значення системного часу GMT (<= 0 = не змінювати час)
TIMEZONE *tz    Нове значення параметрів часового поясу (NULL = не змінювати пояс)

【Значення, що повертається】

= 0     Успішне виконання (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Встановлює значення системного годинника астрономічного часу та налаштування часового поясу. Для зміни системного часу процес повинен мати системні привілеї адміністратора.

【Коди помилок】

ER_ACCES : Нестача привілеїв для зміни системного часу.
ER_ADR   : Неприпустима адреса вказівника tz у пам'яті.
ER_PAR   : Неприпустимі значення параметрів adjust або dst_adj у tz.
get_tod
Get Time of Day / Calendar
Перетворення системного часу у календарну дату (Get Calendar Date)

【Синтаксис / Прототип】

ERR get_tod(DATE_TIM *dt, STIME time, Bool local)

【Параметри】

DATE_TIM *dt    Буфер для збереження календарної дати
STIME     time  Значення системного часу для перетворення (<= 0 = поточний час)
Bool      local Прапорець: 0 = час за GMT, != 0 = локальний час з урахуванням поясу

【Значення, що повертається】

= 0     Успішне виконання (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Конвертує 32/64-бітне значення системного часу time у структуровану календарну дату dt (рік, місяць, день, година, хвилина, секунда, день тижня).

【Коди помилок】

ER_ADR : Неприпустима адреса вказівника dt у пам'яті.
set_tod
Set Time of Day / Calendar
Перетворення календарної дати у системний час та встановлення годинника

【Синтаксис / Прототип】

ERR set_tod(DATE_TIM *dt, STIME *time, Bool local)

【Параметри】

DATE_TIM *dt    Календарна дата та час для перетворення
STIME    *time  Буфер для збереження отриманого часу (при NULL = встановити час годинника)
Bool      local Прапорець: 0 = дата вказана за GMT, != 0 = локальна дата

【Значення, що повертається】

= 0     Успішне виконання (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Обчислює системний час STIME за вказаною календарною датою dt. Якщо параметр time = NULL, розраховане значення автоматично встановлюється як поточний системний час ОС.

【Коди помилок】

ER_ACCES : Нестача привілеїв для зміни системного годинника (при time = NULL).
ER_ADR   : Неприпустима адреса вказівника dt або time у пам'яті.
ER_PAR   : Некоректна дата (наприклад, 31 лютого або невизначений місяць).
dly_tsk
Delay Task Execution
Затримка виконання поточної задачі (Delay Task)

【Синтаксис / Прототип】

ERR dly_tsk(DLYTIME dlytim)

【Параметри】

DLYTIME dlytim  Інтервал затримки у мілісекундах (0 = поступитися квантом часу)

【Значення, що повертається】

= 0     Успішне виконання після завершення затримки (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Переводить поточну задачу у стан очікування затримки WAIT_DLY на інтервал dlytim мілісекунд. Після закінчення інтервалу задача повертається у стан готовності READY. Якщо dlytim = 0, задача віддає залишок свого поточного кванту часу процесора іншим задачам із таким самим пріоритетом (Yield).

【Коди помилок】

ER_CTX : Виклик з обробника переривань або в режимі виключення диспечера.
ER_PAR : Неприпустиме або від'ємне значення інтервалу dlytim.
def_alm
Define Alarm Handler
Створення та реєстрація обробника аларм-таймера (Define Alarm Handler)

【Синтаксис / Прототип】

ERR def_alm(ID almid, T_DALM *pk_dalm)

【Параметри】

ID      almid    Ідентифікатор аларм-таймера (1..N)
T_DALM *pk_dalm  Вказівник на структуру параметрів аларму (NULL = видалити аларм)

【Значення, що повертається】

= 0     Успішне створення або скасування обробника (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Реєструє у системі новий аларм-таймер з ідентифікатором almid та вказаною процедурою обробника almhdr. При pk_dalm = NULL зареєстрований аларм вилучається із системи.

【Коди помилок】

ER_ID  : Неприпустимий ідентифікатор almid.
ER_ADR : Неприпустима адреса вказівника pk_dalm або almhdr у пам'яті.
ER_OBJ : Обробник аларму з таким almid вже існує.
req_alm
Request Alarm Timer Trigger
Запуск та запит спрацьовування аларм-таймера (Request Alarm)

【Синтаксис / Прототип】

ERR req_alm(ID almid, T_RALM *pk_ralm)

【Параметри】

ID      almid    Ідентифікатор зареєстрованого аларм-таймера
T_RALM *pk_ralm  Вказівник на структуру із часом спрацьовування та циклом

【Значення, що повертається】

= 0     Успішний запуск таймера (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Активує аларм-таймер almid. Таймер почне відлік і при досягненні часу almtimeвикличе зареєстрований обробник. Якщо вказано cyctime > 0, аларм буде автоматично перезапускатися через кожні cyctime мілісекунд (циклічний таймер).

【Коди помилок】

ER_ID  : Неприпустимий ідентифікатор almid.
ER_NOEXS: Обробник аларму з ідентифікатором almid не зареєстрований (def_alm).
ER_ADR : Неприпустима адреса вказівника pk_ralm у пам'яті.
can_alm
Cancel Alarm Timer
Зупинка та скасування аларм-таймера (Cancel Alarm)

【Синтаксис / Прототип】

ERR can_alm(ID almid)

【Параметри】

ID      almid    Ідентифікатор аларм-таймера

【Значення, що повертається】

= 0     Успішна зупинка аларм-таймера (E_OK)
< 0     Помилка (Код помилки)

【Детальний опис】

Зупиняє активний відлік аларм-таймера almid і скасовує подальші циклічні або одноразові виклики його обробника.

【Коди помилок】

ER_ID   : Неприпустимий ідентифікатор almid.
ER_NOEXS: Аларм-таймер з таким almid відсутній або не запущений.

Повернутися до змісту розділу Ядра
Попередня сторінка: 1.8 Менеджер пристроїв (Повернутися)
Наступна сторінка: 1.10 Системне управління (Перейти)