Автоматизация

Вид материалаДокументы

Содержание


Посимвольная работа с терминалом
Организация файлов на магнитных дисках
Вывод на печать
Работа с перфолентой
Комплексный пример
Контрольные вопросы к главе 7
Подобный материал:
1   ...   13   14   15   16   17   18   19   20   ...   25
§ 7.2. ОБЩИЕ ХАРАКТЕРИСТИКИ СИСТЕМНЫХ МАКРОКОМАНД


Монитор операционной системы РАФОС содержит широкий набор системных программ, обеспечивающих передачу данных, синхронизацию задач и т. д. Обращение к этим программам монитора осуществляется с помощью макровызовов системных макрокоманд, или программных запросов.

Макроопределения системных макрокоманд сгруппированы в макробиблиотеку. Состав этой библиотеки в случае необходи­мости может быть расширен макроопределениями, написанными пользователем.

Указание в тексте программы пользователя имени системной макрокоманды приводит к генерации (на стадии трансляции) макрорасширения, вид которого определяется функциями вызы­ваемого системного средства и отчасти формой написания макро­вызова. Однако во всех случаях последней строкой макрорасшире­ния является специальная команда ЕМТ, которая носит название эмуляции или программного прерывания. По команде ЕМТ проис­ходит прерывание выполняемой программы через вектор преры­вания с адресом 30, откуда берется адрес специальной программы-диспетчера, входящей в состав RMON и обрабатывающей это прерывание. Функции диспетчера заключаются в том, чтобы инициировать, именно ту системную программу, которая отождеств­ляется с именем макровызова и выполняет затребованные пользо­вателем действия. Каждая из этих программ имеет определенный номер (код), который так или иначе должен быть получен диспет­чером из текста макрорасширения. Существует несколько способов передачи кода вызываемой программы, отличающихся быстродей­ствием и возможностями.

Рассмотрим, например, реакцию ОС на макровызов .EXIT, которым обычно заканчивается программа пользователя. Этот макровызов расширяется в единственную программную строку ЕМТ 350, в которой число 350 (аргумент команды ЕМТ) представ­ляет собой код вызываемой программы. Таким образом, код про­граммы передается здесь через аргумент команды ЕМТ. Заметим, что сам макровызов .EXIT не предполагает передачи вызываемой программе каких-либо аргументов.

Рассмотрим теперь макрокоманду .PRINT, с помощью которой на экран терминала выводится произвольный текст. Адрес текста указывается в качестве аргумента макровызова:

TEXT: .ASCIZ /ATTENTION!/

.EVEN

.PRINT #ТЕХТ

MOV #ТЕХТ, RO ;макрорасширение

EMT 351;

Здесь так же как и в предыдущем примере, код вызываемой программы (351) передается через аргумент команды ЕМТ. Аргумент же макровызова, в данном случае — адрес строки с выводимым, текстом, загружается в R0. Системная программа, выполняющая вывод строки текста на экран терминала, написана так, что в ней предполагается наличие в R0 адреса выводимой строки. В описанном выше типе макрокоманд используются коды от 1, до 357 .

Другой способ передачи кода программы используется в макрокомандах, имеющих в качестве аргумента команды ЕМТ число 374. расширениях макрокоманд этого типа код программы засылается арший байт регистра R0, откуда затем он забирается программой обработки системного прерывания. В младшем байте R0 может находиться числовой аргумент.

Рассмотрим макрорасширение макровызова .SPND, позволяющего приостановить выполнение программы пользователя, например, до завершения операции передачи данных:

.SPND

MOV #1*400,R0 ; макрорасширение

ЕМТ 374 Код соответствующей программы равен 1. Умножение кода на 4008 помещает его в старший байт адресуемого слова, в данном случае в старший байт R0. Младший байт остается незаполненным. Программа обработки системного прерывания, проанализировав аргумент команды ЕМТ, определяет по значению аргумента (374), что код вызываемой программы находится в старшем байте R0. Примером макрокоманды описанного типа с числовым, аргументом является макрокоманда .CLOSE, закрывающая канал связи с внешним устройством:


.CLOSE #2

MOV #2+<6*400>, R0 ; макрорасширение

ЕМТ 374 ,

Выражение, используемое в качестве аргумента команды MOV, построено так, что в старший байт R0 засылается код вызываемой программы (6), а в младший байт Я0 — аргумент макровызова ,(2), представляющий собой номер закрываемого канала.

Наконец, при большом числе аргументов макровызова используется третий тип макрокоманды, требующий для передачи аргументов специальной области в поле данных программы пользователя. Этот тип макрокоманд идентифицируется аргументом 375 команды ЕМТ. Такова, например, макрокоманда .LOOKUP, позво­ляющая открыть канал связи с определенным внешним устрой­ством:


DEV: .RAD50 /LP/ ; имя устройства

ARG: .BLKW 2 ; область для аргу-

.LOOKUP #ARG, #6, #DEV ; ментов

MOV #ARG, R0 ; 4 строки

MOV #6+,(RO) ; макро-

; расширения

MOV DEV, 2(R0)

ЕМТ 375


Первой командой макрорасширения адрес ARG области для аргументов загружается в RO. Следующей командой первые два байта ARG заполняются номером канала 6 (младший байт) и ко­дом макрокоманды 1 (старший байт). Последняя команда MOV заносит адрес слова с именем устройства во второе слово области ARG. В результате выделенная пользователем область для аргу­ментов оказывается заполненной значениями аргументов, взятыми из операндов макровызова . (рис. 7.5). После этого командой ЕМТ 375 вызывается программа открытия канала, которая получает аргументы из области ARG с помощью RO, в котором находится адрес этой области.

Как видно из последнего примера, при большом числе аргумен­тов макрокоманды ее расширение может содержать значительное количество строк. Эти строки требуют места в оперативной памяти и времени на их выполнение. Если данный макровызов встречается в программе один раз, с этим приходится мириться. Если, однако, по ходу программы один и тот же макровызов используется много­кратно (например, в программе, насыщенной операциями передачи данных, каналы связи с устройствами многократно закрываются и повторно открываются), повторные макровызовы будут нера­ционально расходовать память и время процессора. Для повышения эффективности обращения к макрокомандам в РАФОС предусмот­рено специальное средство — ключевой аргумент BLOCK, позво­ляющий использовать один и тот же блок аргументов для повтор­ных макровызовов. Предыдущий пример с использованием аргумен­та BLOCK выглядит следующим образом;


