А. В. Комаров цифровые сигнальные процессоры

Вид материалаДокументы
Узел формирователя следующего адреса
Счетчик циклов и его стек
Компаратор циклов и его стек
1.9.1. Общие сведения
1.9.2. Последовательность обслуживания прерывания
1.9.3. Конфигурирование прерываний
Работа с регистром ICNTL
Работа с регистром IMASK
Глобальное разрешение/запрещение прерываний
Работа с регистром IFC
Временные задержки
1.10. Регистры состояния и стек состояния
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   26

Таблица 1.3

Значения выходного кода сдвигателя при различных значениях

уп­рав­ляющего кода и сигнала HI/LO

Управляющий код

Выходной код сдвигателя

Активен HI

Активен LO

16…127

32…127

00000000 00000000 00000000 00000000

15

31

R0000000 00000000 00000000 00000000

14

30

PR000000 00000000 00000000 00000000









2

18

CDEFGHIJ KLMNPR00 00000000 00000000

1

17

BCDEFGHI JKLMNPR0 00000000 00000000

0

16

ABCDEFGH IJKLMNPR 00000000 00000000

-1

15

XABCDEFGH IJKLMNP R0000000 00000000

-2

14

XXABCDEFGH IJKLMN PR000000 00000000









-30

-14

XXXXXXXX XXXXXXXX XXXXXXXX

XXXXXXAB

-31

-15

XXXXXXXX XXXXXXXX XXXXXXXX

XXXXXXXA

-32…-128

-16…-128

XXXXXXXX XXXXXXXX XXXXXXXX

XXXXXXXX

Примечания к табл. 1.3:
  • ABCDEFGHIJKLMNPR – входной код (совокупность нулей и единиц) сдвигателя;
  • Х – бит распространения.


Табл. 1.3 показывает, что сдвигатель заполняет все биты выходного кода, которые находятся справа от входного кода нулями, а слева – битом распространения Х (см. вход Х сдвигателя на рис. 1.8). В зависимости от выполняемой команды (см. п. 1.17.7) есть три источника бита распространения: старший значащий (знаковый) разряд входного кода, бит АС регистра арифметического статуса ASTAT (см. п. 1.10) и нуль.

Блок OR/PASS в зависимости от команды (см. п. 1.17.7) либо пропускает выходной код сдвигателя для запоминания в регистре SR (когда опущена опционная часть команд сдвига [SR OR]), либо выполняет операцию логического сложения над выходным кодом сдвигателя и содержимым регистра SR (когда опционная часть команд сдвига [SR OR] присутствует).

Опционная часть команд сдвига [SR OR] используется для выполнения сдвигов чисел с двойной точностью (32-битных). Допустим, что регистр SE содержит код 3, а регистр SI - ABCDEFGHIJKLMNPR, который необходимо сдвинуть с двойной точностью. Для этого необходимо сначала сдвинуть входной код относительно старшей части регистра SR, т. е. выполнить команду SR = LSHIFT SI (HI). В результате регистр SR будет содержать следующий код 00000000 00000ABC 00000000 00000000. Далее необходимо выполнить команду SR = SR OR LSHIFT SI (LO), после чего регистр SR будет содержать код 00000000 00000ABC DEFGHIJK LMNPR000. Если опустить во второй команде часть SR OR, то биты АВС заменятся нулями и мы не получим сдвига с двойной точностью.

Детектор экспоненты извлекает экспоненту входного кода сдвигателя и помещает ее в регистр SE через мультиплексор MUX 3. В зависимости от команды (см. п. 1.17.7) детектор по разному интерпретирует входной код. В режиме HI входной код интерпретируется как число с одинарной точностью или как старшее слово числа с двойной точностью. Экспонента при этом формируется по следующему правилу: подсчитывается число старших бит с одинаковым значением; получившееся число декрементируется; результат инвертируется. Табл. 1.4 иллюстрирует формирование экспоненты в HI режиме.

Таблица 1.4


Формирование экспоненты в HI режиме

Входной код сдвигателя

Значение экспоненты

SNDDDDDD DDDDDDDD

0

SSNDDDDD DDDDDDDD

-1






SSSSSSSS SSSSSSSN

-14

SSSSSSSS SSSSSSSS

-15

Примечание к табл. 1.4: S – знаковый бит, N – не знаковый бит, D – биты не рассматриваемые детектором экспоненты.


