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;
Примечание к примеру. Спецификатор представления записи определяет размещение полей записи. Спецификатор длины гарантйрўет, что при этом будет использовано точно восемь квантов памяти.
Спецификаторы адреса
Спецификатор адреса задает для понятия адрес в памяти. спецификатор_адреса : : = for простое_имя use at простое_выражение; Выражение после зарезервированного слова at должно быть типа ADDRESS, определенного в пакете SYSTEM (см. разд. 13.7). Этот пакет должен быть упомянут в спецификаторе совместности компилируемого модуля, в котором помещается спецификатор адреса. Условия, определяющие интерпретацию значения типа ADDRESS как адреса, уровня прерывания или чего-либо другого, зависят от реализации. Ниже перечислены допустимые толкования простого имени и смысл соответствующего адреса:
Имя объекта: требуемый адрес — адрес объекта (переменной или константы).
Имя подпрограммы, пакета или заданного модуля: требуемый адрес — адрес машинного кода, связанного с телом программного модуля.
Имя одиночного входа: адрес задает аппаратное прерывание, связанное с этим входом.
Если простое имя — это имя одиночной задачи, то спецификатор адреса относится к заданному модулю, а не к заданному объекту. Во всех случаях спецификатор адреса является правильным только тогда, когда точно одно описание с этим идентификатором помещено перед ним непосредственно в том же разделе описаний, спецификации пакета или спецификации задачи. В качестве простого имени не допустимо имя, введенное описанием переименования.
Спецификаторы адреса не могут быть использованы для задания перекрытия объектов или перекрытия программных модулей. Данное прерывание может быть связано не более чем с одним входом. Любая программа, использующая такой эффект спецификатора адреса, ошибочна.
Пример:
for УПРАВЛЕНИЕ use at 16 # 0020 #;
- - предполагается, что SYSTEM. ADDRESS - это некоторый целый тип
Примечание. Из приведенных правил следует, что если в данной точке программы видимы две совмещенные подпрограммы, то спецификатор адреса для каждой из этих подпрограмм является неправильным в данной точке. Аналогично, если в спецификации задачи описаны совмещенные друг с другом входы, то они не могут быть входами обработки прерываний. Для библиотечного модуля синтаксис не допускает спецификатора адреса. Реализацией могут быть определены прагмы для обеспечения оверлейных перекрытий программ.
Прерывания
Спецификатор адреса для входа сопоставляет вход с некоторым устройством, которое может вызвать прерывание; такой вход в этом разделе называется входом по прерыванию. Если прерывание сопровождается управляющей информацией, то она передается соответствующему входу по прерыванию как один или несколько параметров входа вида in; допустимы параметры только такого вида.
Прерывание действует как вызов входа некоторой связанной с оборудованием задачи, приоритет которой выше приоритета главной программы и любых определенных пользователем задач (т. е. любой задачи, тип которой описан с помощью заданного модуля в программе). Вызов входа может быть обычным, временным или условным вызовом входа в зависимости от вида прерывания и от реализации.
Если оператор отбора содержит как альтернативу завершения, так и альтернативу принятия входа по прерыванию, то реализация может наложить некоторые дополнительные требования на отбор альтернативы завершения в дополнение к требованиям, сформулированным в разд. 9.4.
Пример:
task ОБРАБОТКА_ПРЕРЫВАНИЯ is
entry ГОТОВЫЙ;
for ГОТОВЫЙ use at 16 # 40 #;
- - предполагается, что SYSTEM.ADDRESS - это некоторый целый тип
end ОБРАБОТКА_ПРЕРЫВАНИЯ;
Примечание. Вызовы входа по прерыванию имеют только описанную выше семантику; они могут быть реализованы с помощью аппаратуры, непосредственно выполняющей соответствующие операторы принятия.
Выстраиваемые в очередь прерывания соответствуют обычным вызовам входа. Прерывания, которые теряются, если немедленно не обрабатываются, соответствуют условным вызовам входов. Из правил приоритетов следует, что оператор принятия, выполняемый в ответ на прерывание, имеет более высокий приоритет, чем определенные пользователями обычные задачи, и может быть выполнен без задачи, выполняющей планировку.
Один из возможных результатов указания спецификатора адреса для входа по прерыванию является спецификация (непосредственно или косвенно) приоритета прерывания. Допустимы прямые вызовы входов по прерыванию.
Изменение представления
Для данного типа и для данного аспекта его представления допустимо не более одного спецификатора представления. Поэтому, если желательно другое представление, то необходимо описать второй тип, производный от первого, и для него специфицировать другое представление.
Пример:
- УПАКОВАННЫЙДЕСКРИПТОР и ДЕСКРИПТОР - это два различных
- типа с одинаковыми характеристиками, но различным представлением.
type ДЕСКРИПТОР is
record
- компоненты дескриптора end record;
type УПАКОВАННЫЙ-ДЕСКРИПТОР is new ДЕСКРИПТОР;
for УПАКОВАННЫЙ_ДЕСКРИПТОР use record
- спецификаторы компонентов для всех или некоторых компонентов end record;
Изменение представления может быть теперь достигнуто присваиванием с явным преобразованием типа:
Д: ДЕСКРИПТОР;
: УПАКОВАННЫЙ_ДЕСКРИПТОР;
: = УПАКОВАННЫЙ-ДЕСКРИПТОР (Д) ; - - упаковка Д
Д: = ДЕСКРИПТОР (У); - - распаковка У
Системный пакет
Для каждой реализации имеется предопределенный библиотечный пакет 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, А т р и б у т ы представления