Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Руководство пользователя по сигнальным процессорам Sharc

.pdf
Скачиваний:
128
Добавлен:
01.05.2014
Размер:
9.49 Mб
Скачать

Управление программой 3

3.1.2.1. Регистры программного автомата и системные регистры

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

Команды операции с битами системного регистра могут использоваться для установки, сброса, переключения или проверки определенных битов в системных регистрах. Эти команды описываются в разделе «Группа IV. Прочие команды» в приложении A.

Из за конвейерной обработки команд запись в некоторые из регистров программного автомата и в системные регистры не дает результата в следующем цикле. Например, если вы производите запись в регистр MODE1, чтобы разрешить режим насыщения ALU, то изменения вступят в силу через два цикла после выполнения записи. Кроме того, некоторые регистры не модифицируются в цикле, следующем непосредственно за записью; им нужен дополнительный цикл прежде, чем при чтении этого регистра будет получено новое значение. В табл. 3.1 приведено число дополнительных циклов, необходимое для выполнения записи (время срабатывания – effect latency) и для появления в регистре обновленного значения при его чтении (задержка считывания – read latency). Символ «0» указывает на то, что запись выполнится (или обновленное значение появится в регистре) в следующем после выполнения команды записи цикле. Символ «1» указывает на один дополнительный цикл.

Регистры

Содержание

Разрядность Задержка

Время

программного

 

 

считывания срабатывания

автомата

 

 

 

 

FADDR*

адрес выборки

24

 

 

DADDR*

адрес декодирования

24

 

 

PC*

адрес выполнения

24

 

 

PCSTK

вершина стека счетчика команд

24

0

0

PCSTKP

указатель вершины стека

5

1

1

 

счетчика команд

 

 

 

LADDR

вершина стека адреса цикла

32

0

0

CURLCNTR

вершина стека счетчика цикла

32

0

0

 

(счетчик текущего цикла)

 

 

 

71

3 Управление программой

Регистры

Содержание

Разрядность Задержка

Время

программного

 

 

считывания срабатывания

автомата

 

 

 

 

LCNTR

счетчик цикла для следующего

32

0

0

 

цикла DO UNTIL

 

 

 

Системные регистры

 

 

 

MODE1

биты управления режимом

32

0

1

MODE2

биты управления режимом

32

0

1

IRPTL

фиксирование прерывания

32

0

1

IMASK

маска прерывания

32

0

1

IMASKP

указатель маски прерывания

32

1

1

 

(для вложенности)

 

 

 

ASTAT

флаги арифметического

32

0

1

 

состояния

 

 

 

STKY

«залипшие» флаги состояния

32

0

1

USTAT1

определяемые пользователем

32

0

0

 

флаги состояний

 

 

 

USTAT2

определяемые пользователем

32

0

0

 

флаги состояний

 

 

 

*Только для чтения

Таблица 3.1. Регистры программного автомата и системные регистры

3.2. Работа программного автомата

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

3.2.1. Последовательное выполнение программы

Программный автомат определяет адрес следующей команды, проверяя как выполняемую команду, так и текущее состояние процессора. Процессор ADSP 2106x последовательно выполняет команды из памяти программы в порядке простого приращения адреса выборки, если это не противоречит никаким условиям.

3.2.2. Обращение к данным памяти программы

Обычно процессор ADSP 2106x выбирает команду из памяти в каждом цикле. Когда выполняется команда, для которой требуется, чтобы данные были считаны или записаны в тот же самый блок памяти, в котором хранится команда, возникает конфликт при обращении к этому блоку. Для уменьшения задержек, вызванных конфликтом этого типа, используется кэш команд.

72

Управление программой 3

Когда процессор ADSP 2106x в первый раз выбирает команду, которая вызывает конфликт с обращением к данным памяти программы, возникает задержка. Т. е., процессор должен ждать завершения обращения к данным, чтобы затем выбрать команду в следующем цикле. Для предотвращения подобной задержки в дальнейшем выбранная команда автоматически записывается в кэш. Процессор проверяет кэш команд при каждом обращении к данным памяти программы. Если необходимая команда находится в кэше, выборка команды из кэша происходит параллельно с обращением к данным памяти программы без задержки.

