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

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

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

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

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

Команда RTS (LR) гарантирует правильный повторный вход в цикл. Например, в цикле, организованном по счетчику, условие завершения цикла проверяется посредством уменьшения значения счетчика текущего цикла (CURLCNTR) в течение выполнения двух последних команд цикла. Тогда незадержанный вызов может использоваться в одной из двух последних команд. При этом необходимо наличие команды RTS (LR) для возвращения из подпрограммы. Модификатор повторного входа в цикл (LR) гарантирует правильный повторный вход в цикл, предотвращая декремент счетчика циклов (дважды для одной и той же итерации цикла).

3.5.1.2. Циклы, организованные по счетчику

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

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

Третья от конца команда цикла, организованного по счетчику (по адресу e 2, где e – адрес конца цикла), не может быть записью в счетчик из памяти.

81

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

Цикл с одной командой, три итерации

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

выполняемая

n

n + 1

n + 1

n + 1

n + 2

команда

 

Первая итерация

Вторая итерация

Третья итерация

 

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

n + 1

n + 1

n + 1

n + 2

n + 3

команда

 

 

 

 

 

выбираемая

n + 2

n + 1

n + 2

n + 3

n + 4

команда

 

 

 

 

 

 

LCNTR<-3

код операции не

остановка

 

 

 

 

обновляется,

перехода в

 

 

 

 

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

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

 

 

 

 

не обновляется;

данные

 

 

 

 

результат

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

 

 

 

 

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

стека счетчика

 

 

 

 

счетчик пуст –

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

 

 

 

 

TRUE

цикла

 

 

Цикл с одной командой, две итерации (два непроизводительных цикла)

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

выполняемая

 

n

n + 1

n + 1

nop

 

nop

n + 2

команда

 

 

Первая итерация

Вторая итерация

 

 

 

 

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

 

n + 1

n + 1

n + 1 -> nop

n+1 -> nop

 

n + 2

n + 3

команда

 

 

 

 

 

 

 

 

выбираемая

 

n + 2

n + 1

n + 1

n + 2

 

n + 3

n + 4

команда

 

 

 

 

 

 

 

 

 

 

LCNTR<-2

код операции

результат

остановка

 

 

 

 

 

 

не обновляется,

проверки

перехода

 

 

 

 

 

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

условия счетчик

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

 

 

 

 

 

не обновляется;

пуст – TRUE

данные

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

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

 

 

N = команда DO UNTIL

 

 

 

и стека цикла

 

 

n+2 = команда после цикла

 

 

 

 

 

 

Рис. 3.7. Циклы, состоящие из одной команды, организованные по счетчику

3.5.1.3 Циклы, организованные без счетчика

Цикл, организованный без счетчика, – единственный, в котором условие завершения цикла отличается от LCE. Когда цикл, организованный без счетчика, является внешним циклом в последовательности вложенных циклов, адрес завершения внешнего цикла должен размещаться на два адреса позже, чем адрес завершения внутреннего цикла.

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

82

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

Рис. 3.8. Циклы, организованные по счетчику, состоящие из двух команд

Короткие циклы, организованные без счетчика, завершаются определенным образом из за конвейерного выполнения команд (выборка, декодирование, выполнение):

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

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

83

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

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

3.5.2. Стек адреса цикла

Стек адреса цикла состоит из шести 32 разрядных ячеек. Каждая 32 разрядная ячейка состоит из 24 разрядного адреса завершения цикла, 5 разрядного кода завершения цикла и 2 разрядного кода типа цикла.

Биты

Значение

0 23

Адрес завершения цикла

24 28

Код завершения цикла

29

Зарезервирован (всегда считывается как 0)

30 31

Коды типа цикла:

00 – организованный по арифметическому условию (не LCE)

01 – организованный по счетчику, длиной 1

10 – организованный по счетчику, длиной 2

11 – организованный по счетчику, длиной >2

Адрес завершения цикла, код завершения цикла и код типа цикла помещаются в стек после выполнения команды DO UNTIL или PUSH LOOP. Содержимое извлекается из стека при последней итерации цикла за две команды до конца или когда выполняется команда POP LOOP. Стек переполняется, если данные помещаются в стек, когда все ячейки в стеке адреса цикла заняты. Стек является пустым, если нет занятых ячеек. Флаги стек переполнен и стек пустой находятся в регистре «залипшего» состояния (STKY). Переполнение стека адреса цикла вызывает маскируемое прерывание.

Регистр LADDR содержит вершину стека адреса цикла. Он доступен для чтения и для записи по шине данных DM. При чтении и записи LADDR указатель вершины стека адреса цикла не перемещается. Помещение и извлечение данных из стека, выполняемые явными командами, приводят к перемещению указателя вершины стека. Когда стек адреса цикла пуст, LADDR содержит значение 0xFFFF FFFF.

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

При выходе из цикла данные извлекаются из стека адреса цикла (и стека счетчика цикла, если цикл организован по счетчику), если для перехода

84

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

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

3.5.3. Счетчики цикла и стек счетчика

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

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

3.5.3.1. CURLCNTR