ARG: .LOOKUP BLOCK, 6, LP ; в поле данных

.BYTE 6,1 ; макрорасширение

.R.AD50 /LP/

.

.

.

.DIR #ARG ; программная строка

макровызова

.

.

.

.DIR ARG ; повторный макровы-



Рис. 7.5. Область аргументов макровызова для конкретного примера.


Макровызов с аргументом BLOCK включен в поле данных программы. На этапе трансляции (а не выполнения программы, ik это было ранее) он расширяется в блок аргументов, которые можно использовать многократно. Для того чтобы выполнить требуемые действия (в рассматриваемом примере открыть канал), надо воспользоваться специальным макровызовом ,DIR с указа­нием адреса созданного блока аргументов. Макровызов .DIR расширяется всего в две программных строки:


MOV #ARG, RO

ЕМТ 375

При многократном использовании макровызова .DIR будут повторяться только эти строки.

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

Если при выполнении любого программного запроса обнаружи­вается ошибка, система устанавливает разряд С в ССП. Кроме того, код-Ошибки (обычно числа О, 1 или 2) заносится в специально выделенный для этого байт с абсолютным адресом 52. Диагностика выполнения программных запросов заключается, таким образом, в проверке состояния разряда С ССП и анализе байта 52, если разряд С установлен.

Например, для программного запроса .ENTER, резервирующего на магнитном диске место для файла и открывающего канал связи с ним, предусмотрено два кода ошибки:

0 - канал занят;

1 -на устройстве нет места для файла.

Программа с анализом правильности выполнения программного запроса .ENTER может схематично иметь следующий вид:


.ENTER #ARG, #6, #DEV

BCS ERR ; переход в случае ошибки

.

.

;продолжение про­граммы

ERR: TSTB @#52 ; код ошибки 0?

BEQ CHBSY ; да, переход на модификацию номера канала

BNE DEVBSY ; нет, переход на аварийный останов

.

.

.

CHBSY: строки модификации номера канала

.

.

.

DEVBSY: ; строки вывода аварийного сообщения

.EXIT


После макровызова .ENTER анализируется разряд С ССП. Если разряд С сброшен, программа продолжает выполняться. Если разряд С установлен, происходит переход на метку ERR и анали­зируется содержимое байта ошибки. При коде ошибки 0 (канал занят) осуществляется переход на программу, модифицирующую номер канала, и повторяется макровызов .ENTER. Если же код ошибки 1 (на устройстве нет места), выдается аварийное сообще­ние и вся программа завершается.


§ 7.3. СИСТЕМНЫЕ СРЕДСТВА ОБСЛУЖИВАНИЯ ВВОДА-ВЫВОДА


ОС РАФОС имеет обширную группу макрокоманд, обеспечи­вающих связь программы пользователя с внешними устройствами. Сюда относится уже упоминавшаяся макрокоманда .PRINT, орга­низующая вывод на экран терминала строк текста, макрокоманды .TTYOUT и .TTOUTR для посимвольного вывода на экран терми­нала, макрокоманды .TTYIN и .TTINR для посимвольного ввода знаков с клавиатуры терминала, а также 6 макрокоманд связи с любыми ВУ (НМД и НМЛ, перфоленточными устройствами и т. д.). Сюда относятся макрокоманды ввода .READ, .READW и .READC и макрокоманды вывода .WRITE, .WRITW и .WRITC.

В организации ввода — вывода большое значение имеет система очередей, организуемая монитором РАФОС. Основной очереди является элемент очереди -ввода — вывода — участок оперативной памяти длиной 7 слов, в котором в определенном порядке хранится вся необходимая для выполнения операции ввода — вывода инфор­мация: указатель на канал ввода — вывода, номер устройства ввода — вывода и код функции ввода — вывода, адрес буфера в программе пользователя, счетчик переданных слов, тип ввода — вывода и пр. Начальное слово элемента содержит адрес следующе­го элемента в очереди. Если данный элемент является последним или единственным, его начальное слово содержит нулевое значение.



Рис. 7.6. Связный список входных Рис. 7.7. Образование очереди к драйверу

элементов ввода-вывода


Элемент очереди служит передаточным звеном между програм­мой пользователя и драйвером ВУ. При выполнении программного запроса на ввод — вывод (например, макрокоманды .READ с аргументами) монитор, получив управление посредством системного прерывания (команда ЕМТ, входящая в состав макрорасширения), заполняет первый свободный элемент очереди данными, взятыми из аргументов макрокоманды ввода — вывода и передает адрес этого элемента соответствующему драйверу, ставя элемент в очедь запросов ввода — вывода к данному ВУ.

Как только в очереди ввода — вывода появляется элемент ,очередь, монитор запускает драйвер ВУ, который непосредственно осуществляет передачу данных. Элемент ввода — вывода освобождается только после того, как драйвер полностью завершит свою работу.

Поскольку каждый программный запрос на ввод — вывод требует своего элемента очереди, количество доступных элементов очереди определяет количество параллельно выполняемых программных запросов на ввод — вывод. В FB-мониторе РАФОС каждая задача имеет по одному элементу очереди, расположенному в ее смешанной области. Количество, доступных элементов можно увеличить программным запросом .QSET, в поле аргументов кото-рой указывается адрес поля памяти в программе пользователя, отведённого под элементы очереди (по 7 слов на каждый элемент). Пусть с помощью программного запроса .QSET образовано три элемента, так что с учетом одного, предоставляемого системой, их стало 4 (рис. 7.6). В заголовке списка — слове QHDR, хранящемся в смешанной области задачи, находится адрес первого свободного элемента Q1. Начальное слово этого элемента содержит адрес следующего элемента Q2. Начальное слово элемента Q2, в свою очередь , содержит адрес следующего элемента и т. д. В начальном слове последнего элемента содержится нулевое значение, что говорит о том, что этот элемент — последний. Таким обра­зом, хотя элементы очереди не связаны друг с другом физически и находятся в разных местах памяти, логически они связаны друг с другом в однонаправленный список, в котором с помощью любого очередного элемента можно легко найти следующий.