3.2.3. Переходы

Когда адрес выборки не является следующим адресом в линейной последовательности адресов, происходит переход. Процессор ADSP 2106x поддерживает следующие типы ветвлений: переход, вызов и возврат. Для программного автомата единственное различие между переходом и вызовом заключается в том, что при выполнении команды вызова адрес возврата помещается в стек счетчика команд; т. о., он будет доступен, когда выполнится команда возврата. Переходы выполняются к новому месту в памяти программы, не предусматривая возврата.

3.2.4. Циклы

Процессор ADSP 2106x поддерживает организацию программных циклов по команде DO UNTIL. При выполнении команды DO UNTIL процессор повторяет определенную последовательность команд до подтверждения истинности проверяемого условия.

3.3. Выполнение условных команд

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

Каждое условие, которое оценивает ADSP 2106x, имеет мнемонику ассемблера и уникальный код, который используется в коде операции условной команды. Для большинства условий программный автомат может проверять как истинные, так и ложные состояния, например, равенство и неравенство нулю. В табл. 3.2 приведены 32 кода условий и завершения цикла.

73

3 Управление программой

Флаг проверки бита (BTF) – это бит 18 в регистре ASTAT. Этот флаг устанавливается (или сбрасывается) в зависимости от результата команды

операции с битами системного регистра (BIT TST и BIT XOR), которые могут использоваться для проверки содержимого системных регистров процессора ADSP 2106x. Эти команды описаны в разделе «Группа IV. Прочие команды» в приложении A. После того как BTF установлен этой командой, он может быть использован как условие в условной команде (с обозначением TF; см. табл. 3.2).

Два условия, которые не имеют дополнений, – LCE/NOT LCE (счетчик циклов пуст/не пуст) и TRUE/FOREVER. Интерпретация кодов этих условий определяется по контексту; TRUE и NOT LCE используются в условных командах, FOREVER и LCE как условие окончания цикла. Конструкция IF TRUE создает безусловную команду. Команда DO FOREVER будет выполняться до тех пор, пока не произойдет прерывание или сброс.

Условие LCE (счетчик циклов пуст) наиболее часто используется в команде DO UNTIL. Поскольку по условию LCE проверяется значение счетчика циклов (CURLCNTR), за условной командой IF NOT LCE не должна следовать запись в CURLCNTR из памяти. Из за того что запись происходит после проверки условия NOT LCE, условие основывается на прежнем значении CURLCNTR.

Условие «ведущий» (BM) указывает, является ли ADSP 2106x текущим ведущим в многопроцессорной системе. Чтобы разрешить использование этого условия, биты 17 и 18 в регистре MODE1 должны быть равны нулю, иначе условие всегда будет оцениваться как ложное.

Синтаксис

Описание

Истинно, если

0

EQ

Результат ALU равен нулю

AZ = 1

1

LT

Результат ALU меньше нуля

См. примечание 1 ниже

2

LE

Результат ALU меньше или равен нулю

См. примечание 2 ниже

3

AC

Перенос в ALU

AC=1

4

AV

Переполнение результата ALU

AV=1

5

MV

Переполнение результата операции умножителя

MV=1

6

MS

Результат операции умножителя отрицательный

MN=1

7

SV

Устройство сдвига переполнено

SV=1

8

SZ

Результат устройства сдвига ноль

SZ=1

9

FLAG0_IN

Значение на входе флага 0

FI0=1

10

FLAG1_IN

Значение на входе флага 1

FI1=1

11

FLAG2_IN

Значение на входе флага 2

FI2=1

12

FLAG3_IN

Значение на входе флага 3

FI3=1

13

TF

Флаг проверки бита

BTF=1

14

BM

Ведущий

 

15

LCE

Счетчик цикла пуст (условие DO UNTIL)

CURLCNTR=1

15

NOT LCE

Счетчик цикла не пуст (условие IF)

CURLCNTR 1

74

Управление программой 3

Синтаксис

Описание

Истинно, если

Биты 16 30 дополнения битов 0 14

 

16

NE

Результат ALU не равен нулю

AZ=0

17

GE

Результат ALU больше или равен нулю

См. примечание 3 ниже

18

GT

