Rationale for Ada 2005: Tasking and Real-Time

RUSTOP
BACKNEXT

ENG

4. The Ravenscar profile

@ The purpose of the Ravenscar profile is to restrict the use of many tasking facilities so that the effect of the program is predictable. The profile was defined by the International Real-Time Ada Workshops which met twice at the remote village of Ravenscar on the coast of Yorkshire in North- East England. A general description of the principles and use of the profile in high integrity systems will be found in an ISO/IEC Technical Report [2] and so we shall not cover that material here.

@ Here is a historical interlude. It is reputed that the hotel in which the workshops were held was originally built as a retreat for King George III to keep a mistress. Another odd rumour is that he ordered all the natural trees to be removed and replaced by metallic ones whose metal leaves clattered in the wind. It also seems that Henry Bolingbroke landed at Ravenscar in July 1399 on his way to take the throne as Henry IV. Ravenscar is mentioned several times by Shakespeare in Act II of King Richard II; it is spelt Ravenspurg which is slightly confusing – maybe we need the ability to rename profile identifiers.

@ A profile is a mode of operation and is specified by the pragma Profile which defines the particular profile to be used. The syntax is

  1        pragma Profile (profile_identifier [, profile_argument_associations]);

@ where profile_argument_associations is simply a list of pragma argument associations separated by commas.

@ Thus to ensure that a program conforms to the Ravenscar profile we write

  1        pragma Profile (Ravenscar);

@ The general idea is that a profile is equivalent to a set of configuration pragmas.

@ In the case of Ravenscar the pragma is equivalent to the joint effect of the following pragmas

  1        pragma Task_Dispatching_Policy (FIFO_Within_Priorities);
  2        pragma Locking_Policy (Ceiling_Locking);
  3        pragma Detect_Blocking;
  4        pragma Restrictions (
  5                No_Abort_Statements,
  6                No_Dynamic_Attachment,
  7                No_Dynamic_Priorities,
  8                No_Implicit_Heap_Allocations,
  9                No_Local_Protected_Objects,
 10                No_Local_Timing_Events,
 11                No_Protected_Type_Allocators,
 12                No_Relative_Delay,
 13                No_Requeue_Statements,
 14                No_Select_Statements,
 15                No_Specific_Termination_Handlers,
 16                No_Task_Allocators,
 17                No_Task_Hierarchy,
 18                No_Task_Termination,
 19                Simple_Barriers,
 20                Max_Entry_Queue_Length => 1,
 21                Max_Protected_Entries => 1,
 22                Max_Task_Entries => 0,
 23                No_Dependence => Ada.Asynchronous_Task_Control,
 24                No_Dependence => Ada.Calendar,
 25                No_Dependence => Ada.Execution_Time.Group_Budget,
 26                No_Dependence => Ada.Execution_Time.Timers,
 27                No_Dependence => Ada.Task_Attributes);

@ The pragma Detect_Blocking plus many of the Restrictions identifiers are new to Ada 2005. These will now be described.

@ The pragma Detect_Blocking, as its name implies, ensures that the implementation will detect a potentially blocking operation in a protected operation and raise Program_Error. Without this pragma the implementation is not required to detect blocking and so tasks might be locked out for an unbounded time and the program might even deadlock.

@ The identifier No_Dynamic_Attachment means that there are no calls of the operations in the package Ada.Interrupts.

@ The identifier No_Dynamic_Priorities means that there is no dependence on the package Ada.Priorities as well as no uses of the attribute Priority (this is a new attribute for protected objects as explained at the end of this section).

@ Note that the rules are that you cannot read as well as not write the priorities – this applies to both the procedure for reading task priorities and reading the attribute for protected objects.

@ The identifier No_Local_Protected_Objects means that protected objects can only be declared at library level and the identifier No_Protected_Type_Allocators means that there are no allocators for protected objects or objects containing components of protected types.

@ The identifier No_Local_Timing_Events means that objects of the type Timing_Event in the package Ada.Real_Time.Timing_Events can only be declared at library level. This package is described in Section 6 below.

@ The identifiers No_Relative_Delay, No_Requeue_Statements, and No_Select_Statements mean that there are no relative delay, requeue or select statements respectively.