В расширенном HI режиме (HIX) входной код интерпретируется как результат операции вычитания (сложения) ALU, которая могла вызвать переполнение. В этом случае при формировании экспоненты учитывается флаг переполнения AV (см. п. 1.17.7). Табл. 1.5 иллюстрирует формирование экспоненты в расширенном HI режиме.

Таблица 1.5


Формирование экспоненты в расширенном HI режиме

AV

Входной код сдвигателя

Значение экспоненты

1

DDDDDDDD DDDDDDDD

+1

0

SNDDDDDD DDDDDDDD

0

0

SSNDDDDD DDDDDDDD

-1

0






0

SSSSSSSS SSSSSSSN

-14

0

SSSSSSSS SSSSSSSS

-15


Табл. 1.5 показывает, что при наличии переполнения (AV = 1) экспонента равна +1. При отсутствии переполнения (AV = 0) экспонента формируется как в обычном HI режиме.

В режиме LO входной код интерпретируется как младшее слово числа с двойной точностью. В этом режиме принимается во внимание знак числа, который хранит флаг знака SS (см. п. 1.17.7 и рис. 1.8). Экспонента формируется только, если регистр SE содержит значение –15, т.е. старшее слово числа с двойной точностью содержит все нули или единицы. Табл. 1.6 иллюстрирует формирование экспоненты в LO режиме.

Таблица 1.6


Формирование экспоненты в LO режиме

SS

Входной код сдвигателя

Значение экспоненты

S

NDDDDDDD DDDDDDDD

-15

S

SNDDDDDD DDDDDDDD

-16

S






S

SSSSSSSS SSSSSSSN

-30

S

SSSSSSSS SSSSSSSS

-31


Блок сравнения экспонент используется для нахождения максимальной экспоненты массива входных чисел сдвигателя. Для этого блок сравнения сравнивает значение экспоненты, которое присутствует на выходе детектора экспоненты, с содержимым регистра SB. Если выходное значение детектора экспоненты выше, чем содержимое регистра SB, то это значение через мультиплексор MUX 1 записывается в регистр SB. Обычно перед операцией определения максимальной экспоненты (см. п. 1.17.7) в регистр SB записывается число –16 (минимально возможное значение). Очевидно, что после циклической обработки всего массива чисел код максимальной экспоненты может быть считан из регистра SB.


1.8. Функциональная схема программного конвейера


Программный конвейер (рис. 1.9) формирует поток адресов команд, а также обеспечивает гибкое управление выполнением программы. Он допускает последовательное выполнение команд, организацию циклов без потери времени на определение окончания цикла, сложную обработку прерываний, передачу управления и вызовы подпрограмм (условные и безусловные) за один машинный цикл. Программный конвейер поддерживает следующие команды (см. п. 1.17.8) управления выполнением программы: цикла DO UNTIL, передачи управления JUMP, вызова подпрограмм CALL, возврат из подпрограмм RTS, возврат из прерываний RTI и перехода в энергосберегающий режим работы IDLE.

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

Узел формирователя следующего адреса содержит мультиплексор следующего адреса (NEXT ADDRESS MUX) и устройство управления мультиплексором следующего адреса (NEXT ADDRESS SOURCE SELECT). Во время выполнения процессором текущей команды этот узел формирует адрес следующей команды. Этот адрес может поступать от четырех источников: инкрементора (INCREMENT) программного счетчика (PROGRAM COUNTER – PC), РС стека (PC STACK), регистра команд (ши­на А на рис. 1.9) и контроллера прерываний (INTERRUPT CONTROLLER).




Узел формирователя следующего адреса основывает свой выбор на анализе следующих сигналов: кода команды (шина F (Function field – битовое поле функции команды) на рис. 1.9), состояния узла условных переходов (CONDITION LOGIC), состояния компаратора циклов (LOOP COM­PARATOR), состояния контроллера прерываний и контакта процессора FI.

Адрес следующей команды устанавливается на PMA шине. Инкрементор РС, как источник следующего адреса, выбирается, когда выполняется последовательная часть программы, т.е. отсутствуют условные переходы или возвраты из подпрограмм. Выходной код инкрементора поступает на PMA шину, а также через мультиплексор MUX 3 (по шине N, см. рис. 1.9) загружается в РС, чтобы начать следующий машинный цикл.

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