Результат ALU больше нуля

См. примечание 4 ниже

19

NOT AC

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

AC=0

20

NOT AV

Нет переполнения результата ALU

AV=0

21

NOT MV

Нет переполнения результата операции

MV=0

 

 

умножителя

 

22

NOT MS

Результат операции умножителя

MN=0

 

 

не отрицательный

 

23

NOT SV

Устройство сдвига не переполнено

SV=0

24

NOT SZ

Результат устройства сдвига не ноль

SZ=0

25

NOT FLAG0_IN Значение на входе флага 0

FI0=0

26

NOT FLAG1_IN Значение на входе флага 1

FI1=0

27

NOT FLAG2_IN Значение на входе флага 2

FI2=0

28

NOT FLAG3_IN Значение на входе флага 3

FI3=0

29

NOT TF

Сброшен флаг проверки бита

BTF=0

30

NBM

Не ведущий

 

31

FOREVER

Всегда ложно (DO UNTIL)

всегда

31

TRUE

Всегда истинно (IF)

всегда

Примечания:

1.[and (AN xor (AV and)) or (AF and AN and)] = 1

2.[and (AN xor (AV and)) or (AF and)] or = 1

3.[and (AN xor (AV and)) or (AF and AN and)] = 0

4.[and (AN xor (AV and)) or (AF and)] or = 0

Таблица 3.2 Коды условий и завершения циклов

3.4. Ветвление программы (CALL, JUMP, RTS, RTI)

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

По команде возврата процессор выполняет переход по адресу, сохраненному в вершине стека счетчика команд. Существует два типа возвратов: возврат из подпрограммы (RTS) и возврат из прерывания (RTI). Различие между ними

75

3 Управление программой

заключается в том, что при выполнении команды RTI не только извлекается адрес возврата из стека счетчика команд, но также: 1) извлекаются данные из стека состояния, если туда было помещено содержимое регистров состояния

ASTAT и MODE1 (в случае прерываний , прерывания по таймеру или

векторного прерывания VIRPT), 2) обнуляется соответствующий бит в регистрах фиксации прерывания (IRPTL) и указателя маски прерывания (IMASKP).

Существует ряд параметров, которые можно задавать для ветвления программы:

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

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

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

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

3.4.1. Задержанные и незадержанные переходы

