Руководство пользователя по сигнальным процессорам Sharc
.pdfУправление программой 3
8 ячейками памяти. Адреса в таблице представляют собой смещения относительно базового адреса. Для таблицы векторов прерываний во внутренней памяти базовый адрес – 0x0002 0000; для таблицы векторов прерываний во внешней памяти базовый адрес – 0x0040 0000. В третьем столбце табл. 3.3 приведен список мнемонических имен прерываний. Ассемблер не требует эти имена, они предусмотрены для удобства.
Таблица векторов прерываний может размещаться во внутренней памяти по адресу 0x0002 0000 (начало блока 0) или во внешней памяти по адресу 0x0040 0000. Если внутренняя память ADSP 2106x загружается из внешнего источника, то таблица векторов прерываний будет расположена во внутренней памяти. Однако если ADSP 2106x не загружается (используется память вне кристалла), то таблица векторов должна размещаться во внешней памяти. Подробнее о выборе режима начальной загрузки см. раздел «Начальная загрузка» в главе
Проектирование системы.
Номер |
Адрес |
Имя |
Функция |
бита |
вектора* преры |
|
|
IRPTL/ |
|
вания** |
|
IMASK |
|
|
|
0 |
0x00 |
|
Зарезервирован |
1 |
0x04 |
RSTI |
Сброс (только для чтения, немаскируемое) |
|
|
|
ВЫСШИЙ ПРИОРИТЕТ |
2 |
0x08 |
|
Зарезервирован |
3 |
0x0C |
SOVFI |
Переполнение стека состояния или стеков цикла, |
|
|
|
или полный стек счетчика команд |
40x10 TMZHI Таймер=0 (высокий приоритет)
50x14 VIRPTI Векторное прерывание
6 |
0x18 |
IRQ2I |
|
выставлен |
7 |
0x1C |
IRQ1I |
|
выставлен |
8 |
0x20 |
IRQ0I |
|
выставлен |
9 |
0x24 |
|
Зарезервирован |
|
10 |
0x28 |
SPR0I |
0 |
канал DMA – прием через SPORT0 |
11 |
0x2C |
SPR1I |
1 |
канал DMA – прием через SPORT1 |
|
|
|
(или буфер 0 линк портов) |
|
12 |
0x30 |
SPT0I |
2 |
канал DMA – передача через SPORT0 |
13 |
0x34 |
SPT1I |
3 |
канал DMA – передача через SPORT1 |
|
|
|
(или буфер 1 линк портов) |
|
14 |
0x38 |
LP2I |
4 |
канал DMA – буфер 2 линк портов |
15 |
0x3C |
LP3I |
5 |
канал DMA – буфер 3 линк портов |
16 |
0x40 |
EP0I |
6 |
канал DMA – буфер 0 внешнего порта |
|
|
|
(или буфер 4 линк портов) |
91
3 Управление программой
Номер |
Адрес |
Имя |
Функция |
бита |
вектора* преры |
|
|
IRPTL/ |
|
вания** |
|
IMASK |
|
|
|
17 |
0x44 |
EP1I |
7 канал DMA – буфер 1 внешнего порта |
|
|
|
(или буфер 5 линк портов) |
18 |
0x48 |
EP2I |
8 канал DMA – буфер 2 внешнего порта |
19 |
0x4C |
EP3I |
9 канал DMA – буфер 3 внешнего порта |
20 |
0x50 |
LSRQ |
Запрос обслуживания линк порта |
21 |
0x54 |
CB7I |
Переполнение циклического буфера 7 |
22 |
0x58 |
CB15I |
Переполнение циклического буфера 15 |
23 |
0x5C |
TMZLI |
Таймер=0 (низкий приоритет) |
24 |
0x60 |
FIXI |
Переполнение при операции с фиксированной точкой |
25 |
0x64 |
FLTOI |
Исключение при переполнении результата с плавающей |
|
|
|
точкой |
26 |
0x68 |
FLTUI |
Исключение потери значащих разрядов результата с |
|
|
|
плавающей точкой |
27 |
0x6C |
FLTII |
Исключение ошибки при операции с плавающей точкой |
28 |
0x70 |
SFT0I |
0 прерывание программы пользователя |
29 |
0x74 |
SFT1I |
1 прерывание программы пользователя |
30 |
0x78 |
SFT2I |
2 прерывание программы пользователя |
31 |
0x7C |
SFT3I |
3 прерывание программы пользователя |
НИЗШИЙ ПРИОРИТЕТ
Таблица 3.3. Вектора прерываний и их приоритет
* Смещение относительно базового адреса: 0x0002 0000 для таблицы векторов прерываний во внутренней памяти, 0x0040 0000 для таблицы векторов прерываний во внешней памяти.
** Эти имена битов IRPTL/IMASK определены в заголовочном файле def21060.h, входящем в программное обеспечение процессоров семейства ADSP 21000.
Если загрузка выполняется из внешней EPROM или хост процессора, то бит 16 в регистре IMASK (прерывание EP0I для 6 го канала DMA внешнего порта) будет автоматически установлен в 1 сразу после сброса, – это разрешает прерывание типа DMA выполнен для загрузки по шестому каналу. В регистр IRPTL после сброса записываются нули.
Бит IIVT в регистре управления SYSCON может использоваться для отмены зависимости расположения таблицы векторов прерываний от режима начальной загрузки. Если ADSP 2106x не загружается (режим «нет начальной загрузки»), то установка бита IIVT в 1 задает внутреннее расположение таблицы векторов прерываний, если IIVT=0, то задается внешнее расположение таблицы векторов прерываний. Если ADSP 2106x загружается из внешнего источника (любой режим, кроме режима «нет начальной загрузки»), то установка IIVT не имеет никакого влияния.
92
Управление программой 3
3.6.3. Регистр фиксирования прерывания (IRPTL)
Регистр фиксирования прерывания (IRPTL) – это 32 разрядный регистр, который фиксирует прерывание. Он указывает на все прерывания, которые были обработаны, а также на те, обработка которых была отложена. Поскольку этот регистр доступен для чтения и записи, любое прерывание (за исключением сброса) может быть установлено или сброшено программно. Не производите запись в бит сброса (бит 1) регистра IRPTL, потому что это переведет процессор в запрещенное состояние.
Когда генерируется прерывание, устанавливается соответствующий бит в IRPTL. Во время выполнения программы обработки прерывания этот бит удерживается нулевым – ADSP 2106x обнуляет бит в каждом цикле, предотвращая фиксирование того же самого прерывания, в то время как программа его обработки уже выполняется.
Однако специальный метод дает возможность многократного использования прерывания во время его обработки. Этот метод обеспечивается модификатором очистки прерывания (CI) в команде JUMP. См. Раздел «Очистка текущего прерывания для повторного использования».
Регистр IRPTL очищается при сбросе процессора. (Замечание: биты в регистре IMASK точно соответствуют битам регистра IRPTL).
3.6.4. Приоритет прерываний
Биты прерываний в регистре IRPTL упорядочены по приоритету. Приоритеты прерываний расположены от 0 (высший) к 31 (низший). Приоритет прерывания определяет, какое из прерываний обрабатывается первым, когда их поступает больше одного за цикл. Он также определяет, какие прерывания являются вложенными, когда вложенность допускается (см. «Вложенность прерывания и IMASKP»).
Прерывания при выполнении арифметических операций – переполнение при операции с фиксированной точкой и переполнение при операции с плавающей точкой, потеря значащих разрядов и неправильная операция – определяются флагами в регистре «залипшего» состояния (STKY). Считывая эти флаги, программа обработки для одного из этих прерываний определяет, какое событие его вызвало. Программа также должна очистить соответствующий бит регистра STKY, чтобы после окончания программы обработки прерывания оно не было вызвано вновь.
При уменьшении содержимого счетчика таймера до нуля генерируются прерывания 4 и 14 (см. табл. 3.3). Эти прерывания имеют различный приоритет.
93
3 Управление программой
Демаскируйте то прерывание таймера, которое имеет нужный вам приоритет, и оставьте другое маскированным. Демаскирование обоих прерываний приводит к обработке обоих прерываний, когда счетчик таймера достигает нуля. В этом случае процессор сначала обрабатывает прерывание с более высоким приоритетом, затем прерывание с более низким приоритетом.
3.6.5. Управление прерываниями и их маскирование
Генерация всех прерываний, кроме сброса, может разрешаться или запрещаться битом 12 в регистре MODE1 – битом глобального разрешения прерываний IRPTEN. При сбросе этот бит обнуляется, поэтому для разрешения генерации прерываний необходимо устанавливать этот бит.
3.6.5.1. Регистр маскирования прерываний (IMASK)
Все прерывания, кроме сброса, могут быть маскированы. Маскирование означает запрещение генерации прерывания. Маскированные прерывания фиксируются в регистре IRPTL и, в случае их разрешения в дальнейшем, обрабатываются.
Маскирование прерываний задается битами в регистре IMASK. Биты в IMASK точно соответствуют битам регистра IRPTL. Например, бит 10 в IMASK маскирует или разрешает то же самое прерывание, которое фиксируется битом 10 в IRPTL.
Если бит в IMASK установлен в 1, то прерывание не маскировано. Если бит установлен в 0, прерывание маскировано.
После сброса процессора все прерывания, кроме прерывания сброса и прерывания EP0I для 6 канала DMA внешнего порта (бит 16 в регистре IMASK), маскированы. Прерывание сброса всегда немаскировано. Прерывание EP0I автоматически демаскируется после сброса, если ADSP 2106x загружается из EPROM или из хост процессора.
3.6.5.2. Вложенность прерываний и IMASKP
Процессор ADSP 2106x поддерживает вложение одной программы обработки прерывания в другую, то есть выполнение программы обработки может быть приостановлено прерыванием с более высоким приоритетом. Этот режим устанавливается битом режима вложенности (NESTM) в регистре MODE1.
Когда бит NESTM равен 0, программа обработки прерывания не может быть прервана. Любое поступившее прерывание будет обработано только после завершения текущей программы обработки прерывания. Когда NESTM равен 1, немаскированные прерывания с более высоким приоритетом могут прерывать программы обработки прерываний с более низким приоритетом. Бит NESTM
94
Управление программой 3
должен изменяться только вне программы обработки прерывания или в программе обработки сброса, иначе вложенность прерываний будет работать некорректно.
Если вложенность разрешена и сразу после прерывания с более низким приоритетом генерируется прерывание с более высоким приоритетом, то начало выполнения программы обработки прерывания с более высоким приоритетом задерживается на один цикл. Это позволяет выполнить первую команду программы обработки прерывания с более низким приоритетом прежде, чем она будет прервана.
В режиме вложенности для создания временной маски прерывания для каждого уровня вложенности процессор ADSP 2106x использует указатель маски прерывания IMASKP; значение регистра IMASK не изменяется. Процессор изменяет IMASKP каждый раз, когда прерывание с более высоким приоритетом прерывает выполнение программы обработки прерывания с более низким приоритетом.
Биты в IMASKP соответствуют тем же прерываниям и упорядочены по приоритету, так же, как в IRPTL и IMASK. Когда происходит прерывание, его бит устанавливается в IMASKP. Если вложенность разрешена, то генерируется новая временная маска прерывания, маскирующая все прерывания равного или более низкого приоритета по отношению к прерыванию высшего приоритета, бит которого установлен в IMASKP. После возврата из программы обработки прерывания (RTI) бит прерывания высшего приоритета, установленный в IMASKP, обнуляется, и снова генерируется новая временная маска прерывания, маскирующая все прерывания равного или более низкого приоритета по отношению к прерыванию высшего приоритета, бит которого установлен в IMASKP. Установленный в IMASKP бит прерывания, которое имеет высший приоритет, всегда соответствует приоритету обрабатываемого в данный момент прерывания.
Если вложенность запрещена, то процессор маскирует все прерывания и IMASKP не используется, хотя IMASKP все равно обновляется для создания временной маски прерывания.
Когда IRPTL модифицируется, процессор не переходит сразу же к обработке сгенерированного прерывания, если уже выполняется программа обработки другого прерывания. Он ждет выполнения команды RTI для того, чтобы войти в программу обработки прерывания снова.
3.6.6. Сохранение и восстановление стека состояния
Для обработки прерывания с минимумом непроизводительных затрат процессор автоматически сохраняет и восстанавливает значения регистров состояния и
95
3 Управление программой
режима для прерванной программы. Три внешних прерывания (),
прерывание по таймеру и векторное прерывание VIRPT вызывают автоматическое помещение содержимого регистров ASTAT и MODE1 в стек состояния, который состоит из пяти ячеек. Эти данные автоматически извлекаются из стека состояния после выполнения команды возврата из прерывания RTI (и команды JUMP (CI), описанной далее в разделе «Очистка текущего прерывания для повторного использования»).
Только прерывания , прерывания таймера и VIRPT вызывают помещение содержимого регистров в стек состояния. Для всех других прерываний требуется явное сохранение в памяти и восстановление из нее соответствующих регистров.
При помещении содержимого регистров ASTAT и MODE1 в стек установки битов состояния и управления сохраняются. Т. о., если в программе обработки прерывания эти биты изменятся, то после возврата из прерывания установки автоматически восстановятся.
Заметим, что на биты FLAG3&0 в ASTAT не влияют помещение и извлечение из стека состояния; значения этих битов переносятся из основной программы в программу обработки и из программы обработки обратно в основную программу.
Вершина стека состояния содержит текущие значения ASTAT и MODE1. При считывании и записи этих регистров указатель стека не перемещается. Указатель стека перемещается при выполнении явных команд POP и PUSH.
3.6.7. Программные прерывания
Процессор ADSP 2106x поддерживает программные прерывания, которые эмулируют выполнение прерывания, но активизируются программой, а не аппаратурой. При установке одного из битов 28 31 в регистре IRPTL либо по команде BIT SET, либо путем записи в IRPTL генерируется программное прерывание. Процессор переходит к соответствующей программе обработки прерывания, если это прерывание не маскировано и все прерывания разрешены.
3.6.8. Очистка текущего прерывания для повторного использования
Обычно процессор ADSP 2106x игнорирует и не фиксирует прерывание, которое происходит повторно, когда программа его обработки уже выполняется. Когда прерывание происходит в первый раз, в IRPTL устанавливается
96
Управление программой 3
соответствующий бит. Во время выполнения программы обработки этот бит сохраняется нулевым – ADSP 2106x обнуляет бит в каждом цикле, предотвращая фиксацию прерывания, программа обработки которого уже выполняется.
Модификатор очистки прерывания (CI) команды JUMP позволяет повторно использовать прерывание во время его обработки. Это может быть полезно в системах, в которых требуется быстрая реакция на запрос прерывания и малое время срабатывания по прерыванию. Команда JUMP(CI) должна размещаться внутри программы обработки прерывания. При выполнении JUMP (CI) состояние текущего прерывания очищается без выхода из программы обработки прерывания, т. е. программа обработки прерывания сводится к стандартной подпрограмме – это позволяет снова сгенерировать прерывание в результате какого либо события в системе.
При выполнении команды JUMP (CI) программа обработки прерывания сводится к стандартной подпрограмме, при этом обнуляется соответствующий бит в регистре фиксации прерывания IRPTL и регистре указателя маски прерывания IMASKP, и извлекаются данные из стека состояния. Затем процессор останавливает автоматическое обнуление бита фиксации прерывания в IRPTL в каждом цикле, что позволяет снова сгенерировать то же прерывание.
При возвращении из подпрограммы, в которую была сведена программа обработки прерывания в результате выполнения команды JUMP (CI), команда RTS должна использоваться с модификатором (LR) (в случае, если прерывание генерируется в течение двух последних команд цикла). Команда RTS (LR) описана в разделе 3.5.1.1 «Циклы», «общие ограничения».
В следующем примере показана программа обработки прерывания, которая сводится к стандартной подпрограмме:
Instr1; |
{вход в программу обработки |
|
прерывания из основной программы} |
JUMP (PC, 3) (DB, CI); |
{очистка состояния прерывания} |
Instr3; |
|
Instr4; |
|
Instr5; |
|
RTS (LR); |
{используйте модификатор LR в команде |
|
возврата из подпрограммы} |
Обратите внимание, что после команды JUMP (PC, 3) (DB, CI) фактически продолжается линейное выполнение программы, переход происходит к ячейке PC+3 (Instr5). Две следующие команды (Instr3, Instr4) выполняются, так как
97
3 Управление программой
переход задержанный (DB). Эта команда JUMP является только примером – при выполнении JUMP (CI) переход может осуществляться к любой ячейке.
3.6.9. Синхронизация и режим срабатывания внешних прерываний
Каждое из трех внешних прерываний может срабатывать как по уровню (прерывание по уровню), так и по фронту (прерывание по фронту) сигнала.
ADSP 2106x фиксирует запрос на прерывание один раз в каждом цикле CLKIN. Запрос на прерывание по уровню рассматривается как истинный, если при опросе уровень сигнала активный (низкий уровень). Сигнал запроса прерывания по уровню должен стать неактивным (высокий уровень) до возвращения процессора из программы обработки прерывания. Если сигнал запроса прерывания по уровню остается активным при опросе процессором входа прерывания, то процессор обрабатывает его как новый запрос, повторяя ту же самую программу обработки прерывания без возвращения к основной программе (предполагается, что нет активных прерываний с более высоким приоритетом).
Запрос на прерывание по фронту рассматривается как истинный, когда уровень сигнала на выводе, на который приходит запрос, изменяется от высокого уровня в низкий. Сигнал запроса прерывания может оставаться в таком состоянии неопределенно долго. Для выдачи запроса на обработку другого прерывания сигнал должен снова переключиться из высокого уровня в низкий.
Для обработки запроса прерывания по фронту требуется меньше внешних устройств, чем для прерывания по уровню, так как нет необходимости сбрасывать сигнал запроса. Однако, несколько устройств, генерирующих прерывания, могут использовать одну линию запроса прерывания по уровню, объединяя сигналы запроса по схеме «ИЛИ», что облегчает расширение системы.
Режим срабатывания прерывания задается следующими битами в регистре MODE2.
Бит MODE2 |
Имя |
Описание |
0 |
IRQ0E |
1= по фронту; 0= по уровню |
1 |
IRQ1E |
1= по фронту; 0= по уровню |
2 |
IRQ2E |
1= по фронту; 0= по уровню |
3.6.9.1. Внешние асинхронные прерывания
Процессор принимает прерывания, которые являются асинхронными по отношению к тактовой частоте ADSP 2106x, то есть сигнал прерывания может
98
Управление программой 3
изменяться в любой момент времени. Сигнал асинхронного прерывания должен удерживаться низким, по крайней мере, один цикл CLKIN для его фиксирования. Сигналы асинхронных прерываний должны удовлетворять требованиям к времени установки и удержания сигнала по отношению к фронту CLKIN (см. перечень технических характеристик ADSP 2106x).
3.6.10. Многопроцессорное векторное прерывание VIRPT
Векторные прерывания используются для выполнения межпроцессорных команд в многопроцессорных системах. Когда внешний процессор записывает адрес в регистр VIRPT, вызывается векторное прерывание. Внешним процессором может быть или другой ADSP 2106x, или хост процессор.
При обработке векторного прерывания процессор ADSP 2106x автоматически помещает содержимое регистров ASTAT и MODE1 в стек состояния и начинает выполнение программы обработки, размещенной по адресу, определенному в VIRPT. 24 младших бита VIRPT содержат адрес; 8 старших бит могут использоваться как данные, которые будут считаны программой обработки прерывания. После сброса VIRPT инициализируется по его обычному адресу в таблице векторов прерываний ADSP 2106x.
Минимальное время ожидания для векторных прерываний – шесть циклов, пять из которых являются NOP. Когда в программе обработки прерывания выполняется команда RTI (возврат из прерывания), ADSP 2106x автоматически извлекает данные из стека состояния.
Бит VIPD в регистре SYSTAT отражает состояние регистра VIRPT. Если VIRPT записывается в то время, когда предыдущее векторное прерывание отложено, то новый адрес вектора замещает предыдущий. Если VIRPT записывается в то время, когда предыдущее векторное прерывание обрабатывается, то новый адрес вектора игнорируется и никакое новое прерывание не генерируется. Если ADSP 2106x выполняет запись в собственный регистр VIRPT, то эта запись игнорируется.
Для использования возможности векторного прерывания в ADSP 2106x внешний процессор может выполнять следующую последовательность действий:
1.Опрашивать регистр VIRPT, пока процессор не считает определенное значение маркера (то есть ноль).
2.Записать адрес программы обработки векторного прерывания в VIRPT.
3.Когда программа обработки завершается, процессор записывает маркер обратно в VIRPT, чтобы указать, что она закончена и что другое векторное прерывание может быть инициализировано.
99
3 Управление программой
3.7. Таймер
В процессоре ADSP 2106x имеется программируемый таймер, который может периодически генерировать прерывания. Программирование таймера выполняется путем записи значений в два его регистра, а управление работой таймера – с помощью бита в регистре MODE2. Внешний выход TIMEXP служит для сообщения другим устройствам о том что счетчик таймера пустой.
На рис. 3.11 показана блок схема таймера. Таймер управляется двумя универсальными регистрами: TPERIOD и TCOUNT.
Регистр |
Функция |
Разрядность |
|
TPERIOD |
Регистр периода таймера |
32 |
|
TCOUNT |
Регистр счетчика таймера |
32 |
|
Шина данных памяти данных |
||
|
32 |
|
|
|
TPERIOD |
|
32 |
|
|
|
|
|
32 |
|
|
|
MUX |
|
32 |
|
32 |
|
|
32 |
TCOUNT |
|
|
|
Уменьшение на 1 |
|
|
|
|
Y |
прерывание; |
|
TCOUNT=0? |
|
|
|
|
вывод TIMEXP; |
|
|
|
|
перезагрузка TPERIOD |
|
N |
|
|
Рис. 3.11. Структурная схема таймера
100