Рассмотрим взаимодействие монитора со списком элементов ввода — вывода (рис. 7.7). Выполняя программный запрос на ввод — вывод, монитор заполняет первый свободный элемент ввода — вывода необходимой для драйвера информацией и пере­дает его адрес драйверу, записывая этот адрес в специальной ячейке LQE в заголовке драйвера. В другую ячейку CQE монито­ром записывается адрес последнего элемента очереди к данному драйверу. Если очередь к драйверу состоит только из одного элемента ввода — вывода, то содержимое ячеек LQE и CQE сов­падает, а в начальном слове элемента ввода — вывода записан О, так как он последний. Если же, как это показано на рис. 7.7, в очереди к драйверу стоят два элемента ввода — вывода (которые драйвер будет обрабатывать последовательно, в порядке их поступ­ления в очередь), то в ячейке CQE записан адрес второго элемента, Q2, начальное слово элемента Q1 содержит ссылку на второй элемент Q2, а в начальном слове Q2 записан нуль — идентифи­катор последнего элемента. Поскольку элементы Q1 и Q2 изъяты из списка свободных элементов, слово QHDR указывает на элемент Q3, который является теперь первым свободным элементом списка свободных элементов. .

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

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

В системе РАФОС существует три разновидности ввода — вывода: синхронный (с ожиданием), асинхронный (без ожидания) и с управлением по событию (с подпрограммой завершения).

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

Асинхронный ввод — вывод характерен тем, что программный : запрос на передачу данных не приостанавливает задачу в ожидании конца передачи, а позволяет ей выполняться дальше. В этом случае параллельно идут два процесса: выполнение задачи и передачи данных. При этом выполнение задачи будет периодически прерываться на время, необходимое для обслуживания драйвером очередного прерывания от ВУ. Такой режим используется в тех случаях, когда дальнейший ход задачи не зависит от результатов передачи данных. Если, например, в задаче сформировано некоторое сообщение, выводимое на экран терминала или АЦПУ, целесообразно, инициировав вывод информации на ВУ, продолжить выполение задачи.

Наконец, последняя разновидность, ввод — вывод с управлением по событию, представляет собой развитие асинхронного ввода — вывода. В этом случае задача, выставив запрос на передачу,данных, т. е. инициировав драйвер, продолжает выполняться дальше. Параллельно осуществляется передача данных. Как только передача данных полностью завершится, управление передается , не в задачу, а в подпрограмму завершения, которая является .частью программы пользователя. Входная метка подпрограммы завершения указывается в виде одного из аргументов в макрокоманде ввода — вывода. При передаче управления подпрограмме завершения выполнение основной программы приостанавливается до тех пор, пока не будет выполнена подпрограмма завершения, которая, таким образом, имеет повышенный приоритет по сравнению с основной программой. Последней строкой подпрограммы завершения должна быть команда RTS PC, по которой происходит передача управления монитору. Монитор, в свою очередь, передает уравление основной программе, и та продолжает свою работу.

Функции подпрограммы завершения зависят от решаемой задачи. В простейшем случае подпрограмма завершения может просто сигнализировать оператору об окончании передачи данных, выводя, например, на экран терминала сообщение «Ввод данных закончен». Чаще, однако, подпрограммы завершения используются для анализа правильности результатов завершившейся операции ввода — вывода, обработки массива введенных данных, закрытия файла и т. д. Подпрограммы завершения не являются непременной принадлежностью ввода — вывода. С их помощью можно обраба­тывать и другие асинхронные события: истечение заданногого интер­вала времени, завершение обработки прерывания и др.

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

Рассмотрим случай, когда фоновая задача выдала запрос на ввод с управлением по событию. Указание среди аргументов макрокоманды ввода .READC адреса подпрограммы завершения приводит к помещению этого адреса в соответствующее слово элемента ввода — вывода. После завершения ввода — вывода монитор анализирует это слово и, найдя в нем четное число, отличное от нуля, расценивает его как адрес подпрограммы завер­шения, преобразует элемент ввода — вывода в элемент очереди подпрограммы завершения (т. е. заполняет этот участок памяти новыми данными) и помещает его в очередь подпрограмм заверше­ния к данной задаче. После этого управление передается плани­ровщику.

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

Из перечисленных выше макрокоманд ввода — вывода синхрон­ную передачу организуют макрокоманды .READW и .WRITW, асинхронную — макрокоманды .READ и .WRITE, а передачу по событию — .READC и .WRITC. Дополнительные возможности предоставляет макрокоманда .WAIT, которая, будучи поставлена после макрокоманд .READ или .WRITE, приостанавливает задачу до полного завершения ввода — вывода. Таким образом, комбина­ция макрокоманд .READ и .WAIT равносильна макрокоманде .READW.

Рассмотрим теперь взаимодействие программных запросов на ввод — вывод с элементами, очереди ввода — вывода. Как было показано, любой запрос на ввод — вывод требует одного элемента очереди, который освобождается после полного заверше­ния передачи данных. Даже в наиболее сложном случае ввода – вывода c управлением по событию, когда сначала образуется очередь ввода — вывода, а затем — очередь программ завершения, и для той, и для другой очередей используется один и тот же элементент, который освобождается, когда заканчивает работу программа завершения. Таким образом, если в программе используется только синхронный ввод — вывод или запросы на ввод — вывод разделены во времени так, что операции передачи данных не накладываются друг на друга, а выполняются строго последовательно то для организации ввода — вывода достаточно одного элемента очереди. Этот элемент очереди предусмотрен в составе смешанной области для каждой задачи. Если, однако, операции передачи данных накладываются, следует увеличить количество элементов очереди ввода — вывода с помощью программного запроса .QSET. Пусть, например, программа, закончив обработку некоторыхданных, записывает результат обработки на магнитную ленту и требует от оператора ввода новых исходных данных для продолжения вычислений. Для повышения скорости работы программы операции вывода на ленту и ввода с клавиатуры целесообразно совместить, используя запрос на асинхронный вывод:

.WRITE

.READW


Как видно из рис. 7.8, на участке 2—3 выполняются две операции передачи данных и используются одновременно два элемента очереди ввода — вывода (по одному для каждого драйвера). Для правильного выполнения программы необходимо запросом .QSET зарезервировать дополнительно один элемент очереди.





Рис 7.8 Временная диаграмма работы программы Рис. 7.9. Структурная схема с совмещенными опе-

рациями ввода-вывода программы с циклической обработкой


Заметим, что использование синхронного ввода (макрокоманда .READW) в данном случае необходимо. Действительно, дальнейшее выполнение программы имеет смысл только после ввода исходных данных для следующего этапа вычислений.

Рассмотрим другой пример совмещения операций передачи данных. Пусть в программе организовано циклическое выполнение некоторых вычислений с записью результатов каждого шага на магнитный диск (рис. 7.9). Всего надо выполнить, например, 10 шагов. Если вычисления выполняются быстрее, чем запись на диск, запросы на вывод будут устанавливаться в очередь к драйверу НМД. При 10 шагах одновременно в очереди могут находиться до 10 элементов очереди ввода — вывода, поэтому перед выполне­нием цикла вычислений надо организовать 9 дополнительных элементов ввода — вывода.

Рассмотрим действие некоторых макрокоманд ввода — вывода.


Посимвольная работа с терминалом

Для организации посимвольной передачи надо прежде всего установить спецрежим терминала. В обычном режиме работы терминала символы, вводимые с клавиатуры, копятся в кольцевом буфере, находящемся в смешанной области задачи. Символы передаются из кольцевого буфера в программу пользователя (целой строкой) только после нажатия клавиши RETURN (BK). При этом ОС. сама организует высвечивание набранных символов на экране (так называемое эхо). В спецрежиме нажатие любой клавиши сразу передает код символа в программу, а эхо отсут­ствует. Переключение режима терминала осуществляется с по­мощью разряда 12 слова состояния программы, которое распола­гается в ячейке с абсолютным адресом 44. Если разряд 12 сброшен, имеет место обычный режим; если установлен — спецрежим.

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

В качестве аргумента макрокоманды .TTYIN может использо­ваться адрес буфера длиной в 1 байт. В этом случае код введен­ного символа заносится и в RO, и в указанный буфер.

Макрокоманда .TTYOUT выводит на экран терминала символ, код которого должен находиться к этому моменту в RO.

Задача 7.1. Приостановить выполнение программы в задан­ной точке. Разрешение на продолжение программы дается нажа­тием любой клавиши на терминале.


BIS # 10000,. @#44 ; установка спецрежима терминала

TTYIN ; ожидание нажатия клавиши

.

.

. ; продолжение программы


Задача 7.2 Вывести на экран символ "?"

BIS # 10000, @ # 44

MOV # 77, R0 ;код символа "?"

.TTYOUT


Задача 7.3 Вывести символ с клавиатуры в буфер. Высветить его на экране


BUF: BLKW 1

START: BIS # 10000, @ # 44

.TTYIN BUF

.TTYOUT


Макрокоманда .TTYIN организует синхронный ввод символа — выдав запрос на ввод, программа приостанавливается, пока ввод не будет завершен. Асинхронный ввод организуется макрокомандой

.TTINR. Для реализации этой возможности надо в слове состояния

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

ожидания терминала.

Пусть в программе встретились следующие строки:


BIS # 10100, @#44

.TTINR


Первой командой устанавливается спецрежим (разряд 12) и запрет ожидания (разряд 6). Если к моменту выдачи запроса на ввод какая-либо клавиша терминала была нажата и в кольцевом буфере ввода находился код символа, макрокоманда .TTINR передаёдает его в R0 и программа будет выполняться дальше. Если же буфер терминала пуст и макрокоманде .TTINR нечего вводить, программа сразу же начнет выполняться дальше (запрет ожидания включен), а макрокоманда сообщит о своем «неправильном» выполнении установкой разряда С слова состояния процессора. В случае необходимости пользователь может проанализировать своей программе состояние разряда С (командами ВСС или BCS) и организовать переход на те или иные метки в программе В В зависимости от результата анализа.

Задача 7.4. Ввести в буфер в программе пользователя код нажатой ранее клавиши с целью его анализа. Если же символ с клавиатуры ещё не введён, высветить на экране терминала сообщение "?" и ожидать ввод символа.


BIS # 10100,@ # 44 ;Установка спецрежима и запрет ожидания

.TTINR

BCS NOSYM ;символа нет

SYM: MOVB R0,BUF ;код в буфере BUF

.

. ;анализ введённого символа

.




NOSYM: MOV #77, RO ; код «?»

.TTYOUT ; вывод «?»

WAIT: .TTINR ; повторная попытка ввода

BCC SYM ; символ есть, переход на анализ

BR WAIT ; символа опять нет, повторение попытки


Организация файлов на магнитных дисках

Для записи данных на магнитный диск служит макрокоманда .WRITE с модификациями, а для чтения с диска — макрокоманда .READ с модификациями. Однако перед тем как передавать дан­ные на диск, следует выполнить две вспомогательные операции: образовать на диске файл с определенным именем, т. е. выделить место под данные, и открыть канал передачи данных, связанный с этим файлом и идентифицируемый определенным номером. Канал представляет собой блок из 5 слов, размещаемый в смешанной области задачи. В этом блоке системой записывается информация, необходимая для передачи данных: размер файла и степень его заполнения, номер внешнего устройства, ссылки для определения физического имени устройства и имени файла и т. д. В смешанной области каждой задачи предусмотрено место для 1610 каналов. Если в программе требуется одновременно использовать более 16 каналов, то их число может быть увеличено с помощью программ­ного запроса .CDFN. Место под дополнительные каналы выделя­ется в этом случае в программе пользователя (ср.. использование - программного запроса .QSET). Одновременно может существовать не более 255 каналов. Пока канал открыт, его можно использо­вать для связи с данным файлом — для записи, чтения или моди­фикации данных. Обе операции — образование файла и открытие канала — выполняются с помощью одного программного запроса .ENTER.

Пусть в программе содержится макровызов

.ENTER #ARG, #0, #FILNAM,#4

Первый аргумент макровызова ARG представляет собой адрес области для аргументов, отведенной в программе пользователя. Следующий аргумент — номер канала. Он может быть любым числом от 0 до 255. Аргумент FILNAM является адресом области в программе пользователя, в которой содержится (в коде RADIX-50) полная спецификация файла, состоящая из имени ВУ, имени файла и расширения имени файла. Наконец, аргумент 4 указывает количество блоков по 256 слов, которые надо зарезервировать на диске. Таким образом, для нормального выполнения указанной макрокоманды в поле данных программы пользователя должны быть отведены области с именами ARG и FILNAM, например, следующим образом:

ARG: .BLKW 3 ; область для аргументов

FILNAM: .RAD50 /DKO/ ; имя устройства

.RAD50 /EXPDAT/ ; имя файла

.RAD50 /003/ ; расширение имени файла (номер версии)


Далее можно написать макрокоманду записи

.WRITW #ARG1, #0, #DATBUF, #1024., #0

Здесь первый аргумент представляет собой адрес области для аргументов; второй — номер канала, через который передается информация об именах устройства и файла; третий — адрес буфера с данными; четвертый — количество передаваемых слов и, наконец, пятый — относительный номер блока в файле, с которого надо начать запись.

В поле данных должны быть размещены области с именами ARG1 и DATBUF:

ARG1: .BLKW 4 ; область для аргументов

DATBUF: .BLKW 1024. ; буфер данных

Макрокоманда .WRITW, использованная в этом примере, обес­печивает синхронную передачу данных, т. е. приостанавливает программу до полного завершения вывода.

Задача 7.5 Образовать тестовый файл, представляющий собой 512 повто­рений кода буквы А. Вывести его на диск DK4 в область с именем TEST.

SYM: .ASCII /AA/

ARG: .BLKW 5

FILE: .BLKW 256. ; буфер данных

FILNAM: .RAD50 /DK4TEST/

START: MOV #FILE, R1

FILL: MOV SYM, (Rl) +

CMP Rl, #FILE+512.

BNE FILL

; буфер данных заполнен

.ENTER #ARG, #2, #FILNAM, #1

.WRITW #ARG, #2, #FILE, #256., #0

В этой задаче область с меткой ARG используется сначала макрокомандой .ENTER, затем макрокомандой .WRITW.

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

.LOOKUP #ARG, #З, #DEV

Открывается канал номер 3 связи с файлом, спецификация которого приведена в области памяти с меткой DEV.

Макрокоманда чтения .READW имеет те же аргументы, что и макрокоманда .WRITW.


Задача 7.6. Прочитать с диска и высветить на экране дисплея файл, об­разованный в задаче 7.5.

ARG: .BLKW 4

FILE: .BLKW 256.

END: .WORD 0

FILNAM: .RAD50 /DK4TEST/ START: .LOOKUP #ARG, #б, #FILNAM .READW #ARG, #б, FILE, #256, #0

.PRINT #FILE

В этой задаче «пустое» слово с меткой END служит иденти­фикатором конца текста для макрокоманды .PRINT. Следует за­метить, что использование этой макрокоманды, как и вообще опе­рации вывода на терминал, возможно лишь в том случае, когда файл содержит коды ASCII, как это и было предусмотрено зада­чей 7.5.


Вывод на печать

Вывод символьной информации на АЦПУ практически не от­личается от вывода на диск. В качестве спецификации файла используется логическое имя печатающего устройства LP, после которого предусматривается «пустое» слово. Поскольку АЦПУ является устройством с «нефайловой» структурой, открытие канала производится макрокомандой .LOOKUP.


Задача 7.7. Вывести на печать текст из буфера.


TEXT: .ASCII /START OF RUN/

ARG: .BLKW 4

DEV: .RAD50 /LP/

.WORD 0

START: .LOOKUP #ARG, #0, #DEV

.WRITW #АRG, #0, #ТЕХТ, #б

Производится вывод по каналу 0 текста длиной 6 слов (12 байтов).


Работа с перфолентой

В принципе операции обмена информацией с перфолентой не отличаются от описанных выше. При этом надо иметь в виду, что в системе РАФОС с помощью макрокоманд ввода—вывода можно передать только четное число байтов.

Задача 7.8. Ввести с перфоленты в буфер 1024 строки. Поставив запрос на ввод в очередь, продолжить выполнение программы. По окончании ввода вывести на экран терминала текст "ввод закончен". Адрес подпрограммы завершения указывается в качестве последнего аргумента микрокоманды .READC.


START: .LOOKUP #ARG, #З, #PCN

.READC #АRG, #З, #ВUF, #512., #PRINT

.EXIT

PRINT: .PRINT #TEXT ; подпрограмма

.RTS PC ; завершения

ARG: .BLKW 5

TEXT:. .ASCIZ /ввод закончен/

.EVEN

PCN: .RAD50 /PC/

.WORD 0

BUF: .BLKW 1024.

Комплексный пример

В системах сбора и накопления информации часто приходится регистрировать большие объемы данных, поступающих непрерывным потоком. Стандартная методика заключается в том, что данные из физической установки накапливаются сначала в оперативной памяти, а по мере заполнения отведенного для них буфера перекачиваются на внешние носители - магнитные диски или ленты. Однако передача массива данных даже на диск, не говоря уже о ленте, требует значи­тельного времени. Пока идет освобождение буфера, входные данные теряются. Устранить потери можно, используя два буфера: пока один буфер заполняется входными данными, из другого идет перекачка содержимого на внешний носитель. После заполнения первого буфера его содержимое выводится на внешний носитель, а входные данные тем временем поступают во второй буфер. В приведенной ниже программе проиллюстрирован этот метод. Предполагается, что для обслуживания модулей физической установки имеется нерезидентный драйвер с именем XX. В качестве внешнего носителя используется магнитный диск DK1, и общий объем экспериментальных данных, подлежащих регистрации, определен в 20010 блоков по 25610 слов. Для накопления данных в оперативной памяти выделены буферы BUF1 и BUF2:


.MCALL .ENTER, .FETCH, .LOOKUP

.MCALL .QSET, .READC, .WRITC, .EXIT

START: .ENTER #AREA, #2, #FILE, #200.

.FETCH #DRVADR, #DRVNAM

.LOOKUP #AREA, #3, #DRVNAM

.QSET #Q, #3

.READC #AREA, #3, #BUF1, #256., #RDFIN1

.READC #AREA, #3, #BUF2, #256., #RDFIN2

I$: CMP NBLK, #200.

BEQ STOP

BR 1$

STOP: .EXIT

RDFIN1: .WRITC #AREA, #2, #BUF1, #256., #WRFIN1, NBLK

