Available Languages?:

OSA : События и приоритетность

Состояния задач

Для синхронизации работы задач между собой в системе применяются события. Например, есть две активные (созданные) задачи: одна измеряет температуру, а другая выводит данные на экран. Вторая задача не может выводить на экран значение температуры, если температура еще не измерена. Поэтому вторая задача ожидает событие от первой, что измерение завершено, т.е. находится в режиме ожидания. После того, как температура измерена, т.е. происходит событие, которого ожидала вторая задача, вторая задача переходит в состояние готовности. После этого она может получить управление, т.е. перейти в работу. Кроме того, есть возможность присотановить здачу, а потом запустить вновь с того же места.

Таким образом, все активные (т.е. созданные сервисом OS_Task_Create) задачи, работающие в OSA, могут находиться в одном из пяти состояний:

не создана задачи нет в списке активных задач (она либо не создана, либо была удалена)
в ожидании задача ждет какого-то события
в готовности задача дождалась своего события, но еще не начала выполняться.
в работе задача непосредственно выполняется
приостановлена задача приостановлена из-вне. Она активна, но не получает управления.

Для того чтобы задача получила управление, нужно, чтобы:

  • во-первых, произошло то событие, которого она ждет (т.е. стала готовой к выполнению);
  • во-вторых, чтобы она стала наиболее приоритетной из готовых.

События

События в OSA:

  1. семафор (двоичный или счетный);
  2. сообщение (указатель на тело сообщения или короткое однобайтовое сообщение);
  3. любое выражение перечислимого типа (см. OS_Wait).

О первых четырех типах событий речь пойдет в соответствующих разделах этой документации. Пятый тип - дополнительный - это некое расширение системы, которое позволяет ждать какого-нибудь несистемного события

Например:

    OS_Wait(TMR1IF);            // Ждем установки флага TMR1IF
    или
    OS_Wait(ReadADC(0) > 128);  // Ждем, когда напряжение на входе АЦП будет > Vdd/2

Для ожидания событий пятого типа есть два системных сервиса OS_Wait и OS_Wait_TO, которые описаны в разделе системные сервисы.

Приоритеты

Все задачи имеют приоритет от 0 (самый высокий приоритет) до 7 (самый низкий приоритет). Система может работать в одном из трех режимов:

  • поддержка приоритетности отключена - назначенные задачам приоритеты игнорируются, задачи выполняются по очереди;
    • Преимущества: требует меньше памяти, быстро выполняется поиск готовой к выполнению задачи;
    • Недостатки: нет возможности выделить более важные задачи, в следствии чего важной задаче придется ждать своей очереди, прежде чем она сможет получить управление;
  • обычный приоритетный режим - если к выполнению готовы сразу несколько задач, то первой выполнится та, приоритет которой выше. Если есть несколько готовых задач с одинаковым приоритетом, то они выполнятся последовательно. При постоянной готовности высокоприоритетной задачи, задачи с низким приоритетом управления не получают;
    • Преимущества: есть возможность обозначить более важные и менее важные задачи для получения доступа к какому-либо ресурсу;
    • Недостатки:
      1. более медленный режим, чем неприоритетный;
      2. задачи проверяются на готовность в строгой последовательности; это значит, что если один и тот же ресурс ожидают две задачи с одинаковым приоритетом, то та из них, которая была создана позже, может не получить управления;
  • расширенный приоритетный режим NEW - все задачи получают управление пропорционально назначенным приоритетам. Например постоянно являются готовыми к выполнению задачи с приоритетами 3 и 4. При этом та, чей приоритет выше (3), будет получать управление чаще (55-60%).
    • Преимущества: все задачи (включая низкоприоритетные) гарантировано получают управление
    • Недостатки: самый медленный планировщик; требуются дополнительные 2 байта ОЗУ на каждую задачу.

Для оценки скорости работы планировщика в различных приоритетных режимах и на различных платформах см. Скоростные характеристики.

Режим определяется на этапе компиляции и не может быть изменен в ходе выполнения программы. Для выбора режима нужно в файле конфигурации osacfg.h определить константу OS_PRIORITY_LEVEL:

#define OS_PRIORITY_LEVEL    OS_PRIORITY_DISABLE    // Для неприоритетного режима
#define OS_PRIORITY_LEVEL    OS_PRIORITY_NORMAL     // Для обычного приориетного режима
#define OS_PRIORITY_LEVEL    OS_PRIORITY_EXTENDED   // Для расширенного приоритетного режима

По умолчанию установлен режим OS_PRIORITY_NORMAL.

Состязания приоритетов

Бывает так, что одного и того же события одновременно ожидают две или более задач. Например, они ждут освобождения какого-нибудь ресурса (USART или доступ к внешней EEPROM). Как поведет себя система в этом случае? После того, как событие произойдет, все задачи, ожидающие это событие, перейдут в состояние готовности. Управление же получит задача с наиболее высоким приоритетом. Если после того, как эта задача отработает, событие сбрасывается (например, все задачи ожидали включения семафора, а та задача, которая получила управление, его сбросила), то все остальные задачи опять переходят в состояние ожидания.

В расширенном приоритетном режиме приоритет задачи, дождавшейся события, но не получившей управления из-за того, что более приоритетная уже обработала его, повышается. Это увеличивает ее шанс получить управления при следующем возникновении события.

 
osa/ref/description/events_and_priority.txt · Последние изменения: 07.10.2010 13:54 (внешнее изменение)
 
Creative Commons License Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki