Макросы. Введение в предмет (издалека).

Disclaimer (отмазка)

При подготовке этого материала, я помимо прочего пользовался "MPTMON USER MANUAL", но я не ставил себе цели выполнить его перевод (я вообще не рассчитывал писать про MPTMON, но не получилось). Так же, по различным причинам, я привел менее половины команд. Материал рассчитан на человека малознакомого с MPTMON, его вполне должно хватить для первого знакомства. Все примеры взяты из реальных log-файлов.

Пару слов про MPTMON.

Что это такое? Это специальное средство, среда, часть программного обеспечения (ПО) для отладки, и тестирования многопроцессорной системы, которой и является System 12. Концепция MPTMON такова: имеются несколько выделенных процессоров, обработчиков команд (MPTMON-контроллеры), которые имеют доступ к любому другому процессору исполнителю этих команд (MPTMON-помошник, от англ. MPTMON-slave). По сути дела и то и другое является всего лишь программным обеспечением (FMM/SSM). Процессор, иначе говоря, элемент управления станционного модуля (СЕ), выполняющий функции MPTMON-контроллера содержит следующее ПО:

В роли MPTMON-помошника может выступать любой станционный модуль, благодаря следующему ПО в его памяти:

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

MPTMON’s Environment and Interfaces

 

Отступление

Здесь должна была быть часть материала, которая по ряду причин оказалась в окончании статьи про адаптеры токовой петли (просто я не был уверен в том, что этот материал увидит свет).

Немного MPTMON команд.