Модификатор команды DB указывает, что переход задержанный; иначе он незадержанный. Если переход незадержанный, то две команды, которые следуют за командой перехода и находятся в стадиях выборки и декодирования, не выполняются (см. рис. 3.4). Для команды вызова адрес декодирования (адрес

76

Управление программой 3

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

Незадержанный переход или вызов

Циклы тактовой синхронизации

выполняемая команда

n

nop

nop

j

декодируемая команда

n + 1 –> nop

n + 2 –> nop

j

j+1

выбираемая команда

n + 2

j

j+1

j+2

 

n+1 запрещается

n+2 запрещается; для

 

 

 

 

вызова n+1 помещается в

 

 

 

 

стек счетчика команд

 

 

Незадержанный возврат

Циклы тактовой синхронизации

выполняемая команда

n

nop

nop

r

декодируемая команда

n + 1 –> nop

n + 2 –> nop

r

r+1

выбираемая команда

n + 2

r

r+1

r+2

 

n+1 запрещается

n+2 запрещается; r

 

 

извлекается из стека

счетчика команд

n = Команда перехода

j = Команда по адресу перехода или вызова r = Команда по адресу возврата

Рис. 3.4. Незадержанные переходы

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

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

другие команды перехода, вызова или возврата,

команды помещения в стек или извлечения из стека счетчика команд,

команды записи в стек счетчика команд или записи указателя вершины стека счетчика команд,

команды DO UNTIL,

команды IDLE или IDLE16.

77

3 Управление программой

Задержанный переход или вызов

Циклы тактовой синхронизации

выполняемая команда

n

n + 1

n + 2

j

декодируемая команда

n + 1

n + 2

j

j+1

выбираемая команда

n + 2

j

j+1

j+2

 

 

Для вызова n+3

 

 

 

 

помещается в стек

 

 

 

 

счетчика команд

 

 

Задержанный возврат

Циклы тактовой синхронизации

выполняемая команда

n

n + 1

n + 2

r

декодируемая команда

n + 1

n + 2

r

r+1

выбираемая команда

n + 2

r

r+1

r+2

r извлекается из стека счетчика команд

n = Команда перехода

j = Команда по адресу перехода или вызова r = Команда по адресу возврата

Рис. 3.5. Задержанные переходы

Эти исключения проверяются ассемблером процессора семейства ADSP 21000.

Процессор ADSP 2106x не обрабатывает прерывание, сгенерированное в момент между выполнением задержанной команды перехода и любой из двух следующих за ней команд; эти три команды должны выполняться последовательно. Любое прерывание, которое генерируется в течение выполнения этих команд, фиксируется, но не обрабатывается до завершения выполнения перехода.

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

3.4.2. Стек счетчика команд

В стеке счетчика команд хранятся адреса возврата для подпрограмм, программ обработки прерываний и адреса вершины цикла для программных циклов. Стек счетчика команд состоит из 30 ти 24 разрядных ячеек.

Данные извлекаются из стека счетчика команд при возврате из прерывания (RTI), возврате из подпрограммы (RTS) и при завершении цикла. Стек является полным, когда все его ячейки заняты пустым, когда ни одна ячейка не занята; и переполненным, если происходит вызов, когда стек уже полный. Флаги полный и

78

Управление программой 3

пустой стек находятся в регистре «залипшего» состояния (STKY). Состояние стек полный вызывает маскируемое прерывание.

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

Указатель вершины стека счетчика команд (PCSTKP) – это регистр, доступный для чтения и записи, который содержит адрес вершины стека счетчика команд. Значение PCSTKP – ноль, когда стек счетчика команд пуст; 1, 2, ..., 30 – когда стек содержит данные и 31 – когда стек переполнен. Запись в PCSTKP имеет время срабатывания один цикл. Если стек счетчика команд переполнен, то запись в PCSTKP не выполняется.

3.5. Циклы (DO UNTIL)

Команда DO UNTIL обеспечивает эффективное выполнение программных циклов без дополнительных команд перехода, проверки условия или уменьшения счетчика. Приведем простой пример цикла процессора ADSP 2106x:

LCNTR = 30, DO label UNTIL LCE;

R0 = DM (I0, M0), F2 = PM (I8, M8); R1 = R0 - R15;

label:F4 = F2 + F3;

Когда процессор выполняет команду DO UNTIL, программный автомат помещает адрес последней команды цикла и условие завершения цикла (оба определены в команде) в стек адреса цикла. Он также помещает в стек счетчика команд адрес вершины цикла, который является адресом команды, следующей за командой DO UNTIL.

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

79

3 Управление программой

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

Возврат на начало цикла

Циклы тактовой синхронизации

выполняемая команда

e -2

e -1

e

b

декодируемая команда

e -1

e

b

b+1

выбираемая команда

e

b

b+1

b+2

 

результат

адрес начала

 

 

 

проверки условия

цикла является

 

 

 

завершения

вершиной стека

 

 

 

цикла – FALSE

счетчика команд

 

 

Завершение цикла

Циклы тактовой синхронизации

выполняемая команда

e -2

e -1

 

e

e+1

декодируемая команда

e -1

e

 

e+1

e+2

выбираемая команда

e

e+1

 

e+2

e+3

 

результат

остановка перехода в

 

 

 

 

проверки

начало цикла;

 

 

 

условия

данные извлекаются из

 

 

 

завершения

стека счетчика команд

 

 

 

цикла – TRUE

и стеков цикла

 

 

e = команда конца цикла b = команда начала цикла

Рис. 3.6. Выполнение цикла

3.5.1. Ограничения при выполнении циклов и короткие циклы

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

3.5.1.1. Общие ограничения

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

Последними тремя командами в цикле не могут быть команды перехода (переход, вызов или возврат), иначе цикл может быть выполнен неправильно. Это также относится к циклам из одной команды, и циклам, состоящим из двух команд, с одной итерацией. В этом правиле имеется одно исключение: незадержанный вызов CALL (без модификатора DB), объединенный с RTS (LR) – возврат из подпрограммы с модификатором повторного входа в цикл.

80