INC NBLK

RTS PC

RDFIN2: .WRITC #AREA, #2, #BUF2, #256., #WRFIN2, NBLK

INC NBLK

RTS PC

WRFIN1: .READC #AREA, #3, #BUF1, #256., #RDFIN1

RTS PC


WRFIN2: .READC #AREA, #3, #BUF2, #256., #RDFIN2

RTS PC

AREA: .BLKW 4

FILE: .RAD50 /DK1DATAEX/

DRVNAM: .RAD50 /XX/

Q: .BLKW 7*3

NBLK: .WORD 0

BUF1: .BLKW 256.

BUF2: .BLKW 256.

DRVADR=

.END START


Программным запросом .ENTER на диске DKI резервируется область размером 20010 блоков и создается файл с именем DATAEX. Открывается канал с номером 2 для передачи данных на диск. Макрокомандой .FETCH драйвер физической уста­новки XX загружается в отведенную ему в программе область с адресом DRVADR (в конце поля данных). Программным запросом .LOOKUP открывается канал номер 3 для связи с физической установкой. Поскольку в программе предполага­ется иметь четыре активных запроса на ввод—вывод (два на ввод в каждый из буферов и два на вывод из них), следует увеличить до 4 возможную длину очереди ввода—вывода. Это делается макрокомандой .QSET, в поле аргументов которой указывается адрес области памяти под элементы очереди (каждый элемент требует 7 слов).

Содержательная часть программы начинается двумя макровызовами .READC, которые устанавливаются друг за другом в очередь ввода—вывода. В первой макрокоманде указан буфер BUF1, во второй — BUF2. В соответствии с принци­пами работы драйвера первый запрос будет находиться в активном состоянии до тех пор, пока не будет завершен ввод указанного объема информации - 25610 слов (одного блока). Поскольку действия драйвера XX по вводу данных инициируются прерываниями от физической установки, данные могут поступать в любом темпе — периодически, сериями или случайно во времени. Запрос .READC организует асинхронную запись данных. Поэтому после установки обоих запросов в очередь программа продолжается. Три программные строки, начинающиеся с метки I$, организуют непрерывный опрос ячейки NBLK, в которой хранится (и наращивается) номер записываемого блока данных, и выход из программы через макрокоманду .EXIT, как только будет записано 200 блоков. После заверше­ния ввода первого блока монитор передает управление подпрограмме завершения по адресу RDFIN1, а драйвер XX немедленно начинает обрабатывать следующий элемент очереди ввода - вывода, т. е. вводить данные в буфер BUF2, чем и достигается непрерывность ввода данных. Тем временем подпрограмма завершения ставит в очередь к драйверу диска запрос на вывод одного блока данных и содержимое буфера BUF1 начинает перекачиваться на диск. Как только вывод закончится, команда INC NBLK увеличит на единицу текущий номер блока и подпрограмма завершится командой RTS PC, передав, в свою очередь, управление подпрограмме завершения по адресу WRFIN1. Эта подпрограмма ставит запрос на ввод данных в буфер BUF1, после окончания которого снова активизируется подпрограмма завершения, RDFIN1, выводящая содержимое буфера BUF1 на диск. Аналогичная цепочка действий реализуется для буфера BUF2: после первоначального заполнения буфера инициируется подпрограмма завершения RDFIN2, организующая вывод содержимого буфера на диск, а после окончания вывода (и модификации текущего номера блока) запускается подпрограмма завершения WRFIN2, снова ставящая в очередь к драйверу ХХ запрос на ввод данных. После заполнения буфера опять инициируется подпрограмма RDFIN2 и т. д.

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


§ 7.4. СИСТЕМНЫЕ СРЕДСТВА ВЗАИМОДЕЙСТВИЯ ЗАДАЧ


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

Непосредственная передача данных между задачами осуществля­ется с помощью пары макрокоманд .SDAT и .RCVD, а также их модификаций для синхронной передачи и для передачи по собы­тию.

Программа, посылающая данные, выдает один из запросов .SDAT, .SDATW, .SDATC, а программа, принимающая эти данные, выдает запрос .RCVD, .RCVDW либо .RCVDC.

Рассмотрим пример передачи массива данных из оперативной задачи в фоновую. Пусть оперативная программа должна получить данные из физической установки и передать их в фоновую про­грамму с целью, возможно, несрочной обработки и вывода на экран терминала для контроля. Обе программы написаны на МАКРОАССЕМБЛЕРе. Однако в этом языке нет простых средств вывода на печать чисел, поэтому в фоновую программу включен фортрановский модуль вывода чисел на экран терминала. Этот модуль оформлен как главная программа, а модуль на МАКРОАССЕМБЛЕРе — как подпрограмма:


; оперативная программа

.MCALL .EXIT, .SDATW

BUFFG: .BLKW 256.

START: . ; ввод данных из физической установки

.

.SDATW #AREA, #BUFFG, #256.

BR START

AREA: .BLKW 10

.END START

; фоновая программа


.MCALL .RCVDW, .PRINT

.PSECT DATA, D, OVR, GBL

BUFBG: .BLKW 257.

.PSECT

REС:: .RCVDW #AREA, #BUFBG, #256.

BCS ERR

RTS PC

ERR: .PRINT #TYРЕ

RTS PC

AREA: .BLKW 10

TYPE: .ASCIZ /RCVDW ERROR/

.EVEN

.END

:фоновая программа

:(фортрановский модуль)


COMMON /DATA/ N (257)
  1. CONTINUE

CALL REС

TYPE 2, N

2 FORMAT (1015)

GO TO 1

STOP

END


Рассматриваемый программный комплекс работает следующим образом. Пока оперативная программа ожидает ввода данных из физической установки и находится в заблокированном состо­янии, работает фоновая программа (фортрановский модуль). Оператор CALL передает управление на метку REC, что приводит к выдаче программного запроса .RCVDW, блокирующего фоновую программу до получения данных из оперативной программы. Как только оперативная программа введет серию данных из физической установки, она выдает программный запрос .SDATW и после окончания передачи принятой серии данных в фоновую программу переходит на ожидание ввода из физической установки новой серии. Фоновая программа получает данные в буфер BUFBG (первое слово приемного буфера автоматически заполняется чис­лом переданных байтов) и возвращает управление в фортрановский модуль, который выводит данные на экран терминала. Буфер BUFBG выделен в секцию DATA, объявленную с атрибутами D (данные), GBL (глобальная) и OVR (оверлей), что дает возмож­ность использовать ту же область памяти в фортрановской про­грамме, где объявлен COMMON-блок с тем же именем. Тем самым устраняется необходимость в передаче параметров из подпрограм­мы в основную программу.


