record [спецификатор—выравнивания]

{ спецификатор—компонента}

end record;

спецификатор—выравнивания : : =

at mod статическое_простое_выражение;

спецификатор_компонента : : =

юля_компонента at статическое_простое_выражение range статический_тт,ятазоя-,

Простое выражение, заданное в спецификаторе выравнивания после за­резервированных слов at mod или в спецификаторе компонента после заре­зервированного слова at, должно быть статическим некоторого целого типа. Если в спецификаторе компонента границы диапазона спецификатора ком­понента определяются простыми выражениями, то каждая граница должна быть определена как статическое выражение любого целого типа; необяза­тельно, чтобы обе границы были одного и того же целого типа.

Спецификатор выравнивания требует, чтобы каждая запись данного ти­па была размещена, начиная с адреса памяти, кратного значению данного выражения (т. е. адрес по модулю выражения должен быть равен нулю). Реализация может наложить ограничения на допускаемые выравнивания.

Спецификатор компонента специфицирует для компонента место в па­мяти относительно начала записи. Значение целого типа, определенное ста­тическим выражением в спецификаторе компонента, — это относительный адрес, выраженный в квантах памяти. Диапазон определяет позиции разря­дов места памяти относительно этого кванта памяти. Первый квант памяти для записи имеет нулевой номер. Первый разряд кванта памяти тоже имеет нулевой номер. Порядок разрядов в кванте памяти машинно-зависим, а их нумерация может переходить на соседние кванты. (Для конкретной маши­ны размер кванта памяти в разрядах задан с помощью зависящего от кон­фигурации именованного числа SYSTEM.STORAGE_ UNIT.) Допускается размещение одного компонента записи в соседних квантах памяти, это раз­мещение определяется реализацией.

Для каждого компонента именуемого типа, включая каждый дискри­минант, допустимо не более одного спецификатора компонента. Специфи­каторы компонентов могут быть даны для нескольких, всех или ни для од­ного из компонентов. Если для компонента не задан спецификатор компо­нента, то выбор места в памяти для компонента определяется компилято­ром. Если спецификаторы компонентов даны для всех компонентов, то спе­цификатор представления записи полностью задает представление именуе­мого типа, и компилятор должен в точности следовать спецификатору.

Места в памяти для компонентов в пределах одного варианта не долж­ны перекрываться, но допускается перекрытие для различных вариантов. Каждый спецификатор компонента должен допускать достаточный размер памяти для размещения каждого допустимого значения компонента. Специ­фикатор компонента допустим только для такого компонента, для которо­го Любое ограничение, наложенное на него или на его подкомпоненты, яв­ляется статическим.

Реализация может генерировать имена, обозначающие зависящие от реа­лизации компоненты (например, компонент, содержащий смещение друго­го компонента). Такие'имена могут быть использованы в спецификаторах

представления записей (эти имена могут не быть простыми именами, на­пример, они могут быть зависящими от реализации атрибутами).

Пример:

СЛОВО: constant: = 4; - - квант памяти - это байт; в слове 4 байта type СОСТОЯНИЕ is (А, М, W, Р);

type ВИД is (ФИКС, ДЕСЯТ, ПОКАЗ, ЗНАК);

type МАСКА_БАЙТА is array (0. .7) of BOOLEAN;

type МАСКА_СОСТОЯНИЯ is array (СОСТОЯНИЕ) of BOOLEAN;

type МАСКА_ВИДА is array (ВИД) of BOOLEAN;

type СЛОВО.СОСТОЯНИЯ-ПРОГРАММЫ is

r

: МАСКА-БАЙТА;

: INTEGER range о. .3;

: МАСКА-СОСТОЯНИЯ;

. КОД_ПРЕРЫВАНИЯ;

: INTEGER range 0. .3

: INTEGER range 0. .3

: МАСКА-ВИДА;

: ADDRESS;

ecord

МАСКА_СИСТЕМЫ КЛЮЧ_ЗАЩИТЫ СОСТОЯНИЕ_МАШИНЫ ПРИЧИНА_ПРЕРЫВАНИЯ ПРИЗНАК-1 ПРИЗНАК_2 МАСКА-ПРОГРАММЫ ТЕК_АДРЕС

end record;

for СЛОВО-СОСТОЯНИЯ-ПРОГРАММЫ use

record at mod 8;

МАСКА-СИСТЕМЫ at 0 * СЛОВО range 0. .7; - - 8 и 9 разряды не используются

КЛЮЧЗАЩИТЙ at 0 * СЛОВО range 10. .11;

СОСТОЯНИЕ-МАШИНЫ at 0 * СЛОВО range 12. .15;