Верхняя ячейка в стеке счетчика цикла всегда содержит номер итерации цикла, которая выполняется в данное время. Эта ячейка – регистр CURLCNTR, который доступен для чтения и записи по шине данных DM. Когда стек счетчика цикла пуст, при считывании регистра CURLCNTR возвращается значение 0xFFFF FFFF.

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

Данные извлекаются из стека счетчика цикла в последней итерации цикла за две команды до его конца. Когда данные извлекаются из стека счетчика, новая вершина стека становится значением CURLCNTR, используемым для следующего выполняемого цикла. Если следующего выполняющегося цикла нет, то после извлечения данных из CURLCNTR в нем содержится значение 0xFFFF FFFF.

Запись в регистр CURLCNTR не вызывает помещения в стек его содержимого. Таким образом, если вы записываете новое значение в CURLCNTR, вы изменяете число итераций выполняющегося в данный момент цикла. Когда цикл DO UNTIL LCE не выполняется, запись в CURLCNTR не приводит ни к каким результатам.

85

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

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

3.5.3.2. LCNTR

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

При выполнении команды DO UNTIL LCE значение LCNTR помещается в стек счетчика цикла, т. о., оно становится новым значением CURLCNTR. Этот процесс показан на рис. 3.9. Предшествующее значение CURLCNTR сохраняется в предыдущей ячейке стека.

Рис. 3.9. Помещение данных в стек счетчика цикла для вложенных циклов

86

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

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

3.6. Прерывания

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

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

прерывания ADSP 2106x. Внутренними прерываниями являются:

арифметические исключения, переполнение стека и переполнение циклического буфера данных.

Запрос прерывания признается истинным, если он не маскирован, если все прерывания разрешены (т. е. установлен бит 12 в регистре MODE1) и если не ведется обработка прерывания с более высоким приоритетом. Если запрос признается истинным, то происходит обработка этого прерывания, т. е. выполняется переход по адресу, зарезервированному для этого прерывания. Векторы прерываний расположены с интервалом 8 команд; более длинная программа обработки может размещаться в другой области памяти, обращение к ней осуществляется с помощью команды перехода. Возвращение к основной программе происходит, когда выполняется команда RTI (возврат из прерывания).

Процессор ADSP 2106x не может обрабатывать прерывание, если он выполняет команду или находится в состоянии IDLE. IDLE и IDLE16 – специальные команды, которые останавливают ядро процессора до прихода внешнего прерывания или прерывания по таймеру.

Для обработки прерывания программный автомат процессора ADSP 2106x выполняет следующие действия:

1.Выводит соответствующий адрес вектора прерывания.

2.Помещает текущее значение счетчика команд (адрес возврата) в стек счетчика команд.

87

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

Если поступивший запрос на прерывание является внешним прерыванием (), внутренним прерыванием таймера или векторным прерыванием

многопроцессорной системы VIRPT, то программный автомат помещает текущие значения регистров ASTAT и MODE1 в стек состояния.

4.Устанавливает соответствующий бит в регистре фиксации прерывания (IRPTL).

5.Изменяет указатель маски прерывания (IMASKP), чтобы отразить текущее состояние вложенности прерывания. Бит режима вложенности (NESTM) в регистре MODE1 определяет, какие прерывания маскированы во время выполнения программы обработки – все прерывания или только прерывания с более низким приоритетом.

В конце программы обработки прерывания по команде RTI выполняются следующие действия:

1.Возврат к адресу, сохраненному в вершине стека счетчика команд.

2.Извлечение этого значения из стека счетчика команд.

3.Извлечение данных из стека состояния, если туда было помещено содержимое регистров состояния ASTAT и MODE1 (для внешних

прерываний , прерывания по таймеру или векторного прерывания VIRPT).

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

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

3.6.1. Время ожидания прерывания

ADSP 2106x отвечает на прерывание в три этапа: синхронизация и фиксирование (1 цикл), распознавание (1 цикл) и переход по адресу вектора прерывания (2 цикла). См. рис. 3.10. Если прерывание вызвано программно, путем записи значения в бит регистра IRPTL, то оно распознается в следующем цикле, а затем следуют два цикла перехода по адресу вектора прерывания.

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

88

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

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

Обычное время ожидания, связанное с обработкой прерываний и векторного прерывания многопроцессорной системы, приведено ниже:

Прерывание

Время ожидания (минимум)

прерывание

3 цикла

векторное прерывание

6 циклов

многопроцессорной системы

 

(VIRPT)

 

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

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

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

первый из двух циклов, необходимых для выполнения доступа к данным памяти программы и выборки команды (когда команда отсутствует в кэше);

третья от конца итерация цикла с одной командой;

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

первый из двух циклов, необходимых для выборки и декодирования первой команды программы обработки прерывания;

состояние ожидания для обращения к внешней памяти;

обращение к внешней памяти, когда ADSP 2106x не имеет управления внешней шиной (в течение предоставления шины хост процессору или когда ADSP 2106x является ведомым в многопроцессорной системе).

89

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

Рис. 3.10. Обработка прерывания

3.6.2. Таблица векторов прерываний

В табл. 3.3 показаны все прерывания процессора ADSP 2106x в соответствии с расположением их битов в регистрах IRPTL и IMASK (см. «Регистр фиксации прерывания»). Также показан адрес вектора прерывания; каждый вектор отделен

90