Регистр команд, как источник следующего адреса, используется при прямой адресации, когда 14-битный адрес встроен в код операции команды.

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

Узел формирователя следующего адреса не единственный источник адреса следующей команды. Другим источником может служить любой из индексных регистров I4-I7 DAG2 (см. рис. 1.2). Такое случается, если в программе встречается косвенный переход, вызванный, например, следующей командой JUMP (I4); (точка с запятой обозначает конец опе­ра­то­ра). Адрес, который при этом присутствует на РМА шине, также загружается в РС через MUX 3, но в этом случае используется Р шина (см. рис. 1.9).

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

С РС связан стек, который может содержать шестнадцать 14-битных слов (адресов). Запись в РС стек происходит в трех случаях: при выполнении команды CALL, при выполнении перехода на обработчик прерывания и при выполнении цикла DO UNTIL. В первых двух случаях в стек записывается адрес возврата из подпрограммы или из обработчика прерываний соответственно, в последнем случае – адрес первой команды тела цикла.

Особенностью обработки цикла прерывания является то, что в РС стек записывается не содержимое инкрементора, а содержимое РС, что позволяет выполнить команду, которая была прервана. Записи адресов и их считывание происходят автоматически, но считать стек РС можно и программно с помощью команды POP. Есть и еще одна команда (см. п. 1.17.10), с помощью которой можно не только сосчитать стек, но и записать в стек. Эта команда использует псевдо регистр TOPPCSTACK.

Выход мультиплексора следующего адреса через шину N и мультиплексор MUX 3 (см. рис. 1.9) связан с РС, что позволяет загружать новый адрес в конце текущего машинного цикла. Обычно так и происходит, но когда переход по программе осуществляется косвенно (по содержимому одного из индексных регистров DAG2), то адрес в РС загружается прямо с РМА через шину Р и мультиплексор MUX 3.

Счетчик циклов и его стек. Счетчик циклов (CNTR, см. рис. 1.9) поддерживает механизм формирования программных циклов. Сам счетчик является 14-битным, с автоматическим пост-декрементированием своего содержимого в конце тела цикла, что позволяет выполнять тело цикла предопределенное число раз. Счетная величина является числом без знака (положительной).

Для N-кратного выполнения тела цикла обычно используется следующий фрагмент программы:

CNTR = N;

DO cycles UNTIL CE;

{тело цикла}

cycles: Op1; Op2;

Первый оператор этого фрагмента загружает счетчик циклов константой N, которая должна быть определена в программе до ее первого использования. Второй оператор определяет тело цикла (от оператора до метки cycles) и условие выхода из цикла (Counter Expire (СЕ) - счетчик исчерпан).

Счетчик циклов декрементируется после выполнения последнего оператора цикла (Ор1). Следует отметить, что оператор Ор1 принадлежит телу цикла, а Ор2 – уже нет. Счетчик циклов может проверен и автоматически декрементирован также командой условного перехода, которая тестирует флаг СЕ. Счетчик не декрементируется, если СЕ проверяется условными арифметическими командами или условными командами возврата из подпрограмм.

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

Для реализации вложенных циклов с счетчиком связан стек (COUNT STACK, см. рис. 1.9), который может хранить четыре (максимальное число вложенных циклов) 14-бит­ных слова. Когда счетчик загружается новым значением с DMD шины (например, выполняется оператор CNTR = N;), текущее содержимое счетчика циклов автоматически загружается в стек счетчика. Стек счетчика автоматически считывается, когда в конце очередного цикла флаг СЕ принимает единичное значение, т.е. исчерпывается число необходимых циклов. Если необходим экстренный выход из циклов до исчерпания их числа, то стек может быть считан вручную.

В двух случаях автоматическое сохранение текущего значения счетчика циклов в стеке не производится. Их можно отнести к исключениям из общего правила. Первое исключение возникает, когда указатель стека счетчика содержит недействительное число. Это может случиться после сброса процессора или, когда была предпринята проверка СЕ с положительным исходом, а стек счетчика был пуст. Пустое состояние стека счетчика отражается битом 2 регистра SSTAT (см. п. 1.10).

Второе исключение возникает при использовании имени регистра OWRCNTR (OverWRite CouNTeR – перезапись счетчика). Запись в этот регистр перезаписывает содержимое счетчика циклов без сохранения его текущего значения в стек счетчика. OWRCNTR не может быть считан и не должен записываться в последней команде цикла DO UNTIL.

Компаратор циклов и его стек. С помощью компаратора циклов (LOOP COMPARATOR, см. рис. 1.9) программный конвейер обеспечивает переход в начало тела цикла без потери времени на определение окончания тела цикла.

В каждом машинном цикле компаратор циклов сравнивает следующий адрес, сформированный программным конвейером, с адресом последней команды тела цикла (адрес метки, указанной в операторе DO UNTIL, например, cycles в предыдущем примере). Адрес первой команды тела цикла хранится в вершине РС стека. Когда выполнится последняя команда тела цикла, процессор выполнит условный переход в начало тела цикла без дополнительных затрат времени на определение конца тела цикла.

Стек циклов (LOOP STACK, см. рис. 1.9) запоминает адреса последних команд и условий выхода из вложенных циклов, которых может быть до четырех. Единственный дополнительный машинный цикл, связанный с вложением циклов DO UNTIL необходим для выполнения самой команды DO UNTIL, поскольку загрузка стеков, связанных с реализацией циклов (COUNT STACK, LOOP STACK) выполняется аппаратно.

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

Таблица 1.7


Условия выхода из цикла DO UNTIL

Условие

Описание

Выполняется, когда

EQ

Равно нулю

AZ = 1

NE

Не равно нулю

AZ = 0

LT

Меньше чем ноль

AN.XOR.AV = 1

GE

Больше чем или равно нулю

AN.XOR.AV = 0

LE

Меньше чем или равно нулю

(AN.XOR.AV).OR.AZ = 1

GT

Больше чем ноль

(AN.XOR.AV).OR.AZ = 0

AC

Перенос ALU

AC = 1

NOT AC

Нет переноса ALU

AC = 0

AV

Переполнение ALU

AV = 1

NOT AV

Нет переполнения ALU

AV = 0

MV

Переполнение МАС

MV = 1

NOT MV

Нет переполнения МАС

MV = 0

NEG

Отрицательный знак Х входа

AS = 1

POS

Положительный знак Х входа

AS = 0

CE

Счетчик исчерпан




FOREVER

Всегда





Когда выполняется команда DO UNTIL, 14-битный адрес последней команды тела цикла и 4-битное условие окончания цикла (оба определяются командой DO UNTIL) загружаются в 18-битный 4-словный стек циклов. Одновременно выход РС инкрементора загружается в РС стек. Поскольку команда DO UNTIL расположена перед первой командой тела цикла, то в РС стек загружается адрес первой команды тела цикла.

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

Вариант 1.

Если последняя команда тела цикла не JUMP, CALL, RETURN или IDLE, то селектор следующего адреса проверяет условие окончания циклов, которое хранится в вершине стека циклов. Если условие не выполнено, то в качестве источника следующего адреса выбирается РС стек, что вызовет переход на начало тела цикла. Если условие выполнено, то в качестве источника следующего адреса выбирается РС инкрементор, что вызывает выход из тела цикла на первую команду за пределами тела цикла. Стеки циклов, РС и счетчика (если используется) при этом аппаратно считываются.

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

Вариант 2.

Если последняя команда тела цикла JUMP, CALL, или RETURN, то она имеет преимущество перед неявным управлением цикла. Это означает, что при выполнении, перечисленных выше команд, не выполняются обычные для конца тела цикла операции: возврат в начало тела цикла с декрементированием счетчика циклов (если циклы не завершились), выход из цикла с считыванием стеков циклов, РС, счетчика (если циклы завершились).

Отметим, что по команде RETURN происходит возврат в начало тела цикла, поскольку на вершине стека РС находится адрес первой команды тела цикла.

Вариант 3.

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

Очевидно, что необходимо проявлять особую осторожность при использовании команд JUMP, CALL, RETURN или IDLE в последней строке тела цикла (а, возможно, и вовсе отказаться от этого). Это связано с блокированием механизма управления циклами (см. выше Вариант 1 и Вариант 2), что в том числе приводит к необходимости вручную (программно) считывать стеки циклов, РС и счетчика. Такая же необходимость существует при экстренном выходе из циклов.

1.9. Система прерываний