@ The identifier No_Specific_Termination_Handlers means that there are no calls of the procedure Set_Specific_Handler or the function Specific_Handler in the package Task_Termination and the identifier No_Task_Termination means that all tasks should run for ever. Note that we are permitted to set a fallback handler so that if any task does attempt to terminate then it will be detected.

@ The identifier Simple_Barriers means that the Boolean expression in a barrier of an entry of a protected object shall be either a static expression (such as True) or a Boolean component of the protected object itself.

@ The Restrictions identifier Max_Entry_Queue_Length sets a limit on the number of calls permitted on an entry queue. It is an important property of the Ravenscar profile that only one call is permitted at a time on an entry queue of a protected object.

@ The identifier No_Dependence is not specific to the Real-Time Systems annex and is properly described in the next paper. In essence it indicates that the program does not depend upon the given language defined package. In this case it means that a program conforming to the Ravenscar profile cannot use any of the packages Asynchronous_Task_Control, Calendar, Execution_ Time.Group_Budget, Execution_Time.Timers and Task_Attributes. Some of these packages are new and are described later in this paper.

@ Note that No_Dependence cannot be used for No_Dynamic_Attachment because that would prevent use of the child package Ada.Interrupts.Names.

@ All the other restrictions identifiers used by the Ravenscar profile were already defined in Ada 95.

@ Note also that the identifier No_Asynchronous_Control has been moved to Annex J because it can now be replaced by the use of No_Dependence.

Rationale for Ada 2005: Tasking and Real-Time

@ENGRUSTOPBACKNEXT

4. Профиль Ravenscar

@ Назначение конфигурации Ravenscar состоит в том, чтобы ограничить использование многих средств управления задачами так, чтобы эффект программы был предсказуем. Конфигурация была определена Международными Семинарами Ады в реальном времени, которые встретились дважды в отдаленной деревне Ravenscar на побережье Йоркшира на Северо-востоке Англии. Общее описание принципов и использование конфигурации в высокоинтегрированных системах можно найти в ISO/IEC Technical Report [2] и поэтому мы не будем полностью раскрывать этот материал здесь.

@ Вот историческая справка. Считается, что гостиница, в которой проводились семинары, была первоначально построена для Короля Джорджа III, (чтобы сохранить хозяйку?). По другим слухам, он приказал, чтобы все естественные деревья были удалены и заменены металлическими, листья которых гремели на ветру. Также кажется, что Henry Bolingbroke останавливался в Ravenscar в июле 1399 на пути, чтобы занять трон как Генри IV. Ravenscar упоминался несколько раз Шекспиром во II акте Короля Ричарда II; он именовался Ravenspurg, что является немного запутывающим - возможно мы нуждаемся в необходимости переименовать идентификатор конфигурации.

@ Данный профиль это особый режим работы программы который определяется прагмой pragma Profile. Синтаксис такой:

  1        pragma Profile (profile_identifier [, profile_argument_associations]);

@ где profile_argument_associations - просто список аргументов прагмы, отделенных запятыми.

@ Таким образом, чтобы гарантировать, что программа соответствует конфигурации Ravenscar мы должны написать:

  1        pragma Profile (Ravenscar);

@ Основная идея состоит в том, что конфигурация эквивалентна ряду прагм конфигурации.

@ В случае Ravenscar прагма эквивалентна совместному эффекту следующих прагм:

  1        pragma Task_Dispatching_Policy (FIFO_Within_Priorities);
  2        pragma Locking_Policy (Ceiling_Locking);
  3        pragma Detect_Blocking;
  4        pragma Restrictions (
  5                No_Abort_Statements,
  6                No_Dynamic_Attachment,
  7                No_Dynamic_Priorities,
  8                No_Implicit_Heap_Allocations,
  9                No_Local_Protected_Objects,
 10                No_Local_Timing_Events,
 11                No_Protected_Type_Allocators,
 12                No_Relative_Delay,
 13                No_Requeue_Statements,
 14                No_Select_Statements,
 15                No_Specific_Termination_Handlers,
 16                No_Task_Allocators,
 17                No_Task_Hierarchy,
 18                No_Task_Termination,
 19                Simple_Barriers,
 20                Max_Entry_Queue_Length => 1,
 21                Max_Protected_Entries => 1,
 22                Max_Task_Entries => 0,
 23                No_Dependence => Ada.Asynchronous_Task_Control,
 24                No_Dependence => Ada.Calendar,
 25                No_Dependence => Ada.Execution_Time.Group_Budget,
 26                No_Dependence => Ada.Execution_Time.Timers,
 27                No_Dependence => Ada.Task_Attributes);

