Сервис | Описание | Свойства |
---|---|---|
OS_Init() | Инициализация переменных системы. Должна вызываться один раз в начале программы (до основного цикла). |
Выполняет начальную инициализация переменных системы OSA. Должна вызываться один раз в начале программы (до основного цикла). Этот сервис обнуляет список задач, сбрасывает все бинарные семафоры, очищает список динамических таймеров.
Сервис | Описание | Свойства |
---|---|---|
OS_Timer() | Обработка всех таймеров (вставляется в периодическое место в программе, например, в прерывание по таймеру). Эта функция должна использоваться, если в программе есть OS_Delay, работа с пользовательскими таймерами или ожидание событий с таймаутом. |
Этот сервис должен использоваться, если в программе есть одно из ниже перечисленного:
При каждом вызове OS_Timer() все активные таймеры увеличиваются на 1 (все неактивные - пропускаются), кроме 24-битных статических таймеров, которые уменьшаются 1 раз в 256 вызовов (см. 2.12.2.1).
Пример использования:
void interrupt isr() { if (T0IE && T0IF) { TMR0 -= 250; T0IF = 0; OS_Timer(); } }
Сервис | Описание | Свойства |
---|---|---|
OS_Yield () | Передача управления планировщику |
Этот сервис безусловно передает управление операционной системе, давая, таким образом, возможность выполниться другим задачам.
Сервис | Описание | Свойства |
---|---|---|
OS_Delay (delaytime) | Выдерживаем паузу внутри задачи (в тиках - периодах вызова OS_Timer) |
Переводит задачу в состояние ожидания на время, заданное параметром delaytime. Параметр задается в системных тиках - периодах вызова сервиса OS_Timer.
Например, если в задаче требуется выводить индикацию температуры раз в секунду, то можно воспользоваться этим сервисом (в этом примере предполагаем, что системный тик, т.е. интервал вызова OS_Timer() равен 10 мс):
void Task_Indicate (void) { for (;;) { OS_Delay(100); // Задержка = 100 * 10 мс = 1 сек IndicateTemerature(); // Отображаем температуру } }
Используя этот сервис (и вообще, все сервисы ожидания с таймаутами), следует быть внимательным и помнить, что OS_Timer, который отсчитывает системные тики для них, - дискретный. Следовательно, точность задания задержки равна одному тику системного таймера. Если системный тик равен 10 мс, то OS_Delay(1) - может прождать 10 мс, а может и ничего не прождать (зависит от того, через какое время произойдет вызов OS_Timer()). Поэтому нужно либо быть уверенным в том, что длительность задержки не существенна для конкретной задачи, либо сократить интервал вызова OS_Timer и увеличить параметр delaytime в OS_Delay. Например, участив в 10 раз вызов OS_Timer, т.е. превратив системный тик в 1 мс (вместо 10 мс) мы можем написать: OS_Delay(10) - и быть уверенными, что задержка будет 9-10мс.
Сервис | Описание | Свойства |
---|---|---|
OS_Wait (condition) | Ожидаем выполнения условия |
Переводит задачу в режим ожидания до тех пор, пока не будет выполнено заданное условие. Условием condition в данном случае может быть любое выражение перечислимого типа (bool, char, int и т.д.). Как только условие выполняется, задача переходит в состояние готовности и, как только становится самой приоритетной из всех готовых, получает управление. Исключение - состязяние приоритетов.
... OS_Wait(m_nInPulseCounter >= 10 || m_bButtonPressed); ...
В этом примере m_nInPulseCounter и m_bButtonPressed - некие внешние глобальные переменные, которые изменяются где угодно в программе (например, в прерывании). Программа будет в режиме ожидания, пока условие не выполнится (в нашем примере, пока не придет больше 10 импульсов, или пока не будет нажата кнопка).
Сервис | Описание | Свойства |
---|---|---|
OS_Wait_TO (condition, timeout) | Ожидаем выполнения условия с таймаутом |
То же самое, что и OS_Wait, но с дополнительным условием выхода - таймаутом. Задача переводится в состояние ожидание до тех пор, пока не быдет выполнено условие condition или пока не пройдет время timeout. Таймаут задается в системных тиках.
... OS_Wait_TO(m_bButtonPressed, 100); if (OS_IsTimeout()) ...; ...
В данном примере мы в течение 100 тиков (если 1 тик = 10мс, то в течение секунды) ждем нажатия кнопки. После выхода из ожидания проверяем, по какой причине вышли из ожидания: по выполнению условия или по таймауту.
Все сервисы проверки состояния системы вызвращают либо 0 либо 1, в зависимости от состояния внутренних системных флагов.
Сервис | Описание | Свойства |
---|---|---|
bool OS_IsTimeout () | Проверка, вышли ли из ожидания по таймауту |
Этот сервис можно применять только в задачах после любого сервиса ожидания с таймаутом для проверки, по какой причине вышли из ожидания: дождались ли того, что ждали, или по таймауту. Возвращает 1, если вышли из ожидания по таймауту.
Сервис | Описание | Свойства |
---|---|---|
bool OS_IsError () | Проверка, была ли ошибка |
Системными ошибками счиатаюстя:
Сервис | Описание | Свойства |
---|---|---|
bool OS_IsEventError () | Проверка, была ли ошибка события |
Ошибками события считаются:
Сервис | Описание | Свойства |
---|---|---|
bool OS_IsInCriticalSection () | Возвращает 1, если одна из задач находится в критической секции. |
Сервис | Описание | Свойства |
---|---|---|
OS_EnterInt () | Для PICC и PICC18: Должна выполняться при входе в прерывание (сохраняет FSR) |
Сервис | Описание | Свойства |
---|---|---|
OS_LeaveInt () | Для PICC и PICC18: Должна выполняться перед выходом из прерывания (восстанавливает FSR) |
OS_EnterInt вставляется в самом начале прерывания, сразу после описания переменных функции прерывания, а OS_LeaveInt - в самом конце перед закрывающей скобкой "}". Например:
void interrupt int_routine (void) { char var1, var2; int var3; OS_EnterInt(); ... // Здесь делается проверка флагов прерываний ... // и обработка OS_LeaveInt(); }
Сервис | Описание | Свойства |
---|---|---|
char OS_DI () | Запретить прерывания. Текущие значения GIEx сохраняются |
Этот сервис не просто запрещает прерывания, а еще возвращает состояние битов GIEx. Для PIC18 при IPEN=1 запрещаются (и, соответственно, сохраняются) GIEH и GIEL, а при IPEN=0 - только GIE.
Сервис | Описание | Свойства |
---|---|---|
OS_EI () | Разрешить прерывания |
Сервис OS_EI() разрешает прерывания. Для PIC18 при IPEN=1 разрешаются и GIEH и GIEL, а при IPEN=0 - только GIE.
Сервис | Описание | Свойства |
---|---|---|
OS_RI (char) | Восстановить сохраненные в OS_DI() значения GIEx. |
Сервис OS_RI(char) восстанавливает прерывания из параметра char (полученного сервисом OS_DI()). Для PIC18 при IPEN=1 восстанавливаются и GIEH и GIEL, а при IPEN=0 - только GIE.
Ниже приведен пример использования этих сервисов при генерации одиночного импульса длительностью 5 тактов:
{ char gie_temp; ... gie_temp = OS_DI(); RB0 = 1; NOP(); NOP(); NOP(); NOP(); RB0 = 0; OS_RI(gie_temp); ... }
Сервис | Аргументы | Описание | Свойства |
---|---|---|---|
Системные | |||
OS_Sched | | Основная работа операционки, вызывается в главном цикле функции main() | |
OS_Run | | Запускает ядро операционки в работу. | main() |
OS_Init | | Инициализация переменных системы. | |
OS_Timer | | Обработка всех таймеров | |
Ожидание | |||
OS_Yield | | Передача управления планировщику | |
OS_Delay | (delaytime) | Выдерживаем паузу внутри задачи | |
OS_Wait | (condition) | Ожидаем выполнения условия | |
OS_Wait_TO | (condition, timeout) | Ожидаем выполнения условия с таймаутом | |
Проверка состояния | |||
bool OS_IsTimeout | | Проверка, вышли ли из ожидания по таймауту | |
bool OS_IsError | | Проверка, была ли ошибка | |
bool OS_IsEventError | | Проверка, была ли ошибка события | |
bool OS_IsInCriticalSection | | Возвращает 1, если одна из задач находится в критической секции. | |
Прерывания | |||
OS_EnterInt | | Должна выполняться при входе в прерывание (сохраняет FSR) | |
OS_LeaveInt | | Должна выполняться перед выходом из прерывания (восстанавливает FSR) | |
char OS_DI | | Запретить прерывания. Текущие значения GIEx сохраняются | |
OS_EI | | Разрешить прерывания | |
OS_RI | (char) | Восстановить сохраненные в OS_DI() значения GIEx. | |
OS_EnterCriticalSection | | Вход в критическую секцию | |
OS_LeaveCriticalSection | | Выход из критической секции |