1.9.1. Общие сведения
Контроллер прерываний (INTERRUPT CONTROLLER, см. рис. 1.9) обслуживает запросы на прерывания процессора. Одним из этапов обслуживания является передача управления на соответствующий вектор прерывания. Все вектора прерывания перечислены (в порядке понижения приоритета) в табл. 1.8.



Таблица 1.8


Источники прерываний и адреса векторов прерываний

Источник прерывания

Адрес вектора

прерывания

Тип

прерывания

RESET#

0х0000 (наивысший приоритет)

Внешний

Powerdown (немаскируемое)

0х002С

Внешний

IRQ2#

0х0004

Внешний

IRQL1# (чувствительное к уровню)

0х0008

Внешний

IRQL0# (чувствительное к уровню)

0х000С

Внешний

SPORT0 Передача

0х0010

Внутренний

SPORT0 Прием

0х0014

Внутренний

IRQE# (чувствительное к фронту)

0х0018

Внешний

Byte DMA

0х001С

Внутренний

SPORT1 Передача / IRQ1#

0х0020

Внутр/внеш

SPORT1 Прием / IRQ0#

0х0024

Внутр/внеш

Таймер

0х0028 (наинизший приоритет)

Внутренний


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

Для сохранения контекста прерываемой задачи можно использовать выбор вторичных регистров ALU, MAC и SHIFTER (см. пп. 1.5…1.7). Такое переключение выполняется за один машинный цикл.


1.9.2. Последовательность обслуживания прерывания.


Запрос на прерывание запоминается контроллером прерываний на время выполнения текущей команды. Далее проверяется соответствующий разряд регистра масок IMASK (см. п. 1.9.3).

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

Программный конвейер также загружает содержимое регистров ASTAT (см. п. 1.10), MSTAT (см. п. 1.10) и IMASK в стек состояния (STA­TUS STACK, см. рис. 1.9). Упомянутые регистры загружаются в стек состояния в том порядке, в котором они перечислены. Если бит разрешения вложенных прерываний в ICNTL (см. п. 1.9.3) установлен, то регистр IMASK загружается новым значением.

Далее процессор выполняет команду NOP и одновременно читает из памяти программ первую команду обработчика прерывания. После возврата из обработчика (с помощью команды RTI) стеки РС и статуса считываются и продолжается выполнение прерванной программы.


1.9.3. Конфигурирование прерываний.


Для конфигурирования прерываний используются следующие регистры:
  • ICNTL – разрешает/запрещает вложенные прерывания, конфигурирует внешние запросы IRQ2#… IRQ0# как фронт- или уровень-чувствительные (см. п. П1.14);
  • IMASK – индивидуально разрешает/запрещает (маскирует) все запросы на прерывания как внешние, так и внутренние (см. п. П1.15);
  • IFC – программно формирует запрос на прерывание (форсирует прерывание) или сбрасывает текущий фронт-чувствительный запрос (см. п. П1.16).

Запросы на прерывание IRQ2#… IRQ0# могут быть как фронт-чувствительные, так и уровень-чувствительные, т.е. доступны для конфигурирования через регистр ICNTL. Запрос IRQE# всегда фронт-чувст­ви­тель­ный, IRQL1#, IRQL0# – уровень-чувствительные.

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

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

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