Для начала, хотел бы привести описание некоторых команд, с примерами их применения и комментариями.

  1. Команды, используемые в течение тестовой сессии
    TER

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

         >TER
    ********************************************************************************
                        MULTI PROCESSOR TEST MONITOR      V4.8
    ********************************************************************************
     PASSWORD:
     *** PASSWORD REJECTED
     >SET PSW
     PASSWORD:
     >SET AUTH
     PASSWORD:
     >SET F1
     >SET C2
     >SET PMT
         >DIR
         >$
    

     

    LIS <устройство> [,EXT]

    Создает на устройстве файл (по умолчанию 971) в который копируется информация с терминала (как ввод, так и вывод). При указании параметра EXT информация будет добавляться в уже существующий файл вместо его перезаписи. В принципе, можно делать вывод не только в файл, но и на принтер или другой терминал (ни того, ни другого я не пробовал и думаю, скорее всего, есть ограничения). Запись информации прекращается по команде LIS OFF (сама команда при этом будет последней записью в файле).

    0016>LIS ON 1 ;начать копирование
    ...................
    0016>LIS OFF ;прекратить копирование

     

    TIM [DIS]

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

        >TIM
     2001-APR-02 MON 16:58:02

     

    BDR <скорость>

    Устанавливает скорость терминала. Как правило, HYCON правильно обрабатывает эту команду и самостоятельно меняет собственные настройки. В случае если вы не получили приглашение после подачи этой команды (например, работая в Speicon'e), вам придется вручную поменять настройки вашей терминальной программы. Следует также не забывать о том, что у некоторых терминалов скорость после инициализации/рестарта может быть 1200, а не 9600.

        >BDR 1200T
        >

     

  2. Команды для работы с CE
    ACT <сетевой адрес>

    Наиболее используемая команда. Активирует (устанавливает связь, или делает текущим, если связь была установлена ранее) управляющий элемент, с заданным сетевым адресом. После чего все команды, которым необходим доступ к CE, например, просмотр памяти, будут направляться на выполнение MPTMON SLAVE FMM именно этого СЕ. Вместо абсолютного сетевого адреса можно указать переменную или адрес в памяти. Одновременно (одним контроллером MPTMON) может быть активировано до восьми СЕ.

        >AC PTCE ; активируем собственный модуль
    0006>

     

    DAC [сетевой адрес [,продолжать трассировку]]

    Команда по действию противоположна предыдущей, она дезактивирует управляющий элемент, с заданным сетевым адресом, т.е. разрушает ранее установленную связь. Если второй параметр задан и равен TRUE, в этом случае запущенная трассировка не прерывается (сам никогда не использовал этот параметр). Иначе, запущенная трассировка завершается, точки останова снимаются, UCP разрушается.

     0027>DAC ALL ; дезактивируем все ранее активированные
         >
    ...............
     002D>DAC 2C ; дезактивируем конкретный СЕ
     002D>

     

    CE [DIR] [сетевой адрес]

    Показывает вспомогательную информацию по всем активированным на данный момент СЕ, да и просто бывает полезно посмотреть, сколько СЕ уже "взято под себя". Напротив текущего СЕ стоит знак минус "-", это удобно в том случае если опция PMT не установлена, т.е. не была выполнена команда SET PMT, или наоборот выполнена RES PMT.

     0004>DAC                                     ; дезактивируем текущий СЕ
         >CE                                      ; смотрим список
     ADDR  LCE   PROC  STATUS   BREAK_PID  PCS
     002C  0020  01F0  TRACING  FFFF_FFFF   22    ; активирован, но не текущий
         >AC 2C                                   ; делаем текущим
    ................
     0017>CE
     ADDR  LCE   PROC  STATUS   BREAK_PID  PCS
     002C  0020  01F0  TRACING  FFFF_FFFF   22    ; выполняется трассировка
    -0017  8F80  0140  ACTIVE   FFFF_FFFF   22    ; активирован и текущий
    

     

    INI [SLV] <сетевой адрес>

    Используется для активации СЕ, в том случае, если он уже занят другим терминалом и команда АСТ не проходит. Команда выполняется только после ввода пароля (при её выполнении в макросе, пароль не запрашивается, поэтому, если есть необходимость в непрерывности выполнения макроса, используется INI вместо ACT).

         >AC 2F
     *** SLAVE BUSY - USER : TERM. 0006/03  ; FMM MPTMON SLAVE уже занята терминалом
         >INI 2F                            ; подключенным к третьему порту MONI
     *** SLAVE BUSY - USER : TERM. 0006/03  ; но ни чего страшного
     PASSWORD:                              ; вводим пароль
     002F>                                  ; и получаем доступ
    
    При этом на терминале, который ранее "занял" этот СЕ выйдет следующая информация (приведенный пример не соответствует ситуации, приведенной выше).
     000C>$
     *** SLAVE INIT. BY : TERM. 0006/02         ; модуль "занял" другой терминал
     *** ERROR: PATH BREAKDOWN                  ; моя связь с ним разорвана
     ADDR  LCE   PROC  STATUS   BREAK_PID  PCS
    -000C  0000  0090  ACTIVE   FFFF_FFFF   22
         >
    

     

    CE RES

    Выполняет рестарт текущего СЕ.

         >AC 313
     0313>CE RES
     *** CE RESTARTING
         >

     

    CE BOO [быстрый тест]

    Выполняет перезагрузку текущего СЕ. Если указать параметр равный TRUE будет выполнен быстрый тест (сам никогда этой возможностью не пользовался).

         >AC 16
     0016>CE BOO
     *** CE BOOTING
         >

     

  3. Команды управления идентификаторами (Symbols)

    Идентификаторы (Symbols) являются аналогом переменных в других языках программирования. Имя идентификатора начинается с точки "." и не может содержать более 8-ми символов. Одновременно может быть определено максимум 256 идентификаторов.

    DEF .имя[=выражение] [,...]

    Определяет переменную с указанным именем, при этом выполняется проверка, существует указанный идентификатор или нет.

         >DEF .X=1            ; определяем идентификатор
         >DEF .X=4            ; еще раз
     * WARNING: SYMBOL REDEFINED
         >SYM                 ; смотрим что получилось
     .X        = 0004         ; хранит последнее значение
         >
    

    Как можно видеть, система не создает еще один идентификатор с таким же именем, а изменяет его значение. Попробуем то же самое, только в теле макроса. Для начала присвоим идентификатору значение равное 1 и выведем его, затем попытаемся объявить идентификатор заново, напоследок удвоим значение идентификатора.

        >DEF MAC X    ; создадим макрос
        .>DEF .X=1
        .>.X
        .>DEF .X
        .>.X
        .>.X=.X+.X
        .>.X
        .>EM
        >
        >X:           ; выполним его
     .X        = 0001
     .X        = 0000
     .X        = 0000
         >SYM
     .X        = 0000  ; идентификатор остался в памяти
         >
    

    Обратите внимание, что при выполнении команды DEF .X идентификатор принял нулевое значение.

    ADD .имя[=выражение] [,...]

    Определяет переменную с указанным именем, при этом, в отличие от DEF, проверка, существует указанный идентификатор или нет, не выполняется. Эту команду выгодно использовать внутри макроса, потому что, среди прочего, идентификаторы, определенные с её помощью, удаляются автоматически при завершении макроса, т.е. не занимают память, когда они уже больше не нужны.

         >ADD .X=1
         >ADD .X=4
         >SYM
     .X        = 0001
     .X        = 0004
         >.X
     .X        = 0004
         >REM SYM .X
         >SYM
     .X        = 0001
         >
    

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

         >DEF MAC X     ; определяем макрос
         .>ADD .X=1
         .>.X
         .>ADD .X=4
         .>.X
         .>.X=.X+.X
         .>.X
         .>EM
         >
         >X:
     .X        = 0001
     .X        = 0004
     .X        = 0008
         >SYM           ; смотрим
         >              ; и не находим
    

     

    [LET] .имя = значение

    Модификация значения идентификатора, LET обычно опускается.

         >SYM          ; смотрим текущее значение
     .X        = 0008
         >LET .X=1     ; пробуем так
         >SYM
     .X        = 0001
         >.X=2         ; теперь иначе
         >SYM
     .X        = 0002  ; как видно, эффект одинаковый
    

     

    .имя ! SYM [.имя,...]

    Команда выполняет просмотр значений идентификаторов.

    REM [.имя [,...]]

    Команда служит для удаления идентификаторов.

         >SYM              ; смотрим текущие идентификаторы
     .TACB     = 0000
     .IEC      = 002B
     .JSQ      = 09B2
     .@END     = 03DE
     .@LOC     = 0000
     .SUB      = 0001
     .SEARCH   = 0000
     .OPINDX   = 04BD
     .I        = 003E
     .MAX      = 0001
     .M        = 019C:0000
     .MS       = 0016
     .D        = 01A4:0000
     .DS       = 001C
     .MSTRT    = 019C:6812
     .DSTRT    = 01A4:8474
     .CAP      = 0033
         >REM SYM          ; удаляем все
         >SYM              ; опять смотрим
         >                 ; а их нет
    

     

  4. Команды для работы с экраном
    CLR [SCR]

    Очищает экран и переводит курсор в левое верхнее положение. Обычно используется в макросах.

    LOC [CUR] строка, столбец

    Позиционирует курсор в указанную позицию. Команда используется во многих макросах, например в tnst2.

    WRI [текст ! выражение] [,...] [,&]

    Позволяет вывести любой печатный символ, значение или строку. Если в конце указан символ "&", то строка не завершается, а продолжается, что позволяет объединить результаты нескольких команд WRI в одну строку. Существует возможность сделать выводимый текст инверсным, т.е. темные буквы на светлом фоне. Такой текст начинается с символа "^", код H'5E и заканчивается "~", код H'7E. Для демонстрации использования этих команд создадим макрос.

        >DEF MAC S
        .>CLR
        .>LOC 10T,20T
        .>WRI 'HELLO, WORLD!'
        .>LOC 11T,20T
        .>WRI '^HELLO, WORLD!~'
        .>EM
        >
    

    В результате его выполнения получим следующее:

    Screen Manipulations

     

    BAS = H ! T ! A ! Y

    Устанавливает основание системы счисления при выводе информации. При указании в качестве параметра H, будет установлена шестнадцатеричная система (при выводе целых чисел используется 4 символа). Для Т будет установлена десятичная система (целые будут занимать 5 позиций). При А, будет установлена ASCII база, т.е. будут выводиться символы.

    SUF = H ! T ! Y

    В отличие от предыдущей команды устанавливает основание системы счисления при вводе информации. При указании в качестве параметра H, будет установлена шестнадцатеричная система (используется по умолчанию). Для Т будет установлена десятичная система. При Y, будет установлена двоичная система.

         >.Y=10
         >DEF .Y=10      ; создаем идентификатор
         >BAS=T          ; устанавливаем десятичную систему
         >.Y
     .Y        = 0010    ; как видим, не действует
         >WRI .Y         ; пробуем так
       16                ; действует
         >BAS=H          ; устанавливаем шестнадцатиричную систему
         >WRI .Y
    0010
         >BAS=Y          ; устанавливаем двоичную систему
         >WRI .Y
    00010000
         >BAS=A          ; устанавливаем ASCII
         >.Y=35          ; ASCII код символа "5"
         >WRI .Y
    5
         >BAS=T          ; устанавливаем десятичную систему при выводе
         >WRI .Y
       53
         >SUF=H          ; устанавливаем шестнадцатиричную систему при вводе
         >.Y=30          ; меняем значение
         >WRI .Y
       48
         >SUF=T
         >.Y=30
         >WRI .Y
       30
         >.Y=30H
         >WRI .Y
       48
         >SUF=Y          ; устанавливаем двоичную систему при вводе
         >.Y=00001111
         >WRI .Y
       15
         >
    

И так, покончим на этот раз (материал для последующих статей частично уже собран) с рассмотрением команд MPTMON. Перейдем, собственно, к макросам.

Что такое макрос?

Макрос не уникальная вещь Системы 12. Макросы, скрипты, процедуры и проч. имеют многие программы (например, тот же M$ Word) и служат все эти средства для автоматизации рутинных действий, т.е. благой цели — облегчению жизни пользователя. В отношении Системы - 12 макросом является последовательность MPTMON команд, заключенная между двумя такими командами: DEF MAC и EM. Следует так же учитывать, что макросами не исчерпываются все возможности MPTMON. Макрос может иметь параметры (до 10), а может и не иметь их. Из одного макроса могут быть вызваны другие макросы. Некоторые MPTMON команды в ходе выполнения макроса могут выполняться иначе, чем при вводе их с терминала (примером может служить команда INI, которая при выполнении её в макросе не запрашивает пароль). Из макросов могут выполняться ММС-команды, причем их аргументы могут быть получены в ходе выполнения макроса. Макрос может интерактивно взаимодействовать с пользователем и проч. Как можно видеть, макросы довольно таки мощная вещь, и поэтому обращаться с ними нужно предельно осторожно. Перед выполнением незнакомого макроса следует ознакомиться с его содержимым, и только после того, как вы будете уверены что он не выполняет "потенциально опасных" действий, например, модификации значений в памяти, можно выполнить этот макрос. И всё равно, без особой необходимости лучше не выполнять макросов, которых вы не знаете, или видите впервые. И ещё, как можно видеть, без сносного знания MPTMON, на сколь либо серьезную работу с макросами надеяться не приходится.

Где хранится макрос?

Один и тот же макрос может находиться, как в памяти модуля, так и на станционном диске.

  1. В памяти модуля, который выполняет функции MPTMON-контроллера.

    Сколько оперативной памяти выделяется под макросы не знаю, но резидентно в памяти может находиться не более 64 макросов, их список можно посмотреть командой DIR. Очистить память от макросов можно командой REM MAC. Удалить отдельный макрос можно с помощью команды REM MAC <имя макроса>. Ну, и как говорилось ранее, при завершении сессии макросы тоже удаляются из памяти.

  2. На станционном диске.

    На диске макросы хранятся в специальных файлах с 960 по 969. Есть так же и другие файлы (с 950 по 959), но методика работы с этими файлами будет рассмотрена в последующих статьях. Так же нужно иметь ввиду следующее:

Выбрать отдельную библиотеку макросов, для дальнейшей работы с ней, можно командой SEL LIB <устройство>, <файл> (например, SEL LIB 1032T, 961T). Командой DIR LIB <устройство>, <файл> (например, DIR LIB 1032T, 961T) можно посмотреть макросы хранящиеся в одной из библиотек. Для удаления сразу всех макросов следует воспользоваться командой INI LIB <устройство>, <файл> (например, INI LIB 1032T, 961T). В этом случае происходит инициализация указанной библиотеки, т.е. создается пустой файл, выполнение команды защищено паролем.

Для того чтобы извлечь конкретный файл из библиотеки (загрузить его с диска в память модуля) следует выполнить команду GET MAC <имя макроса>.

Отступление

Вообще-то, с тем же успехом можно было использовать команду GET (без последующего MAC). Это объясняется тем, что интерпретатор MPTMON-команд из всего количества команд выбирает первую по алфавиту, если не указана полная мнемоника команды (в нашем случае на GET начинаются еще такие команды как GET SYM, GET UCP, GET UWA, т.е. GET MAC является первой по алфавиту среди команд имеющих одинаковыми первые 3 символа). Почему именно первые 2 или 3 символа? Потому что именно столько символов используется для точной идентификации MPTMON-команды если не указано больше.

В том случае, если вы не помните в какой из библиотек содержится макрос, можно воспользоваться макросом GET, например, так:

     >GET:ACTIV
 *** ERROR: MEMBER NOT FOUND       - ACTIV
 *** ERROR: MEMBER NOT FOUND       - ACTIV
 *** ERROR: MEMBER NOT FOUND       - ACTIV
 *** ERROR: MEMBER NOT FOUND       - ACTIV
 *** ERROR: MEMBER NOT FOUND       - ACTIV
 *** ERROR: MEMBER NOT FOUND       - ACTIV
 *** ERROR: MEMBER NOT FOUND       - ACTIV
MACRO ACTIV FOUND IN LIBRARY   966T
как можно видеть, макрос GET перебирает все библиотеки в поисках указанного макроса.

Если у вас есть файл с макросом, и вам нужно поместить его в станцию для дальнейшей работы с ним, то наиболее простой путь - это воспользоваться HYCON'овской командой INC (не надо путать с MPTMON'овской командой INC VAX). При помощи SPEICON'a можно тоже закачивать макросы (еще даже проще). Жмем F4, а дальше выбираем нужный файл и все.
    >INC D:\MACROS\AMAFST.MAC
 - Including AMAFST.MAC

     >rem MAC AMAFST
 *** ERROR: MACRO NOT DEFINED
     >DEF MAC AMAFST

Несколько слов в залючение...

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

Всем удачи!

 

 
Максим Осташов
Размещено на www.s12most.mailru.com 10 декабря 2001
Есть вопросы или дополнения, конструктивная критика? Пишите!
Hosted by uCoz