ПРИЧИНА.ПРЕРЫВАНИЯ at 0 * СЛОВО range 16. .31; - - второе слово

ПРИЗНАК-1 at 1 * СЛОВО range 0. .1;

ПРИЗНАК_2 at 1 * СЛОВО range 2. .3;

МАСКА-ПРОГРАММЫ at 1 * СЛОВО range 4. .7;

ТЕК АДРЕС at 1 * СЛОВО range 8. .31;

end record;

for СЛОВО-СОСТОЯНИЯ-ПРОГРАММЫ'512Е use

8 * SYSTEM.STORAGE-UNIT;

Примечание к примеру. Спецификатор представления записи определяет размеще­ние полей записи. Спецификатор длины гарантйрўет, что при этом будет использовано точно восемь квантов памяти.

  1. Спецификаторы адреса

Спецификатор адреса задает для понятия адрес в памяти. спецификатор_адреса : : = for простое_имя use at простое_выражение; Выражение после зарезервированного слова at должно быть типа ADDRESS, определенного в пакете SYSTEM (см. разд. 13.7). Этот пакет должен быть упомянут в спецификаторе совместности компилируемого модуля, в котором помещается спецификатор адреса. Условия, определяю­щие интерпретацию значения типа ADDRESS как адреса, уровня прерыва­ния или чего-либо другого, зависят от реализации. Ниже перечислены допус­тимые толкования простого имени и смысл соответствующего адреса:

  1. Имя объекта: требуемый адрес — адрес объекта (переменной или константы).

  2. Имя подпрограммы, пакета или заданного модуля: требуемый ад­рес — адрес машинного кода, связанного с телом программного модуля.

  3. Имя одиночного входа: адрес задает аппаратное прерывание, связан­ное с этим входом.

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

Спецификаторы адреса не могут быть использованы для задания пере­крытия объектов или перекрытия программных модулей. Данное преры­вание может быть связано не более чем с одним входом. Любая программа, использующая такой эффект спецификатора адреса, ошибочна.

Пример:

for УПРАВЛЕНИЕ use at 16 # 0020 #;

- - предполагается, что SYSTEM. ADDRESS - это некоторый целый тип

Примечание. Из приведенных правил следует, что если в данной точке программы видимы две совмещенные подпрограммы, то спецификатор адреса для каждой из этих подпрограмм является неправильным в данной точке. Аналогично, если в специфика­ции задачи описаны совмещенные друг с другом входы, то они не могут быть входами обработки прерываний. Для библиотечного модуля синтаксис не допускает специфи­катора адреса. Реализацией могут быть определены прагмы для обеспечения оверлей­ных перекрытий программ.

  1. Прерывания

Спецификатор адреса для входа сопоставляет вход с некоторым уст­ройством, которое может вызвать прерывание; такой вход в этом разделе называется входом по прерыванию. Если прерывание сопровождается уп­равляющей информацией, то она передается соответствующему входу по прерыванию как один или несколько параметров входа вида in; допустимы параметры только такого вида.

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

Если оператор отбора содержит как альтернативу завершения, так и альтернативу принятия входа по прерыванию, то реализация может нало­жить некоторые дополнительные требования на отбор альтернативы завер­шения в дополнение к требованиям, сформулированным в разд. 9.4.

Пример:

task ОБРАБОТКА_ПРЕРЫВАНИЯ is

entry ГОТОВЫЙ;

for ГОТОВЫЙ use at 16 # 40 #;

- - предполагается, что SYSTEM.ADDRESS - это некоторый целый тип

end ОБРАБОТКА_ПРЕРЫВАНИЯ;


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

Выстраиваемые в очередь прерывания соответствуют обычным вызовам входа. Прерывания, которые теряются, если немедленно не обрабатываются, соответствуют условным вызовам входов. Из правил приоритетов следует, что оператор принятия, выполняемый в ответ на прерывание, имеет более высокий приоритет, чем определен­ные пользователями обычные задачи, и может быть выполнен без задачи, выполняю­щей планировку.

Один из возможных результатов указания спецификатора адреса для входа по прерыванию является спецификация (непосредственно или косвенно) приоритета пре­рывания. Допустимы прямые вызовы входов по прерыванию.

  1. Изменение представления

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

Пример:

  • - УПАКОВАННЫЙДЕСКРИПТОР и ДЕСКРИПТОР - это два различных

  • - типа с одинаковыми характеристиками, но различным представлением.

type ДЕСКРИПТОР is

record

  • - компоненты дескриптора end record;

type УПАКОВАННЫЙ-ДЕСКРИПТОР is new ДЕСКРИПТОР;

for УПАКОВАННЫЙ_ДЕСКРИПТОР use record

  • - спецификаторы компонентов для всех или некоторых компонентов end record;

