Скачать 1.44 Mb.
|
3.3.1. Прерывания от параллельных портов Регистры параллельных портов процессорной системы были показаны на рис. 3.4, который воспроизведен на рис. 3.13. Как видно из рис. 3. 13, параллельные порты, поддерживающие прерывания, включают два дополнительных регистра с адресами Base+8 и Base+С. Регистр маскирования прерываний, доступный по адресу Base+8, определяет должен или нет формироваться сигнал прерывания, который будет посылаться в процессор Nios II, когда данные, присутствующие на входном порте, изменят величину. Установка бита в 1 разрешит формирование соответствующего прерывания, в то время как установка 0 - запретит его. Параллельный порт содержит регистр захвата фронта, доступный по адресу Base+С. Каждый бит в этом регистре устанавливается в 1, когда соответствующий бит в параллельном порте изменит своё значение с 0 в 1. Выполнение операции записи в этот регистр установит все биты регистра в 0 и снимет соответствующие сигналы прерывания. Рис. 3.13 – Регистры параллельного порта ввода/вывода 3.3.1.1. Прерывания от кнопок Рис. 3.14 – Регистры параллельного порта ввода с кнопок Рис. 3.8, воспроизведенный на рис. 3.14, показывает регистры, связанные с параллельным портом кнопок. Регистр маски разрешает или запрещает формирование прерываний процессора при нажатии отдельных кнопок. Каждый бит в регистре захвата фронта устанавливается в 1, когда происходит нажатие соответствующей кнопки, если соответствующий бит регистра маски установлен в 1. Процессор Nios II после получения сигнала запроса прерывания может считать содержимое этого регистра, чтобы определить, какая из кнопок была нажата. Запись любой величины в регистр захвата фронта снимет запрос прерывания и установит все биты регистра захвата фронта в 0. 3.3.2. Прерывания от JTAG UART Рис. 3.10, воспроизведенный на рис. 3.15, показывает регистры данных и управления JTAG UART. Как было сказано в разделе 3.2.4, поле RAVAIL в регистре данных отражает число символов, которые хранятся в получаемом буфере FIFO в текущий момент времени. Поле WSPACE в регистре управления показывает размер свободного места в байтах в передаваемом буфере FIFO, то есть число символов, которые можно еще в него записать. Биты RE и WE регистра управления (см. рис. 3.15) используются для того, чтобы разрешить прерывания процессора, связанные с приемом или передачей символов. Если прерывание разрешено, то оно будет происходить, когда RAVAIL для буфера FIFO принимаемых данных превысит 7, или WSPACE для буфера FIFO отправляемых данных станет меньше 7. Произошедшие прерывания будут сопровождаться установкой в 1 разрядов RI и WI в регистре управления, которые потом могут быть очищены путем чтения или записи данных из/в JTAG UART. Рис. 3.15 – Регистры порта JTAG UART 3.3.3. Прерывания от последовательного порта UART Регистры данных и управления, связанные с последовательным портом UART, приведены на рис. 3.11 в разделе 3.2.5. Биты RE и WE в регистре управления (см. рис. 3.11) используются для того, чтобы разрешить прерывания процессора, связанные с заполнением получаемого и передаваемого буферов FIFO. Если прерывания разрешены, они будут формироваться, когда RAVAIL, для получаемого FIFO, или WSPACE, для передаваемого FIFO, превзойдет границу 31. Произошедшие прерывания будут сопровождаться установкой в 1 разрядов RI и WI в регистре управления, которые потом могут быть очищены путем чтения или записи данных из/в UART последовательного порта. 3.3.4. Прерывания от интервального таймера Рис. 3.12. в разделе 3.2.6 показывает 6 регистров, которые связаны с интервальным таймером. Как было сказано в разделе 3.2.6, бит TO регистра состояния таймера установится в 1, когда таймер досчитает до нулевой величины. Возможно формирование прерывания процессора, когда установится этот бит. Для этого используется бит ITO в регистре управления таймера. Установка бита ITO в 1 позволит сформировать запрос прерывания, когда сигнал TO станет равным 1. После возникновения прерывания этот бит может быть очищен путем записи любой величины в регистр, содержащий бит TO. 3.3.5. Использование прерываний в программе на языке ассемблер Пример программы на ассемблере для процессорной системы «DE2-70 Media Computer», в котором используются прерывания, показан в листинге 7. Эта программа отображает циклически сдвигаемый набор на 7-сегментных индикаторах. Набор сдвигается вправо, если нажата кнопка KEY1, и влево, если нажата KEY2. Нажатие KEY3 приводит к тому, что набор переустанавливается с использованием величины, заданной на переключателях. Два типа прерываний используется в этом примере. Отображение шестнадцатеричных чисел на 7-сегментных индикаторах выполняется программой обслуживания прерываний от интервального таймера и другая программа обработки прерываний, вызывается нажатием кнопок. Скорость, с которой шестнадцатеричные наборы отображаются в режиме бегущей строки на 7-сегментных индикаторах, устанавливается в основной программе посредством использования интервального таймера, который формирует прерывания каждые 33 мс. Листинг 7. Пример программы на ассемблере, в которой используются прерывания .equ KEY1, 0 .equ KEY2, 1 /******************************************************************************* * Эта программа демонстрирует использование прерываний на стенде * DE2-70 Media Computer. Вначале запускается таймер, который генерирует * прерывания каждые 33 мс. Затем разрешаются прерывания от таймера и кнопок. * Процедура обработки прерывания таймера отображает текст на 7-сегментных * индикаторах и сдвигает его влево или вправо. Направление сдвига определяется * кнопками. При нажатии кнопки key1 текст сдвигается вправо, при нажатии * key2 – влево, при нажатии key3 изменяется текст, используя данные с переключателей. ********************************************************************************/ .text .global _start _start: movia sp, 0x03FFFFFC /* Определяем адрес вершины стека */ movia r16, 0x10002000 /* Определяем период срабатывания интервального таймера */ movia r12, 0x190000 /* 1/(50 MHz) x (0x190000) = 33 msec */ sthio r12, 8(r16) /*определяем младшее полуслово как стартовое значение*/ srli r12, r12, 16 sthio r12, 0xC(r16) /* старшее полуслово как стартовое значение */ /* Запускаем таймер и разрешаем прерывания от него */ movi r15, 0b0111 /* START = 1, CONT = 1, ITO = 1 */ sthio r15, 4(r16) /* Разрешаем прерывания PIO, к которому подсоединены кнопки */ movia r15, 0x10000050 /* Адрес регистра кнопок */ movi r7, 0b01110 stwio r7, 8(r15) /* Устанавливаем 3 бита регистра маски прерывания*/ /* Разрешаем прерывания NIOS 2 процессора */ movi r7, 0b011 wrctl ienable, r7 /*Разрешаем прерывания от кнопок*/ movi r7, 1 wrctl status, r7 /* Разрешаем процессору обрабатывать прерывания */ IDLE: br IDLE /* Бесконечный цикл */ .data .global PATTERN PATTERN: .word 0x0000000F .global KEY_PRESSED KEY_PRESSED: .word KEY2 .end Обработчики сброса и исключений процессора для представленной выше программы приведены в листинге 8. Обработчик сброса процессора просто выполняет переход на метку _start в основной программе. Обработчик исключений вначале проверяет, является ли исключение внешним прерыванием, или внутренним. В случае внутреннего прерывания, такого как обнаружение некорректного кода операции или команды ловушки (trap) обработчик просто выполняет возврат из прерывания. То есть, он не обрабатывает эти случаи. Для внешних прерываний он вызывает либо программу обслуживания интервального таймера для прерывания уровня 0, либо программу обслуживания прерываний от кнопок для прерывания уровня 1. Эти программы показаны в листингах 9 и 10, соответственно. Листинг 8. Обработчики сброса и исключений /***************************************************************************** * ОБРАБОТЧИК СБРОСА * "ax" требуется для того, чтобы определить секцию как исполняемую. * AMP автоматически размещает секцию сброса по адресу, определяемому в настройках * процессора в SOPC Builder. *****************************************************************************/ .section .reset, "ax" movia r2, _start jmp r2 /* Переходим в основную программу */ /***************************************************************************** * ОБРАБОТЧИК ИСКЛЮЧЕНИЙ * "ax" требуется для того, чтобы определить секцию как исполняемую. * AMP автоматически размещает секцию сброса по адресу, определяемому в настройках * процессора в SOPC Builder. *****************************************************************************/ .section .exceptions, "ax" .global EXCEPTION_HANDLER /*Определяем процедуру как глобальную*/ EXCEPTION_HANDLER: /*Процедура обработки прерываний*/ subi sp, sp, 16 /* Изменяем адрес указателя стека */ stw et, 0(sp) /*Сохраняем содержимое регистра et в стеке*/ rdctl et, ctl4 beq et, r0, SKIP_EA_DEC /* Если прерывание не внешнее, то переходим на SKIP_EA_DEC */ subi ea, ea, 4 /* декрементируем регистр ea на 1 команду */ SKIP_EA_DEC: stw ea, 4(sp) /* Сохраняем регистры в стеке */ stw ra, 8(sp) stw r22, 12(sp) rdctl et, ctl4 bne et, r0, CHECK_LEVEL_0 /* Если прерывание внешнее, то переходим на CHECK_LEVEL_0*/ NOT_EI: /* Прерывание произошло в случае встречи невыполнимой команды или команды TRAP */ br END_ISR /* Выходим из обработчика прерываний */ CHECK_LEVEL_0: /* Проверка, является ли прерывание прерыванием от таймера IRQ0 */ andi r22, et, 0b1 beq r22, r0, CHECK_LEVEL_1 /*Если бит 0b1 регистра et не равен 1, то переходим к проверке, является ли прерывание прерыванием от кнопок*/ call INTERVAL_TIMER_ISR /*Вызываем процедуру обработки прерывания от таймера*/ br END_ISR /*Выходим из обработчика прерываний*/ CHECK_LEVEL_1: /*Проверка, является ли прерывание прерыванием от кнопок IRQ1*/ andi r22, et, 0b10 beq r22, r0, END_ISR /* Если бит 0b10 регистра et не равен 10, то выходим из обработчика прерываний*/ call PUSHBUTTON_ISR /*Вызываем процедуру обработки прерываний от кнопок*/ END_ISR: /*Восстанавливаем из стека все используемые регистры*/ ldw et, 0(sp) ldw ea, 4(sp) ldw ra, 8(sp) ldw r22, 12(sp) addi sp, sp, 16 eret /*Выходим из процедуры обработки прерывания*/ .end Листинг 9. Программа обработки прерываний от интервального таймера .include "key_codes.s" .extern PATTERN .extern KEY_PRESSED /***************************************************************************** * Процедура обработки прерываний от таймера ******************************************************************************/ .global INTERVAL_TIMER_ISR INTERVAL_TIMER_ISR: subi sp, sp, 40 /* Сохраняем регистры в стеке */ stw ra, 0(sp) stw r4, 4(sp) stw r5, 8(sp) stw r6, 12(sp) stw r8, 16(sp) stw r10, 20(sp) stw r20, 24(sp) stw r21, 28(sp) stw r22, 32(sp) stw r23, 36(sp) movia r10, 0x10002000 sthio r0, 0(r10) movia r20, 0x10000020 /*адрес регистра HEX3_HEX0 */ movia r21, 0x10000030 /*адрес регистра HEX7_HEX4*/ addi r5, r0, 1 movia r22, PATTERN movia r23, KEY_PRESSED ldw r6, 0(r22) /* загружаем текст для вывода на 7-сегментные индикаторы */ stwio r6, 0(r20) /* выводим на HEX3 ... HEX0 */ stwio r6, 0(r21) /* выводим на HEX7 ... HEX4 */ ldw r4, 0(r23) /* Проверяем, какая кнопка была нажата */ movi r8, KEY1 beq r4, r8, LEFT /* Если была нажата key1, то сдвигаем текст вправо */ rol r6, r6, r5 /* иначе, сдвигаем влево */ br END_INTERVAL_TIMER_ISR LEFT: ror r6, r6, r5 /* сдвигаем текст вправо*/ END_INTERVAL_TIMER_ISR: stw r6, 0(r22) /* выводим текст на 7-сегментные индикаторы */ ldw ra, 0(sp) /* Восстанавливаем регистры из стека */ ldw r4, 4(sp) ldw r5, 8(sp) ldw r6, 12(sp) ldw r8, 16(sp) ldw r10, 20(sp) ldw r20, 24(sp) ldw r21, 28(sp) ldw r22, 32(sp) ldw r23, 36(sp) addi sp, sp, 40 ret .end Листинг 10. Программа обработки прерываний от кнопок .include "key_codes.s" .extern KEY_PRESSED .extern PATTERN /******************************************************************************* Обработчик прерываний от кнопок *******************************************************************************/ .global PUSHBUTTON_ISR PUSHBUTTON_ISR: subi sp, sp, 20 /* Сохраняем регистры в стеке*/ stw ra, 0(sp) stw r10, 4(sp) stw r11, 8(sp) stw r12, 12(sp) stw r13, 16(sp) movia r10, 0x10000050 ldwio r11, 0xC(r10) /* Считываем значение из edge-capture регистра*/ stwio r0, 0xC(r10) /* Сбрасываем прерывание */ movia r10, KEY_PRESSED CHECK_KEY1: andi r13, r11, 0b0010 /* Если была нажата кнопка key1 */ beq r13, zero, CHECK_KEY2 movi r12, KEY1 stw r12, 0(r10) br END_PUSHBUTTON_ISR CHECK_KEY2: andi r13, r11, 0b0100 /* Если была нажата кнопка key2*/ beq r13, zero, DO_KEY3 movi r12, KEY2 stw r12, 0(r10) br END_PUSHBUTTON_ISR DO_KEY3: movia r13, 0x10000040 ldwio r11, 0(r13) /* Считываем значение с переключателей */ movia r13, PATTERN stw r11, 0(r13) /* Сохраняем измененный текст */ END_PUSHBUTTON_ISR: ldw ra, 0(sp) /* Восстанавливаем регистры из стека */ ldw r10, 4(sp) ldw r11, 8(sp) ldw r12, 12(sp) ldw r13, 16(sp) addi sp, sp, 20 ret .end |
Учебное пособие Москва Издательство Московского государственного... Рекомендовано к изданию Редакционно-издательским советом университета в качестве учебного пособия для студентов направления 230100... |
Учебное пособие Издательство Иркутского государственного технического университета 2012 Тимофеева С. С. Защита литосферы и обращение с опасными отходами : учеб пособие. – Иркутск : Изд-во Иргту, 2012. – 159 с |
||
Учебное пособие Издательство Иркутского государственного технического университета 2012 Тимофеева С. С. Защита литосферы и обращение с опасными отходами : учеб пособие. – Иркутск : Изд-во Иргту, 2012. – 159 с |
2015 удк 378 вестник рыбинского государственного авиационного технического... ... |
||
2015 удк 378 вестник рыбинского государственного авиационного технического... ... |
Учебное пособие «Основы современной социологии» Год издания: 2001... Григорьев С. И., Растов Ю. Е. Основы современной социологии. Учебное пособие. Барнаул: Издательство Алтайского государственного университета,... |
||
Учебное пособие (Краткий курс) Москва Издательство Российского университета дружбы народов Учебное пособие предназначено для студентов, обучающихся в магистратуре и специализирующихся по защите растений |
Учебное пособие Москва Издательство Российского Университета дружбы народов 1998 ... |
||
Учебное пособие Часть 1 Р89 Русский язык и культура речи для студентов-нефилологов. Ч. 1: учебное пособие/ Колпакова Л. В., Максименко Е. В., Михайлова О.... |
Рабочая программа размещена на сайте Университета http :// utmn ru... Н. В. Бакша, А. А. Данилюк. Корпоративная социальная ответственность: учебное пособие. Тюмень: Издательство Тюменского государственного... |
||
Учебное пособие Издание третье, исправленное и дополненное Москва... Б 17 Литературное редактирование: Учеб пособие., изд. 3 – М.: Рудн, 2010. – 249 с |
Учебное пособие. М.: Издательство Московского университета, 2004 «Вся Россия», «Моя провинция», «Новости – время местное» и др Представлены также некоторые особенности совместной работы журналистов... |
||
Учебное пособие Часть II РФ, заведующая кафедрой детских болезней лечебного факультета I московского Государственного Медицинского университета им. И. М.... |
Учебное пособие Издательство Иркутского государственного технического университета 2014 Курышова И. В. История и теория местного самоуправления : учеб пособие. – Иркутск : Изд-во Иргту, 2014. – 112 с |
||
Методические рекомендации по подготовке и защите выпускной квалификационной... Печатается по решению Ученого совета Московского государственного медико-стоматологического университета им. А. И. Евдокимова (г.... |
Бурлюкина Е. В., Васильченко Н. Г. Экономика отрасли Учебное пособие... Рецензенты: Кафедра «Экономики и управления предприятием» Московского государственного университета инженерной экологии, зав кафедрой:... |
Поиск |