§ 7.5. СИСТЕМНЫЕ СРЕДСТВА ОБСЛУЖИВАНИЯ ПРЕРЫВАНИЙ


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

Более простой и рациональный путь — программирование не­стандартных ВУ на физическом уровне так, как это описано (применительно к стандартным устройствам) в гл. 5. Однако при этом надо иметь в виду, что если ВК работает под управлением ОС, то прерывания от любых ВУ должны обрабатываться по опре­деленным правилам, чтобы не вступить в конфликт с алгоритма­ми работы ОС. В частности, программа обработки прерываний должна выполняться в режиме системы. Для того чтобы пользо­ватель мог не вникать в детали системного программирования, ОС содержит специальные системные макрокоманды, которые можно эффективно использовать при написании пользовательских программ обработки прерываний от нестандартного периферийного оборудования.

К системным макрокомандам обслуживания прерываний от­носятся две макрокоманды: .INTEN и .SYNCH.

Для того чтобы понять необходимость использования макро­команды .INTEN в программах обработки прерываний, рассмотрим конкретный пример. Пусть в физической установке предусмотрено периодическое, с периодом Т, включение системы счетчиков и накопление в них отсчетов в течение времени экспозиции t (рис. 7.10). После окончания экспозиции отсчеты из счетчиков вводятся в оперативную память ЭВМ, а по истечении времени Т счетчики снова включаются на время t и т. д. Управляющая аппаратура должна состоять из двух таймеров, A и В. Таймер А периодически с интервалами Т включает счетчики и запускает таймер В. Последний по истечении времени t блокирует вход счетчиков и с помощью прерывания инициирует программу приема данных.




Рис. 7.10. Временная диаграмма эксперимента


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

Оперативная программа будет состоять в рассматриваемом слу­чае из двух частей:


START: МОV#INT, @#140; адрес INT в вектор прерывания

МОV#340, @#142; приоритет 7 в вектор прерывания

.

.

.

.SPND ; блокировка задачи

.

.

.

.EXIT

INT: .

.

.

RTI

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

Следует отметить, что при необходимости использования в ПОП регистров общего назначения их предыдущее содержимое (до вхо­да в ПОП) должно быть в начале ПОП сохранено, а перед выходом из ПОП восстановлено.

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

При разработке систем реального времени, в которых ЭВМ, как правило, одновременно управляет целым комплексом аппарату­ры, возникает проблема оптимального выбора приоритетов подпрог­рамм, обслуживающих прерывания от различных модулей физичес­кой установки. Если данной ПОП присвоен наивысший приоритет 7, как это сделано в рассматриваемом примере, она не может быть прервана никаким другим ВУ и, следовательно, во всех случаях будет выполняться без помех до самого конца. Любое прерывание от физической установки будет ожидать завершения данной ПОП, которая, вообще говоря, может быть достаточно длинной. Дли­тельная задержка в обработке прерывания может привести к иска­жению «ожидающих» данных. Для правильного взаимодействия всех устройств, подключенных к ЭВМ, их приоритеты (уровни прерывания) выбирают в соответствии с «важностью» того или иного устройства, а приоритеты ПОП обычно устанавливают рав­ными приоритетами соответствующих ВУ. Часто ПОП включает в себя прием данных от ВУ в оперативную память и их предвари­тельную обработку. В этом случае участку ПОП, производящему прием данных, полезно присвоить наивысший приоритет, чтобы процесс приема данных не мог быть прерван, а на участке предва­рительной обработки приоритет ПОП может быть снижен с целью ускорения обработки возможных прерываний от других элементов установки.

Снижение приоритета ПОП может привести к тому, что она будет прерываться драйверами других ВУ, в частности диска, кото­рый подключен к 5-му уровню прерываний. Если в фоновом раз­деле происходит частое обращение к диску, такое прерывание весьма вероятно. После завершения передачи данных между диском и оперативной памятью драйвер диска передает управление пла­нировщику. Планировщик должен был бы вернуть управление на­зад в ПОП, однако ПОП принадлежит оперативной задаче, ко­торая заблокирована макрокомандой .SPND . В соответствии с заложенным в него алгоритмом работы планировщик в этом случае передаст управление фоновой задаче, а окончание ПОП отклады­вается, что может привести к непоправимому сбою оперативной задачи.

Использование в ПОП программного запроса .INTEN исклю­чает такую ситуацию. В результате выполнения этого запроса управление передается монитору, который переводит задачу в режим системы и тут же возвращает управление ПОП. Как уже отмечалось выше, в режиме системы запрещены любые переклю­чения задач. Выполнение ПОП в режиме системы гарантирует вы­зов планировщика только после того, как завершится ПОП. За­метим, что в случае использования макрокоманды .INTEN ПОП должна заканчиваться командой RTS PC, а не RTI.

Между прочим, в результате выполнения запроса .INTEN про­исходит автоматическое сохранение содержимого регистров R4 и R5, что дает программисту возможность использовать их в ПОП. При выходе из ПОП их предыдущее содержимое автоматически восстанавливается.

С учетом сказанного программа INT должна быть написана следующим образом:

INT: .INTEN 4

.

.

RTS PC


Аргумент в макрокоманде .INTEN задает приоритет процессора, на котором фактически будет выполняться программа обработ­ки прерывания. Как уже отмечалось, обычно приоритет процессора понижают до уровня прерывания, на котором работает данное ВУ.

