Мегаобучалка Главная | О нас | Обратная связь


Ввод-вывод данных по прерываниям



2018-07-06 591 Обсуждений (0)
Ввод-вывод данных по прерываниям 0.00 из 5.00 0 оценок




Ввод цифровых отсчетов аналогового сигнала Х(t) из АЦП и вывод данных в ЦАП программа должна выполнять циклически с периодом дискретизации TS. Для этого в процессорах обычно используется механизм векторного прерывания (рис. 9). Источниками прерываний являются сигналы, которые поступают на вход контроллера прерываний и временно приостанавливают выполнение основной программы. Процессор, получив сигнал на входе контроллера, заканчивает выполнение текущей команды в произвольной точке основной программы и переходит к одной из подпрограмм обработки прерывания. В приведенном на рис. 9 примере прерывание вызвал импульсный сигнал, формируемый периодически с интервалом TS на входе контроллера, встроенного в микросхему процессора ADSP-2189M. Внешний сигнал поступил на вход микросхемы в тот момент времени, когда процессор выполнял команду n, расположенную в ячейке памяти программ РМ с адресом 0x0210. Прерывание изменяет линейный порядок выполнения программы.

После завершения текущей команды n процессор автоматически заносит в стек информацию о состоянии программы в данный момент времени,

 

 


Рис. 9. Вызов подпрограмм контроллером прерываний ADSP-2189M

расположенную в системных регистрах, для ее дальнейшего восстановления по окончании обработки прерывания. Содержимое программного счетчика сохранится в стеке PC, регистры секвенсора ASTAT, MSTAT, IMASK запоминаются в блоке STATUS STACK. Затем вместо следующего адреса 0x0211, на единицу больше текущего, процессор запишет в программный счетчик адрес начала подпрограммы обработки, определяемый таблицей векторов прерываний (табл. 3).

 

Таблица 3. Источники и векторы прерываний ADSP-2189M

Источник прерывания Адрес вектора прерывания
Сброс (Reset) 0x0000 (наивысший приоритет)
Снижение энергопотребления 0x 002С
IRQ2 0x 0004
IRQL1 0x 0008
IRQL0 0x 000C
Передатчик порта SPORT0 0x 0010
Приемник порта SPORT0 0x 0014
IRQE 0x 0018
Байтовый обмен ПДП (DMA) 0x 001C
Передатчик порта SPORT1 или сигнал IRQ1 0x 0020
Приемник порта SPORT1 или сигнал IRQ0 0x 0024
Таймер (timer) 0x 0028 (самый низкий приоритет)
Примечание: IRQ2, IRQL1, IRQL0, IRQE, IRQ1, IRQ0 – внешние сигналы, поступающие на входы процессора. Адреса векторов записаны в 16-ричной системе счисления.

 

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

Если, например, периодические прерывания вызывает сигнал внутреннего таймера, то контроллер передает процессору вектор 0х000А. Умножением на четыре процессор рассчитывает первый адрес 0х0028 четырех ячеек памяти и записывает его в программный счетчик. Поскольку разместить реальную подпрограмму обработки в четырех ячейках памяти невозможно, то здесь обычно записывают команду безусловного перехода на начало подпрограммы обработки прерывания таймера. В программах пользователя на языке ассемблера при заполнении таблицы векторов указывается имя подпрограммы в строке, соответствующей вектору 0х000А.

Выполнив подпрограмму обработки прерывания, процессор после команды завершения RTI автоматически восстанавливает системные регистры, читая их содержимое из стека, записывает в программный счетчик адрес команды n+1 и продолжает выполнение основной программы с той точки, в которой произошел выход на подпрограмму. Поэтому приведенная в листинге 1 программа расчета выходного сигнала КИХ-фильтра должна находиться не в основной программе, а в подпрограмме обработки прерывания таймера или последовательного порта, к которому подключены АЦП и ЦАП.

Регистр маскирования IMASK разрешает или запрещает прерывания индивидуально по каждому внешнему сигналу или встроенному устройству (табл. 4). Если обнулить бит 0 регистра IMASK, то процессор прекратит выполнять подпрограмму, определенную вектором таймера 0х000А.