Работа с регистром ICNTL. Регистр ICNTL (см. п. П1.14) является 5-битным регистром, который конфигурирует внешние запросы на прерывания (IRQx#). После сброса процессора значение всех битов этого регистра не определено.

Биты ICNTL2…ICNTL0 содержат признак чувствительности запросов IRQ2#…IRQ0#. Причем, единица определяет чувствительность к фронту, а нуль – к уровню. Бит ICNTL4 содержит признак разрешения(1)/запрета(0) вложенных прерываний. Изменения содержимого регистра ICNTL вступают в силу через один машинный цикл после завершения команды, которая эти изменения вызвала.

Работа с регистром IMASK. Каждый бит регистра IMASK (см. п. П1.15) разрешает (если содержит 1) или запрещает (если содержит 0) соответствующий запрос на прерывание. После сброса процессора этот регистр обнулен. Изменения содержимого регистра IMASK вступают в силу через один машинный цикл после завершения команды, которая эти изменения вызвала. Это не относится к автобуферизации последовательного порта и ПДП передачам.

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

Глобальное разрешение/запрещение прерываний. Глобально разрешить прерывания можно командой ENA INTS;, а запретить – DIS INTS;. (INTS – седьмой бит регистра MSTAT, см. табл. 1.12). После сброса процессора все прерывания глобально разрешены. Глобальное запрещение прерываний вызывает маскирование всех запросов, включая powerdown, независимо от содержимого регистра IMASK.

Глобальное разрешение прерываний позволяет процессору обслуживать все незамаскированные запросы на прерывания. Глобальный запрет прерываний не влияет на запрос от автобуферизации последовательного порта.

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

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

Временные задержки. Для запросов на прерывания от таймера, IRQx#, и SPORT задержка между моментом времени появления запроса и выполнением первой команды обработчика составляет три машинных цикла.


1.10. Регистры состояния и стек состояния


Состояние процессора и биты режима его работы сохраняются в следующих внутренних регистрах (регистрах состояний STATUS RE­GIS­TERS, см. рис. 1.9), которые могут быть считаны и записаны через DMD шину:
  • ASTAT – регистр арифметического статуса;
  • SSTAT – регистр статуса стека (только для чтения);
  • MSTAT – регистр статуса режима;
  • ICNTL – регистр управления прерываниями;
  • IMASK – регистр масок прерываний;
  • IFC – регистр установки/сброса прерываний (только для записи).

Три последних регистра подробно рассмотрены в п. 1.9.3, ниже рассматривается формат трех первых регистров из приведенного списка.

Регистр арифметического статуса (ASTAT). Формат регистра приведен в табл. 1.9.

Таблица 1.9


Формат регистра ASTAT

7

6

5

4

3

2

1

0

0

0

0

0

0

0

0

0

SS

MV

AQ

AS

AC

AV

AN

AZ

Примечание: в табл. 1.9 использованы следующие обозначения – AZ – нулевой результат ALU, AN – отрицательный результат ALU, AV – переполнение ALU, AC – перенос ALU, AS – знак Х входа ALU, AQ – частное ALU, MV – переполнение МАС, SS – знак входа SHIFTER.


Для битов (флагов) AZ, AN, AV, AC и MV признаком выполнения соответствующего условия является наличие 1, в противном случае флаг хранит нулевое значение. В табл. 1.9 приведено содержимое регистра после сброса процессора.

На состояние битов регистра ASTAT влияют не все команды, а только те, которые приведены в табл. 1.10.

Таблица 1.10


Команды, влияющие на биты регистра ASTAT

Бит состояния

Устанавливается

AZ, AN, AV, AC

Любой командой ALU кроме DIVS, DIVQ

AS

Командой ALU – ABS

AQ

Командами ALU – DIVS, DIVQ

MV

Любой командой МАС кроме команды насыщения

MR – SAT MR

SS

Командой SHIFTER – EXP


Биты состояния защелкиваются в ASTAT в конце текущего машинного цикла и не могут использоваться до следующего машинного цикла.

Загрузка входных и выходных регистров ALU, MAC и SHIFTER прямо с DMD шины не влияет на биты арифметического состояния. Выполнение команды ALU – PASS устанавливает биты AZ, AN для заданных X- или Y-операндов и сбрасывает флаг АС.

Регистр статуса стека (SSTAT). Формат регистра приведен в табл. 1.11.

Таблица 1.11


Формат регистра SSTAT

7

6

5

4

3

2

1

0

0

1

0

1

0

1

0

1

LSO

LSE

SSO

SSE

CSO

CSE

PCO

PCE

Примечание: в табл. 1.11 использованы следующие обозначения – PCE – РС стек пуст, РСО – РС стек переполнен, CSE – стек счетчика пуст, CSO – стек счетчика переполнен, SSE – стек состояния пуст, SSO – стек состояния переполнен, LSE – стек циклов пуст, LSO – стек циклов переполнен.


Для всех битов признаком выполнения соответствующего условия является наличие 1, в противном случае бит хранит нулевое значение. В табл. 1.11 приведено содержимое регистра после сброса процессора.

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

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

Регистр статуса режима (MSTAT). Содержимое регистра оп­ре­де­ля­ет режим работы процессора. Формат регистра приведен в табл. 1.12.

Таблица 1.12


Формат регистра MSTAT

7

6

5

4

3

2

1

0

1

0

0

0

0

0

0

0

INTS

GME

TE

MRP

SME

OLME

RME

DRBS