@ Прагма Detect_Blocking а также многие из идентификаторов Ограничений являются новыми для Ады 2005. Они будут здесь описаны.

@ Прагма Detect_Blocking подразумевает, что если реализация обнаружит потенциально блокирующую операцию в защищенной операции то будет возбуждено исключение Program_Error. Без этой прагмы реализация не обязана обнаруживать разделение на блоки и, таким образом, задачи могут быть блокированы в течение неограниченного времени, и даже основная программа может быть заблокирована.

@ Идентификатор No_Dynamic_Attachment означает, что нет никаких запросов операций в пакете Ada.Interrupts.

@ Идентификатор No_Dynamic_Priorities означает, что нет никакой зависимости от пакета Ada.Priorities так же как никакое использование атрибута Priority (это - новый атрибут для защищенных объектов как объясняется в конце этой секции).

@ Отметим, что правило состои в том, что Вы не можете ни читать ни писать приоритеты - это функция для особой процедуры чтения и записи приоритета задачи для защищенных объектов.

@ Идентификатор No_Local_Protected_Objects означает, что защищенные объекты могут быть объявлены только на библиотечном уровне и идентификатор No_Protected_Type_Allocators означает, что нет никаких программ распределения для защищенных объектов или объектов, содержащих компоненты защищенных типов.

@ Идентификатор No_Local_Timing_Events означает что объекты типа Timing_Event в пакете Ada.Real_Time.Timing_Events может быть объявлен только на библиотечном уровне. Этот пакет описан в Секции 6 ниже.

@ Идентификаторы No_Relative_Delay, No_Requeue_Statements, и No_Select_Statements означают, что нет никакой относительной задержки, постановки в очередь или операторов выбора соответственно.

@ Идентификатор No_Specific_Termination_Handlers означает, что нет никаких запросов процедуры Set_Specific_Handler или функции Specific_Handler в пакете Task_Termination и идентификатор No_Task_Termination означает, что все задачи должны работать всегда. Отметим, что нам разрешено установить обработчик системы восстановления так, чтобы, если какая-нибудь задача действительно попытается закончиться тогда, она будет обнаружено.

@ Идентификатор Simple_Barriers означает, что Булево выражение в барьере входа защищенного объекта должно быть любой статическим выражением (таким как Истина) или Булев компонент защищенного объекта непосредственно.

@ Идентификатор Ограничений Max_Entry_Queue_Length устанавливает предел для числа запросов, разрешенных для очереди входа. Это - важная особенность конфигурации Ravenscar в которой только один запрос разрешен за один раз в очереди входа защищенного объекта.

@ Идентификатор No_Dependence не является определенным для Систем реального времени, и должным образом описан в следующей статье. В основном он указывает, что программа не зависит от определенного пакета данного языка. В этом случае это означает, что программа, соответствующая конфигурации Ravenscar, не может использовать ни один из пакетов Asynchronous_Task_Control, Calendar, Execution_Time.Group_Budget, Execution_Time.Timers и Task_Attributes. Некоторые из этих пакетов являются новыми и описываются ниже в этой статье.

@ Отметим, что No_Dependence не может использоваться для No_Dynamic_Attachment, потому что это предотвратило бы использование дочернего пакета Ada.Interrupts.Names.

@ Все другие идентификаторы ограничений, используемые конфигурацией Ravenscar, были уже определены в Аде 95.

@ Отметим также, что идентификатор No_Asynchronous_Control был перемещен в Приложение J, потому что он может теперь быть заменен на No_Dependence.

@ ENG RUS

TOP BACK NEXT

2010-10-24 00:26:55

. .