Таблица 4. Регистр маскирования прерываний IMASK

Биты
Устройство или сигнал IRQ2 IRQL1 IRQL0 SPORT0 TX0 SPORT0 RX0 IRQE BDMA SPORT1 TX1 (IRQ1) SPORT1 RX1 (IRQ0) Таймер

 

1 – прерывание разрешено, 0 – запрещено.

Программа пользователя может разрешить обработку отдельного прерывания, если соответствующий бит установить (записать в него единицу), или запретить - при сброшенном бите. Допускается менять содержимое регистра в процессе выполнения программы. При включении питания или сбросе процессора регистр IMASK автоматически обнуляется, т.е. все маскируемые прерывания запрещены. Запись в регистр двоичного числа 0000000001 разрешит прерывания только от таймера. Чтобы разрешить прерывания от приемника последовательного порта SPORT0 (RX0) и от внешнего сигнала IRQ2 необходимо записать в регистр число 1000100000 с установленными битами в разрядах 9 и 5. Прерывания передатчика порта SPORT0 (TX0) будут запрещены. Поступающие сигналы на контроллер не вызовут выполнения процессором подпрограммы обработки прерывания передатчика порта SPORT0.

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

Регистр управления ICNTL содержит 5 разрядов. Бит 4 ICNTL разрешает или запрещает вложенные прерывания, т.е. одновременное выполнение нескольких подпрограмм прерываний с временной приостановкой тех, которые имеют более низкий приоритет (рис. 10). Импульсный сигнал запроса 2 с более высоким приоритетом приостановил выполнение подпрограммы обработки прерывания сигнала 1. Подпрограмма 1 будет продолжена только после того, как полностью завершится подпрограмма 2. Сигнал запроса 1 не может прервать подпрограмму 2.

Если бит 4 в регистре ICNTL установлен, то вложенные прерывания разрешены, при сброшенном бите – запрещены. Разряд 3 в регистре не используется. Биты 0,1,2 ICNTL определяют реакцию контроллера на форму внешних сигналов IRQ0, IRQ1 и IRQ2 соответственно. При установленном бите контроллер реагирует на фронт импульса, при сброшенном бите – на уровень сигнала. Регистр управления ICNTL не обладает чувствительностью к форме сигналов встроенных устройств, подключенных к контроллеру.

 

 
 

 

 


Рис. 10. Обработка контроллером вложенных прерываний

Задержка между предоставлением прерывания и выполнением первой команды подпрограммы составляет 3 командных цикла и равна 40 нс для таймера, сигналов IRQx и последовательного порта SPORT.

После сброса процессора прерывания разрешены по умолчанию. Команда DIS INTS запрещает все прерывания, независимо от содержимого регистра маскирования IMASK. Противоположная по действию команда ENA INTS разрешает процессору выполнять все прерывания, определенные в IMASK.

Таблица векторов прерываний занимает в памяти программ РМ фиксированную область адресов от 0х0000 до 0х002F. Программы и подпрограммы пользователя являются перемещаемыми. Начальные адреса подпрограмм в примере на рис. 9 могут изменяться на этапах трансляции и компоновки. Значения 0x0050, 0x0500 и 0х0710 приведены только для наглядности и не служат правилом для определения начальных адресов. Распределение адресов памяти программ и памяти данных процессора приведено в табл. 5.

 

Таблица 5. Области памяти программ РМ и памяти данных DM ADSP-2189

  Начальный адрес Конечный адрес Длина слова (биты)
Сегмент прерываний РМ 0х00000 0х0002F
Сегмент кода РМ 0х00030 0х01840
Сегмент кода 2 РМ 0х02000 0х02600
Сегмент данных DM 0х00000 0х036AF
Сегмент инициализации DM 0х036B0 0х036BF
Сегмент страниц DM 0х036C0 0х036CF
Сегмент данных DM 0х036D0 0х03C00

 

 



2018-07-06 591 Обсуждений (0)
Ввод-вывод данных по прерываниям 0.00 из 5.00 0 оценок









Обсуждение в статье: Ввод-вывод данных по прерываниям

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (591)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)