Изменение представления может быть теперь достигнуто присваивани­ем с явным преобразованием типа:

Д: ДЕСКРИПТОР;

  • : УПАКОВАННЫЙ_ДЕСКРИПТОР;

  • : = УПАКОВАННЫЙ-ДЕСКРИПТОР (Д) ; - - упаковка Д

Д: = ДЕСКРИПТОР (У); - - распаковка У

  1. Системный пакет

Для каждой реализации имеется предопределенный библиотечный пакет SYSTEM, который включает определения некоторых характеристик, зави­сящих от конфигурации. Спецификация пакета зависит от реализации и должна быть приведена в руководстве по реализации в соответствии с обя­зательным приложением 4. Видимый раздел этого пакета должен содержать по крайней мере следующие описания:

package SYSTEM is

type ADDRESS is определен-реализацией;

type NAME is определен-реализацией-Перечислимого _типа;

SYSTEM_NAME: constant NAME: = определен-реализацией; STORAGE_UNIT: constant: = определен-реализацией;

MEMORY SIZE: constant: = определен-реализацией;

-

MININT MAX_INT MAX_DIGITS

- зависящие от системы именованные числа: : constant: = определен—реализацией;

: constant: = определен—реализацией; : constant: = определен-реализацией;

MAX_MANTISSA : constant: = определен -реализацией;

FINE_DELTA : constant: = определен-реализацией;

TICK : constant: = определен-реализацией;

- ■ другие зависящие от системы описания:

subtype PRIORITY is INTEGER range определен-реализацией;

end SYSTEM;

Тип ADDRESS - это тип адресов, задаваемых спецификаторами адре­са; к этому же типу принадлежат значения, вырабатываемые атрибутом ADDRESS. Значения перечислимого типа NAME — это имена альтернативных машинных конфигураций, обрабатываемых реализацией; одно из них — константа SYSTEM_NAME. Именованное число STORAGE—UNIT равно чис­лу разрядов в кванте памяти, а именованное число MEMORY_SIZE — числу квантов памяти, доступных в конфигурации; эти именованные числа имеют универсальный_целый тип.

Альтернативная форма пакета SYSTEM с другими значениями SYSTEM-NAME, STORAGE-UNIT и MEMORY-SIZE может быть получена использованием соответствующих прагм. Эти прагмы допустимы только в начале компиляции до первого компилируемого модуля (если он есть) компиляции.

pragma SYSTEM- NAME (литерал_перечисления);

В результате выполнения этой прагмы заданный идентификатором ли­терал перечисления будет использован для определения константы SYSTEM—NAME. Эта прагма допустима, только если этот идентификатор соответствует одному из литералов типа NAME.

pragma STORAGE-UNIT (числовой—литерал);

В результате выполнения этой прагмы заданное числовым литералом значение будет использовано для определения именованного числа STORAGE-UNIT.

pragma MEMORY-SIZE (числовой—литерал);

В результате выполнения этой прагмы заданное числовым литералом значение будет использовано для определения именованного числа MEMORY-SIZE.

Компиляция любой из этих прагм вызовет неявную перекомпиляцию пакета SYSTEM. Следовательно, любой компилируемый модуль, в специфи­каторе контекста которого упоминается пакет SYSTEM, становится уста­ревшим. Реализация может ввести дополнительные ограничения на исполь­зование этих прагм. Например, реализация может допустить их только в на­чале первой компиляции, когда создается новая программная библиотека.

Примечание. Согласно правилам видимости описание из пакета SYSTEM видимо в компилируемом модуле только в том случае, если этот пакет упомянут в специфи­каторе совместности, примененном (непосредственно или косвенно) к данному ком­пилируемому модулю.

13.7.1. Зависящие от системы именованные числа

Перечисленные ниже именованные числа описаны в пакете SYSTEM. Числа FINE-DELTA и TICK принадлежат универсальному-вещественному типу, остальные — универсальному _целому типу.

MIN_INT Наименьшее (наибольшее по модулю отрицательное) значе­ние из всех определенных целых типов.

MAX_INT Наибольшее (положительное) значение из всех предопреде­ленных целых типов.

MAX-DIGITS Наибольшее допустимое значение числа значащих деся­тичных цифр в ограничении для плавающего типа.

MAX-MANTISSA Наибольшее возможное число двоичных цифр в ман­тиссе модельных чисел фиксированного подтипа.

FINE_DELTA Наименьшая дельта, допустимая в ограничении для фик­сированного типа, который имеет ограничение диапазона — 1.0. .1.0.

TICK Базовый период времени, выраженный в секундах.

13.7.2, А т р и б у т ы представления