Spec-Zone.ru › Ada 2005
Справочник Ada 2005

D.1 Приоритеты задач

Данный пункт описывает модель приоритетов для систем реального времени. Кроме того, определяются методы задания приоритетов.

Синтаксис

Форма директивы Priority выглядит следующим образом:
pragma Priority(выражение);
Форма директивы Interrupt_Priority выглядит следующим образом:
pragma Interrupt_Priority[(выражение)];

Правила разрешения имен

Ожидаемый тип для выражения в директивах Priority или Interrupt_Priority — Integer.

Правила допустимости

Директива Priority разрешена только непосредственно внутри определения задачи, определения защищенного объекта или в декларативной части тела подпрограммы. Директива Interrupt_Priority разрешена только непосредственно внутри определения задачи или определения защищенного объекта. В данном конструкте может быть указана не более одной такой директивы.
Для директивы Priority, которая появляется в декларативной части тела подпрограммы, выражение должно быть статическим, а его значение должно находиться в диапазоне System.Priority.

Статические семантика

В пакете System существуют следующие объявления:
subtype Any_Priority is Integer range определяется реализацией;
subtype Priority is Any_Priority
range Any_Priority'First .. определяется реализацией;
subtype Interrupt_Priority is Any_Priority
range Priority'Last+1 .. Any_Priority'Last;
Default_Priority : constant Priority := (Priority'First + Priority'Last)/2;
Полный диапазон значений приоритета, поддерживаемый реализацией, задается подтипом Any_Priority. Поддиапазон значений приоритета, достаточных для блокирования одного или нескольких прерываний, задается подтипом Interrupt_Priority. Поддиапазон значений приоритета ниже System.Interrupt_Priority'First задается подтипом System.Priority.
Приоритет, задаваемый директивами Priority или Interrupt_Priority, равен значению выражения в директиве, если оно присутствует. Если в директиве Interrupt_Priority выражения нет, значение приоритета равно Interrupt_Priority'Last.

Динамическая семантика

Директива Priority не имеет эффекта, если она появляется в декларативной части тела подпрограммы подпрограммы, отличной от главной.
Приоритет задачи — целое значение, которое указывает степень срочности и служит основой для разрешения конфликтующих требований задач к ресурсам. Если не указано иное, при конкуренции задач за процессоры или другие ресурсы, реализуемые ресурсы распределяются задаче с наибольшим значением приоритета. Базовый приоритет задачи — это приоритет, с которым она была создана или который был позже установлен с помощью Dynamic_Priorities.Set_Priority (см. D.5). В любое время задача также имеет активный приоритет, который обычно отражает ее базовый приоритет, а также любой приоритет, который она унаследовала из других источников. Наследование приоритетов — это процесс, в котором приоритет задачи или другого объекта (например, защищенного объекта; см. D.3) используется при оценке активного приоритета другой задачи.
Эффект задания такой директивы в определении защищенного объекта обсуждается в D.3.
Выражение в директивах Priority или Interrupt_Priority, которые появляются в определении задачи, оценивается для каждого объекта задачи (см. 9.1). Для директивы Priority значение выражения преобразуется к подтипу Priority; для директивы Interrupt_Priority это значение преобразуется к подтипу Any_Priority. Затем значение приоритета связывается с объектом задачи, определение задачи которого содержит директиву.
Аналогично, значение приоритета связывается с задачей окружения, если директива появляется в декларативной части основной подпрограммы.
Начальное значение базового приоритета задачи задается по умолчанию или с помощью директивы Priority или Interrupt_Priority. После создания задачи ее базовый приоритет может быть изменен только вызовом Dynamic_Priorities.Set_Priority (см. D.5). Начальный базовый приоритет задачи в отсутствие директивы — это базовый приоритет создавшей ее задачи на момент создания (см. 9.1). Если директива Priority не применяется к главной подпрограмме, начальный базовый приоритет задачи окружения — System.Default_Priority. Активный приоритет задачи используется, когда задача конкурирует за процессоры. Аналогично, активный приоритет задачи используется для определения позиции задачи в очереди, если указано Priority_Queuing (см. D.4).
В любое время активный приоритет задачи — это максимальное значение всех приоритетов, которые задача унаследовала в данный момент. Для задачи, которая не удерживается (см. D.11), ее базовый приоритет является источником наследования приоритетов, если не указано иное для конкретной политики диспетчеризации задач. Другие источники наследования приоритетов задаются в следующих условиях:
  • При активации задача, которая активизируется, наследует активный приоритет, который ее активизатор (см. 9.2) имел на момент инициирования активации.
  • При rendez-vous задача, принимающая вызов входа, наследует приоритет вызова входа (см. 9.5.3 и D.4).
  • Во время защищенного действия над защищенным объектом задача наследует приоритет потолка защищенного объекта (см. 9.5 и D.3).
Во всех этих случаях наследование приоритета прекращается, как только условие, требующее наследования, больше не выполняется.

Требования к реализации

Диапазон System.Interrupt_Priority должен включать по крайней мере одно значение.
Диапазон System.Priority должен включать по крайней мере 30 значений.
ПРИМЕЧАНИЯ
4 Выражение приоритета может включать ссылки на дискриминанты окружающего типа.
5 Из правил активного приоритета следует, что в момент, когда задача перестает наследовать приоритет от другого источника, ее активный приоритет переоценивается. Это дополнительно к другим случаям такой переоценки, описанным в этом приложении.
6 Реализация может предоставить нестандартный режим, в котором задачи наследуют приоритеты в условиях, отличных от указанных выше.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API