Применение макрокоманды .INTEN влечет за собой опреде­ленные ограничения. Дело в том, что программа, выполняемая в режиме системы, не может использовать системные макрокоман­ды. Если же такая возможность должна быть предусмотрена, то ПОП кроме макрокоманды .INTEN должна содержать еще макро­команду .SYNCH с соответствующим блоком аргументов. В резуль­тате выполнения этого программного запроса управление передает­ся программе RMON, которая на основании блока аргументов для макрокоманды .SYNCH формирует элемент очереди подпрограмм завершения. После этого осуществляется выход из ПОП и управ­ление передается планировщику, который должен запустить опера­тивную задачу или, если она заблокирована,— фоновую. Однако стоящая в очереди подпрограмма завершения имеет более высокий приоритет, чем любая задача, и планировщик прежде всего запус­кает ее. В качестве подпрограммы завершения в данном случае выступает та часть ПОП, которая стоит после макрокоманды .SYNCH. В результате ПОП продолжится уже не в режиме систе­мы, а в режиме задачи на нулевом уровне приоритета, как нор­мальная подпрограмма завершения. Такая программа уже может использовать системные макрокоманды.

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


START: .PROTECT #ARG,#140

.ENTER #ARG,#2,#FILE,#1

MOV #INT,@#140

MOV #340,@#142

.

.

.

.SPND

.EXIT

INT: .INTEN 4

.

.

.

INC NW

CMP NW,#256.

BEQ WRITE

RTS PC

WRITE: .SYNCH #SYNBLK

BR FIN

.WRITW #АRG,#2,#ВUF,#256,#0

RTS PC

FIN: .PRINT #MSG

RTS PC

ARG: .BLKW 4

FILE: RAD50 /DK0COUNT6DAT/

SYNBLK: .WORD 0, 2, 0, 0, 0, —1, 0

NW: .WORD 0

BUF: .BLKW 256.

MSG: .ASCIZ /ERROR SYNCH/

.EVEN

Макровызов .PROTECT служит для корректировки карты защиты памяти. Дело в том, что программа KMON, загружая фоновую задачу, записывает в начальные ячейки оперативной памяти (с 0-й по 476-ю) информацию из нулевого блока файла образа задачи. При этом содержимое векторов прерывания оперативной задачи может быть разрушено. Для защиты используемых векторов пре­рываний предусмотрена специальная таблица — карта защиты па­мяти. Эта таблица длиной 20 байт расположена в RMON. Каждый из 160 двоичных разрядов, входящих в таблицу, сопоставлен с определенным словом памяти в области векторов прерываний (ячейки 0—476). Установка разряда защищает соответствующий вектор прерывания, предохраняя его содержимое от разрушения при загрузке новой задачи. Некоторые ячейки автоматически за­щищаются монитором РАФОС (другими словами, соответствующие этим ячейкам разряды карты защиты устанавливаются самим мо­нитором). Сюда относятся, например, векторы прерывания консоль­ного терминала, системного устройства (НМД), системного таймера и др. Для того чтобы предохранить от разрушения используемые в задаче векторы прерывания, их надо защитить с помощью про­граммного запроса .PROTECT. Этот запрос корректирует карту защиты памяти, закрепляя указанные в макровызове векторы пре­рывания за данной задачей и гарантирует их сохранность при за­грузке и переключении задач.

Макровызов .ENTER образует на диске DK0 файл COUNT6DAT размером в 1 блок (25610 слов). Две следующие команды загру­жают в ВП с адресом 140 адрес ПОП и начальный приоритет ПОП, равный 7. Существенно, чтобы в процессе перехода на системный режим и передачи управления ПОП процессор имел наивысший приоритет. Это гарантирует от сбоев в работе ВК в случае прихода более приоритетного прерывания. В опущенной части основной программы содержатся строки инициализации мо­дулей установки.

Программа обработки прерываний, начинающаяся меткой INT, содержит строки ввода данных и счета числа накопленных в буфере BUF слов. Как только буфер заполнится (NW = 256), происхо­дит переход на метку WRITE и вывод на диск (макрокомандой .WRITW) накопленных данных.

Макрокоманда .SYNCH, как уже упоминалось, переводит остав­шуюся часть ПОП в ранг подпрограммы завершения. Ее блок аргументов (метка SYNBLK) составляется по определенным пра­вилам и используется планировщиком при постановке задачи в очередь подпрограмм завершения. Особенность использования мак­ровызова .SYNCH заключается в том, что в случае его нормаль­ной отработки управление передается не на следующую за макро­вызовом строку исходного текста, как это обычно бывает, а через одну строку (в приведенном примере в ней содержится макро­вызов .WRITW). Если же при выполнении запроса .SYNCH про­изошел какой-либо сбой, управление передается на следующую за макровызовом команду. Команда BR FIN в этом случае обеспе­чивает переход на метку FIN, выдачу на терминал сообщения «ERROR SYNCH», и возвращение в основную программу. Естест­венно, запись на диск в этом случае не выполняется.


КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 7


1. Где располагается стек оперативной задачи:

а) в мониторе;

б) вплотную к задаче со стороны меньших адресов;

в) в фиксированной области оперативной памяти?

2. Что такое свопинг:

а) попеременное использование одной и той же области оперативной памяти

задачей пользователя и программой обслуживания пользователя;

б) передача управления от фоновой к оперативной задаче и наоборот;

в) выгрузка на диск фоновой задачи и загрузка на ее место оперативной?

3. Что происходит, если при выполнении программного запроса обнаруживается

ошибка:

а) программа аварийно завершается;

б) устанавливается бит С ССП и выполнение программы продолжается;

в) на терминал выдается сообщение об ошибке?

4. Как диагностируются ошибки при выполнении программных запросов:

а) по содержимому слова состояния программы;

б) по содержимому слова состояния процессора;

в) по содержимому байта 52 системной области связи?

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

ввода-вывода:

а) если в программе используется более одного программного запроса на ввод — вывод;

б) если происходит параллельное выполнение нескольких программных запросов

на ввод — вывод;

в) если в программе используются запросы на асинхронный ввод — вывод?

6. В каких случаях используются подпрограммы завершения:

а) если требуется выполнить какие-либо действия по завершению ввода — вы-

вода.

б) при завершении программы;

в) при завершении синхронного ввода — вывода?

7. Какой запрос на ввод — вывод следует использовать для вывода на терминал сообщения о завершении программы:

а) с ожиданием;

б) без ожидания;

в) с подпрограммой завершения?

8.В каких случаях используется программный запрос .SYNCH:

а) для синхронизации фоновой и оперативной задач;

б) если в программе обработки прерываний требуется обращение к средствам монитора;

в) для нормального завершения программы обработки прерываний?