Структура программного секвенсора

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

Процессоры семейства ADSP-21000 выполняют инструкцию за три цикла:

- в цикле получения данных процессор из памяти программ (или из внутреннего кэша команд) читает инструкцию, адрес которой содержится в регистре программного секвенсора (ПС) FADDR;

- в течение цикла декодирования инструкция, адрес которой содержится в регистре ПС DADDR, расшифровывается, генерируя условия, которые управляют выполнением инструкции;

- в цикле выполнения процессор исполняет инструкцию, адрес которой находится в регистре PC программного секвенсора.

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

Время (циклы) 1        
Выполнение (PC) 0x0108 0x0109 0x010A 0x010B 0x010C
Расшифровка (DADDR)   0x0108 0x0109 0x010A 0x010B
Выборка (FADDR)     0x0108 0x0109 0x010A

Рис.4.1. Конвейеризованные циклы выполнения

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

Ветвление происходит тогда, когда адрес выборки не является следующим по счету за адресом предыдущей выборки. ADSP-21000 поддерживает условные и безусловные переходы, вызовы подпрограмм и возвраты. Единственным различием между переходом и вызовом подпрограммы (с точки зрения ПС) является то, что при вызове подпрограммы адрес возврата проталкивается в стек ПС, так что он становится доступен, когда позже выполняется команда возврата. Переходы же направляют выполнение программы по другой ветви, не допуская автоматического возврата.

Для выполнения перехода используется команда JUMP, для вызова подпрограммы – команда CALL. Для возврата из подпрограммы используется команда RTS. Например:

R1=DM(I1,0); R2=PM(I8,M12);! чтение из памяти в 1 такте

CALL Plus;! вызов подпрограммы

DM(I1,0) = R3;! запись результата в память

! тело подпрограммы Plus

Plus: R3 = R1 + R2;! суммирование регистров

RTS;! возврат из подпрограммы

! окончание подпрограммы Plus

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

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

Например:

JUMP next_label;! прямой переход

CALL (PC, 0x0002);! относительный переход

IF EQ JUMP (M8, I12);! косвенный переход

next_label: …

Переходы и возвраты могут быть с задержкой и без задержки.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: