Rationale for Ada 2005: Introduction
RUSTOPBACKNEXT
ENG |
3.4 Tasking and real-time facilities
@ Unless mentioned otherwise all the changes in this section concern the Real-Time Systems annex. @ First, the well-established Ravenscar profile is included in Ada 2005 as directed by WG9. A profile is a mode of operation and is specified by the pragma Profile which defines the particular profile to be used. Thus to ensure that a program conforms to the Ravenscar profile we write
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rationale for Ada 2005: Introduction
ENGRUSTOPBACKNEXT3.4 Управление задачами и средствами реального времени
@ Если не упомянуто иначе все изменения в этом разделе касаются приложения Систем реального времени.
@ Во-первых, известная конфигурация Ravenscar включена в Аду 2005 как заявлено WG9. Конфигурация определяется прагмой Profile, которая определяет специфическую конфигурацию, которая будет использоваться. Таким образом, чтобы гарантировать, что программа соответствует конфигурации Ravenscar, мы должны написать:
|
@ Назначение Ravenscar состоит в том, чтобы ограничить использование некоторых средств управления задачами так, чтобы эффект программы был предсказуем. Это очень важно для критических по отношению к безопасности систем реального времени. Эффект от прагмы Ravenscar эквивалентен совместному эффекту от следующих прагм:
|
@ плюс прагма Restriction с главными параметрами, такими как No_Abort_Statements и No_Dynamic_Priorities.
@ Прагма Detect_Blocking и многие другие из Restrictions идентификаторов являются новыми в Аде 2005. Дальнейшие подробности будут даны в более поздней публикации.
@ Ада 95 позволяет менять приоритет задачи, но не разрешает менять ceiling приоритет защищенного объекта. Это исправлено в Аде 2005 введением атрибута Priority для защищенных объектов и возможностью изменить его простым присваиванием:
|
@ в защищенной операции объекта My_PO. Изменение вступает в силу в конце защищенной операции.
@ Контроль и управление временем выполнения, естественно, важны для программ в реальном времени. Ада 2005 включает пакеты для трех различных аспектов Аda.Execution_Time - корневого пакета и допускает контроль времени выполнения индивидуальных задач.
@ Ада.Execution_Time.Timers обеспечивает средства для определения таймеров и обработчиков, которые вызывает система времени выполнения, когда время выполнения задачи достигает заданного значения.
@ Ада.Execution_Time.Group_Budgets позволяет нескольким задачам совместно использовать бюджет и обеспечивает средства для того чтобы предпринять некое действие, когда бюджет истекает.
@ Время выполнения задачи или процессорное время, как его обычно называют, является временем, проведенным системой, выполняющей задачу или сервис от своего лица. Процессорное время представлено частным типом CPU_Time. Процессорное время специфической задачи получается вызовом функции Clock пакета Ada.Execution_Time.
|
@ Значение типа CPU_Time может быть преобразовано к Seconds_Count плюс остаточный Time_Span процедурой Split, подобной как в пакете Ada.Real_Time. Случайно нам гарантируют это, степень детализации процессорного времени не больше чем одна миллисекунда и что диапазон составляет по крайней мере 50 лет.
@ Чтобы узнать, когда задача достигает специфического процессорного времени, мы используем средства дочернего пакета Ada.Execution_Time.Timers. Он включает дискриминантный тип Timer и тип Handler:
|
@ Обратите внимание, как ссылочный дискриминант определяет использование и не пустого указателя и константы.
@ Тогда мы можем заставить таймер завершиться в некоторое абсолютное время:
|
@ и затем, когда процессорное время задачи достигает Time_Limit (типа CPU_Time), запустится защищенная процедура My_Handler. Обратите внимание, как объект таймера включает информацию относительно задачи, заинтересованной, использует ссылочный дискриминант и что его передают на обработчик через его параметр. Другая версия Set_Handler дает возможность таймеру быть вызванным после истечения некоторого интервала (типа Time_Span).
@ Чтобы программировать различные апериодические серверы (а это необходимо для задач совместно использующих бюджет центрального процессора) мы можем использовать дочерний пакет Ada.Execution_Time.Group_Budgets. В этом случае мы имеем:
|
@ Тип Group_Budget идентифицирует группу задач бюджета и размер бюджета. Различные подпрограммы дают возможность задачам быть добавленными к и удаленными из бюджета группы. Другие процедуры дают возможность бюджету быть установленным и пополненным.
@ Процедура Set_Handler связывает специфический обработчик с бюджетом.
|
@ Когда бюджет группы истекает, связанная с ним защищенная процедура выполняются.
@ Несколько связанный раздел - связанный раздел низкого уровня, рассчитывающего события. Средства предоставляются пакетом Ada.Real_Time.Timing_Events. В этом случае мы имеем:
|
@ Идея здесь состоит в том, что защищенная процедура может быть назначена, чтобы быть выполненной в некоторое время в будущем. Таким образом, чтобы зазвонить в звонок, когда наше яйцо будет варится более четырех минут у нас могла бы быть защищенная процедура:
|
@ и тогда:
|
@ Это средство - конечно очень низкий уровень который не вовлекает задачи Ады вообще. Отметим, что мы можем заставить событие происходить в некоторое абсолютное время так же как в относительное время как выше. Случайно, функция Minutes - новая функция, добавленная к родительской пакетау Ada.Real_Time. Иначе мы должны были бы написать кое-что вызывающее отвращение: 4 * 60 * Milliseconds (1000). Подобная функция Seconds была также добавлена.
@ В вышеупомянутом примере есть небольшой недостаток. Если мы будем прерваны телефоном между помещением яйца в воду и установкой обработчика тогда наше яйцо будет переварено. Мы увидим, как это исправить в более поздней публикации.
@ Читатели напомнят старую проблему того, как у задач может быть тихая смерть. Если кое-что в задаче идет не так как надо и в Аде 95 возбуждается исключение, которое не обрабатывается задачей, то она только испускает дух и исчезает. Для исключений всегда считали невозможным быть обработанным модулем включения из-за врожденной асинхронной природы событий.
@ Это преодолено в Аде 2005 пакетом Ada.Task_Termination, который обеспечивает средства для того, что они связали защищенную процедуру с задачей. Защищенная процедура вызывается, когда задача заканчивается с индикацией относительно причины. Таким образом, мы могли бы объявить защищенный объект Grim_Reaper
|
@ Мы можем тогда назначить Last_Gasp как защищенную процедуру, которую вызовут, когда задача T помрёт:
|
@ Тело защищенной процедуры Last_Gasp могло бы тогда вывести различные диагностические сообщение:
|
@ Есть три возможных причины для завершения: нормальное, аварийное, или вызванное необработанным исключением. В последнем случае параметр X сообщает подробности происхождения исключения.
@ Другая область увеличенной гибкости в Аде 2005 является политика диспетчеризации задач. В Аде 95, единственная предопределенная политика - FIFO_Within_Priorities, хотя и другая политика разрешена. Ада 2005 обеспечивает новые прагмы, политику и пакеты, которые обеспечивают много различных механизмов, таких как неприоритетное прерывание в пределах приоритетов, знакомый Циклический алгоритм, с использованием timeslicing, и позже приветствуемая политика Самый ранний Крайний срок Сначала (EDF). Кроме того, возможно, чтобы смешать различную политику согласно приоритетному уровню в пределах разделения.
@ Различные средства предоставлены пакетом Ada.Dispatching плюс два дочерних пакета:
@ Ada.Dispatching - это корневой пакет, он просто объявляет исключение Dispatching_Policy_Error.
@ Ada.Dispatching.Round_Robin - это допускает установку квантов времени для квантования времени в пределах одного или более приоритетных уровней.
@ Ada.Dispatching.EDF - это допускает установку пределов для различных задач.
@ Политика может быть выбрана для целого разделения одним из способов:
|
@ Чтобы смешать различную политику через различные приоритетные уровни, мы используем прагму Priority_Specific_Dispatching с различными идентификаторами политики следующим образом:
|
@ Это устанавливает Циклический алгоритм на приоритетном уровне 1, EDF на уровнях 2 - 10, и в порядке поступления на уровнях 11 - 24.
@ Последняя тема в этом разделе касается базового языка, а не приложения Систем реального времени.
@ Ада 2005 вводит средство, посредством которого объектно-ориентированные средсва и средства реального времени могут быть близко соединены через наследование.
@ Возвращаясь к разделу 3.1, мы можем объявить, что интерфейс ограничен таким образом тип LI, ограничен интерфейс;
@ Мы можем также объявить, что интерфейс синхронизирован, задача, или защищен таким образом тип, PI синхронизирован интерфейс;
|
@ Интерфейс задачи или защищенный интерфейс должны быть осуществлены типом задачи или защищали тип соответственно. Однако, синхронизированный интерфейс может быть осуществлен или типом задачи или защищенным типом. Эти интерфейсы могут также быть составлены с определенными ограничениями. Детальные примеры будут даны в более поздней публикации.
2010-10-24 00:26:52
. .