Прерывания в процессорах 65xx - Interrupts in 65xx processors

Семейство микропроцессоров 65xx , состоящее из MOS Technology 6502 и ее производных, WDC 65C02 , WDC 65C802, WDC 65C816 и CSG 65CE02 , обрабатывает прерывания аналогичным образом. Есть три сигнала аппаратного прерывания, общие для всех процессоров 65xx, и одно программное прерывание , инструкция BRK . WDC 65C816 добавляет четвертое аппаратное прерывание - ABORT , полезное для реализации архитектур виртуальной памяти - и инструкцию программного прерывания COP (также присутствующую в 65C802), предназначенную для использования в системе с сопроцессором какого-либо типа (например, с плавающей запятой). процессор ).

Типы прерываний

65xx вектор прерывания мест
Прерывать Вектор (шестнадцатеричный)
LSB MSB
ПРЕРЫВАТЬ FFF8 FFF9
КС FFF4 FFF5
IRQ / BRK FFFE FFFF
НМИ FFFA FFFB
СБРОС НАСТРОЕК FFFC FFFD

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

СБРОС НАСТРОЕК
сигнал сброса , уровень срабатывает
НМИ
немаскируемое прерывание , фронт сигнал
IRQ
маскируемые прерывания , уровень срабатывает
ПРЕРЫВАТЬ
специальное немаскируемое прерывание (только 65C816, см. ниже), запускаемое по уровню

Обнаружение сигнала RESET заставляет процессор войти в период инициализации системы, равный шести тактовым циклам, после чего он устанавливает флаг отключения запроса прерывания в регистре состояния и загружает программный счетчик значениями, хранящимися в векторе инициализации процессора ( $ 00FFFC - $ 00FFFD ) перед началом выполнения. При работе в основном режиме 65C816 / 65C802 переключаются обратно в режим эмуляции и остаются в нем до тех пор, пока не вернутся в основной режим под управлением программного обеспечения.

Расположение векторов прерывания в основном режиме 65C816 / 65C802
Прерывать Вектор (шестнадцатеричный)
LSB MSB
ПРЕРЫВАТЬ 00FFE8 00FFE9
BRK 00FFE6 00FFE7
КС 00FFE4 00FFE5
IRQ 00FFEE 00FFEF
НМИ 00FFEA 00FFEB
СБРОС НАСТРОЕК Никто

Обнаружение сигнала NMI или IRQ , а также выполнение инструкции BRK вызовет ту же общую последовательность событий, которые в следующем порядке:

  1. Процессор завершает текущую инструкцию и обновляет регистры или память по мере необходимости, прежде чем ответить на прерывание.
  2. 65C816 / 65C802 при работе в собственном режиме: регистр банка программ ( PB , часть адресной шины A16-A23 ) помещается в аппаратный стек .
  3. Старший байт (MSB) программного счетчика ( PC ) помещается в стек.
  4. Младший значащий байт (LSB) программного счетчика помещается в стек.
  5. Регистр состояния ( SR ) помещается в стек.
  6. Флаг запрета прерывания устанавливается в регистре состояния.
  7. 65C816 / 65C802: в PB загружено 00 долларов .
  8. ПК загружается из соответствующего вектора (см. Таблицы).

Поведение 65C816 при заявлении ABORT в некоторых отношениях отличается от приведенного выше описания и отдельно обсуждается ниже.

Обратите внимание, что процессор не помещает регистры аккумулятора и индекса в стек - код в обработчике прерывания должен выполнять эту задачу, а также при необходимости восстанавливать регистры при завершении обработки прерывания. Также обратите внимание, что вектор для IRQ такой же, как и для BRK во всех восьмибитных процессорах 65xx, а также в 65C802 / 65C816 при работе в режиме эмуляции. При работе в основном режиме 65C802 / 65C816 предоставляют отдельные векторы для IRQ и BRK .

Когда установлено, запрос на прерывание отключить флаг ( I бит в регистре состояния) отключит обнаружение IRQ сигнала, но не будет иметь никакого влияния на любые другие прерывания (однако, см ниже раздел о WAI инструкции , реализованной в процессорах WDC CMOS) . Кроме того, с 65 (c) 02 или 65C816 / 65C802, работающими в режиме эмуляции, копия регистра состояния, помещенная в стек, будет иметь установленный флаг B, если BRK ( программное прерывание ) было причиной прерывание или сброшено, если причиной было прерывание . Следовательно, процедура обслуживания прерывания должна получить копию сохраненного регистра состояния, откуда он был помещен в стек, и проверить состояние флага B , чтобы различать IRQ и BRK . Это требование устраняется при работе 65C802 / 65C816 в основном режиме из-за отдельных векторов для двух типов прерываний.

ABORT прерывание

Вход прерывания ABORTB 65C816 предназначен для обеспечения средств перенаправления выполнения программы при обнаружении аппаратного исключения, такого как сбой страницы или нарушение доступа к памяти . Следовательно, реакция процессора при подтверждении (отрицании) входа ABORTB отличается от того, когда утверждаются IRQB и / или NMIB . Кроме того, для достижения правильной работы в ответ на ABORTB требуется, чтобы прерывание происходило в надлежащее время в течение машинного цикла , тогда как для IRQB или NMIB такого требования не существует .

Когда ABORTB утверждается во время допустимого цикла памяти, то есть когда процессор подтвердил выходные данные состояния VDA и / или VPA , произойдет следующая последовательность событий:

  1. Процессор завершает текущую инструкцию, но никоим образом не изменяет регистры или память - результаты вычислений выполненной инструкции отбрасываются. Прерывание с прерыванием не прерывает буквально выполнение инструкции.
  2. Банк программ ( PB , см. Выше) помещается в стек.
  3. Старший байт (MSB) адреса прерванной инструкции помещается в стек.
  4. Младший значащий байт (LSB) адреса прерванной инструкции помещается в стек.
  5. Регистр состояния помещается в стек.
  6. Флаг запрета прерывания устанавливается в регистре состояния.
  7. В PB загружено 00 долларов .
  8. Счетчик программы загружается из вектора ABORT (см. Таблицы).

Поскольку адрес, помещенный в стек, является адресом прерванной инструкции, а не содержимым счетчика программ, выполнение RTI ( R e T urn from I nterrupt) после прерывания ABORT приведет к тому, что процессор вернется к прерванной инструкции, скорее чем следующая инструкция, как и в случае с другими прерываниями.

Чтобы процессор правильно реагировал на прерывание, системная логика должна утверждать (отрицать) вход ABORTB, как только действительный адрес был помещен на шину и было определено, что адрес представляет собой ошибку страницы, нарушение доступа к памяти или другая аномалия (например, попытка выполнения привилегированной инструкции). Следовательно, логика не должна утверждать ABORTB, пока процессор не подтвердит сигналы VDA или VPA . Кроме того, ABORTB должен оставаться подтвержденным до падения тактового сигнала фазы два, а затем немедленно освобождаться. Если эти временные ограничения не соблюдаются, сам обработчик прерывания прерывания может быть прерван, в результате чего регистры и / или память будут изменены, возможно, неопределенным образом.

Прерывание аномалий

В NMOS 6502 и производных (например, 6510) одновременное утверждение линии аппаратного прерывания и выполнение BRK не было учтено в проекте - инструкция BRK будет проигнорирована в таком случае. Кроме того, состояние флага десятичного режима в регистре состояния процессора не изменяется после любого прерывания. Такое поведение потенциально может привести к тому, что в обработчике прерывания будет сложно обнаружить ошибку, если во время прерывания включен десятичный режим. Эти аномалии были исправлены во всех версиях CMOS процессора.

Замечания по поводу обработчика прерываний

Хорошо спроектированный и лаконичный обработчик прерывания или процедура обслуживания прерывания (ISR) не только оперативно обслужат любое событие, которое вызывает прерывание, но и будет делать это, никоим образом не мешая прерванной задаче переднего плана - ISR должна быть "прозрачной" для прерванная задача (хотя в особых случаях могут быть исключения). Это означает, что ISR должен сохранять состояние микропроцессора (MPU) и не нарушать ничего в памяти, что не должно нарушать. Кроме того, ISR должна быть полностью реентерабельной , что означает, что если два прерывания прибывают в близкой последовательности, ISR сможет возобновить обработку первого прерывания после того, как второе будет обработано. Повторный вход обычно достигается за счет использования только аппаратного стека MPU для хранения (хотя есть и другие возможные методы).

Сохранение состояния MPU означает, что ISR должна гарантировать, что все значения, которые были в регистрах MPU во время прерывания, присутствуют при завершении ISR. Часть процесса сохранения автоматически обрабатывается MPU, когда он подтверждает прерывание, так как он помещает счетчик программ (и банк программ в 65C816 / 65C802) и регистр состояния в стек перед выполнением ISR. По завершении ISR, когда выполняется инструкция RTI , MPU обратит процесс. Ни один из членов семейства 65xx не помещает в стек другие регистры.

В большинстве ISR регистры аккумулятора и / или индекса должны быть сохранены для обеспечения прозрачности, а затем восстановлены в качестве заключительных шагов перед выполнением RTI . В случае 65C816 / 65C802 необходимо учитывать, работает ли он в режиме эмуляции или в собственном режиме во время прерывания. В последнем случае может также потребоваться сохранить регистры банка данных ( DB ) и прямых (нулевых) страниц ( DP ), чтобы гарантировать прозрачность. Кроме того, операционная система в собственном режиме 65C816 может использовать другое расположение стека, чем прикладное программное обеспечение, что означает, что ISR должна будет сохранять и впоследствии восстанавливать указатель стека ( SP ). Еще больше усложняет ситуацию с 65C816 / 65C802 то, что размеры накопительных и индексных регистров могут составлять 8 или 16 бит при работе в собственном режиме, что требует сохранения их размеров для последующего восстановления.

Методы, с помощью которых сохраняется и восстанавливается состояние MPU в ISR, зависят от разных версий семейства 65xx. Для процессоров NMOS (например, 6502, 6510, 8502 и т. Д.) Может быть только один метод, с помощью которого сохраняются регистры накопителя и индекса, так как только накопитель может быть помещен в стек и извлечен из него. Поэтому следующий код входа ISR является типичным:

        PHA                     ; save accumulator
        TXA
        PHA                     ; save X-register
        TYA
        PHA                     ; save Y-register
        CLD                     ; ensure binary mode by clearing decimal flag

CLD , инструкция необходима , поскольку, как отмечался ранее, NMOS версия 6502 не очистить D флага (режим десятичного) в регистре состояния , когда происходит прерывание.

После сохранения регистров аккумулятора и индекса ISR может использовать их по мере необходимости. Когда ISR завершит свою работу, он восстановит регистры, а затем возобновит прерванную задачу переднего плана. Опять же, следующий код NMOS является типичным:

        PLA
        TAY                     ; restore Y-register
        PLA
        TAX                     ; restore X-register
        PLA                     ; restore accumulator
        RTI                     ; resume interrupted task

Следствием инструкции RTI является то, что MPU вернется в десятичный режим, если это было его состояние во время прерывания.

65C02 и 65C816 / 65C802 при работе в режиме эмуляции, требуют меньше коды, так как они могут толкать и тянуть индексные регистры без использования аккумулятора в качестве посредника. Они также автоматически очищают десятичный режим перед выполнением ISR. Следующее является типичным:

        PHA                     ; save accumulator
        PHX                     ; save X-register
        PHY                     ; save Y-register

По завершении ISR обратит процесс:

        PLY                     ; restore Y-register
        PLX                     ; restore X-register
        PLA                     ; restore accumulator
        RTI                     ; resume interrupted task

Как указывалось ранее, 65C816 / 65C802 немного сложнее при работе в собственном режиме из-за размеров переменных регистров и необходимости учета регистров DB и DP . В случае индексных регистров они могут быть переданы независимо от их размеров, поскольку изменение размеров автоматически устанавливает самый значимый байт (MSB) в этих регистрах на ноль, и никакие данные не будут потеряны при восстановлении переданного значения при условии, что индексные регистры имеют тот же размер, что и при нажатии.

Аккумулятор, однако, состоит из двух регистров: обозначенных .A и .B . Передача аккумулятора, когда он установлен на 8 бит , не сохранит .B , что может привести к потере прозрачности, если ISR каким-либо образом изменит .B . Следовательно, аккумулятор всегда должен быть установлен на 16 бит, прежде чем он будет передан или извлечен, если ISR будет использовать .B . Также более эффективно установить индексные регистры на 16 бит перед их перемещением. В противном случае ISR должен затем отправить дополнительную копию регистра состояния, чтобы он мог восстановить размеры регистров до их извлечения из стека.

Для большинства ISR следующий код обеспечивает прозрачность:

        PHB                     ; save current data bank
        PHD                     ; save direct page pointer
        REP #%00110000          ; select 16 bit registers
        PHA                     ; save accumulator
        PHX                     ; save X-register
        PHY                     ; save Y-register

В приведенном выше фрагменте кода символ % - это синтаксис стандартного языка ассемблера технологии MOS и WDC для побитового операнда .

Если ISR имеет собственное назначенное место в стеке, сохранение указателя стека ( SP ) должно происходить в памяти после того, как произошли указанные выше нажатия - должно быть очевидно, почему это так. Следующий код, добавленный к приведенной выше последовательности, справится с этим требованием:

        TSC                     ; copy stack pointer to accumulator
        STA stkptr              ; save somewhere in safe RAM
        LDA isrptr              ; get ISR's stack pointer &...
        TCS                     ; set new stack location

По завершении ISR вышеуказанные процессы будут отменены следующим образом:

        REP #%00110000          ; select 16 bit registers
        TSC                     ; save ISR's SP...
        STA isrptr              ; for subsequent use
        LDA isstkptr            ; get foreground task's SP &...
        TCS                     ; set it
        PLY                     ; restore Y-register
        PLX                     ; restore X-register
        PLA                     ; restore accumulator
        PLD                     ; restore direct page pointer
        PLB                     ; restore current data bank
        RTI                     ; resume interrupted task

Обратите внимание, что после выполнения RTI 65C816 / 65C802 автоматически восстановит размеры регистров до тех, которые были на момент прерывания, поскольку извлечение ранее сохраненных регистров состояния устанавливает или очищает оба бита размера регистра до тех, которые были во время прерывания. .

Хотя можно переключить 65C816 / 65C802 из основного режима в режим эмуляции в рамках ISR, это чревато опасностями. В дополнение к принудительному использованию 8-битных регистров аккумулятора и индекса (что приводит к потере наиболее значимого байта в индексных регистрах), переход в режим эмуляции усекает указатель стека до 8 бит и перемещает сам стек в ОЗУ страницы 1 . В результате стек, который существовал во время прерывания, будет недоступен, если он также не находится в ОЗУ страницы 1 и имеет размер не более 256 байт. В общем, переключение режима во время обслуживания прерывания не является рекомендуемой процедурой, но может быть необходимо в определенных операционных средах.

Использование BRK и COP

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

Исторически BRK использовался для помощи в исправлении PROM при обнаружении ошибок в прошивке системы . Типичный метод, часто используемый во время разработки прошивки, состоял в том, чтобы настроить вектор BRK, чтобы он указывал на незапрограммированную «область исправления» в PROM. В случае обнаружения ошибки исправление будет выполнено путем «перегорания» всех предохранителей по адресу, по которому была обнаружена ошибочная инструкция, таким образом изменяя код операции инструкции на $ 00 . После выполнения результирующего BRK MPU будет перенаправлен в область исправления, в которую будет записан подходящий код исправления. Часто код области исправления начинается с «обнюхивания стека» для определения адреса, по которому обнаружена ошибка, что потенциально допускает наличие более одного исправления в PROM. Использование БРКА для PROM Patching уменьшилось раз ППЗА и ЭСППЗ стал широко доступен.

Еще одно использование BRK в разработке программного обеспечения - это средство отладки в сочетании с монитором машинного языка . Переписывая код операции с помощью BRK ( $ 00 ) и направляя аппаратный вектор BRK к точке входа монитора, можно вызвать остановку программы в любой желаемой точке, позволяя монитору взять на себя управление. В это время можно исследовать память, просматривать значения регистров процессора, код патча и т. Д. Отладку, как рекомендуют Кукес и Томпсон, можно облегчить путем обильного добавления в код инструкций NOP (код операции $ EA ), которые можно заменить на Инструкции BRK без изменения фактического поведения отлаживаемой программы.

Особенностью инструкций BRK и COP является то, что процессор обрабатывает любую из двух байтовых инструкций: сам код операции и следующий за ним байт, который называется «сигнатурой». После выполнения BRK или COP процессор добавит два к счетчику программы, прежде чем помещать его в стек. Следовательно, когда выполняется RTI ( R e T urn from I nterrupt), прерванная программа продолжит работу по адресу, непосредственно следующему за подписью. Если BRK используется в качестве отладочного устройства, счетчик программы, возможно, придется настроить так, чтобы он указывал на подпись, чтобы выполнение продолжилось там, где ожидалось. В качестве альтернативы, NOP может быть вставлен в качестве «заполнителя» подписи, и в этом случае корректировка счетчика программы не потребуется.

Тот факт, что BRK и COP дважды увеличивают счетчик программы перед тем, как поместить его в стек, упрощает технику обработки их как команд вызова супервизора , как это есть на некоторых мэйнфреймах . Обычная процедура - рассматривать подпись как служебный индекс операционной системы. Операционная система BRK или обработчик COP извлекает значение программного счетчика, помещенного в стек, уменьшает его и считывает из полученной ячейки памяти для получения подписи. После преобразования подписи в индекс, начинающийся с нуля, можно воспользоваться простой таблицей поиска, чтобы загрузить в счетчик программы адрес соответствующей процедуры обслуживания. По завершении процедуры обслуживания инструкция RTI будет использоваться для возврата управления программе, которая сделала вызов операционной системы. Обратите внимание , что подпись для БРК может быть любое значение, в то время как подпись для КС должна быть ограничена диапазоном $ 00 - $ 7F .

Использование BRK и / или COP для запроса службы операционной системы означает, что пользовательские приложения не должны знать адрес входа каждой функции операционной системы, а только правильный байт подписи для вызова желаемой операции. Следовательно, перемещение операционной системы в память не нарушит совместимость с существующими пользовательскими приложениями. Кроме того, поскольку выполнение BRK или COP всегда направляет процессор к одному и тому же адресу, можно использовать простой код для сохранения регистров в стеке до передачи управления запрошенной службе. Однако эта модель программирования приведет к несколько более медленному выполнению по сравнению с вызовом службы как подпрограммы , в первую очередь из-за активности стека, которая происходит при любом прерывании. Кроме того, запросы прерывания будут отключены путем выполнения BRK или COP , требуя, чтобы операционная система повторно их разрешила.

Инструкции WAI и STP

WAI ( WA это для меня nterrupt, опкод CB $ ) является инструкцией доступна по версии WDC на 65C02 и 65C816 / 65C802 микропроцессоров (MPU)который останавливает MPU и помещает его в полу-недвижимое состояние до аппаратного прерывания происходит любой вид. В основном WAI используется во встроенных системах с низким энергопотреблением, где MPU не имеет ничего общего до тех пор, пока не произойдет ожидаемое событие, и требуется минимальное энергопотребление, поскольку система ожидает и / или требуется быстрый ответ. Типичный пример кода, который будет использовать WAI, выглядит следующим образом:

        SEI                     ; disable IRQs
        WAI                     ; wait for hardware interrupt
        ; ... execution resumes here

В приведенном выше фрагменте кода MPU остановится после выполнения WAI и перейдет в состояние очень низкого энергопотребления. Несмотря на то, что запросы прерывания (IRQ) были отключены до выполнения инструкции WAI , MPU будет реагировать на любое аппаратное прерывание во время ожидания. При получении прерывания MPU «проснется» за один такт и возобновит выполнение инструкции, следующей сразу за WAI . Следовательно, задержка прерывания будет очень короткой (70 наносекунд на частоте 14 мегагерц), что приведет к максимально быстрой реакции на внешнее событие.

Подобный в некоторых отношениях к WAI является STP ( ST о P , опкод $ DB ) инструкции, которая полностью закрывает MPU во время ожидания одного входа прерываний. Когда выполняется STP , MPU останавливает свои внутренние часы (но сохраняет все данные в своих регистрах) и переходит в состояние низкого энергопотребления. MPU выводится из этого состояния, переводя его входной контакт сброса ( RESB , который классифицируется как вход прерывания) в низкий уровень. Затем выполнение будет возобновлено с адреса, хранящегося в ячейках $ 00FFFC- $ 00FFFD , вектора аппаратного сброса. Как и WAI , STP предназначен для использования во встроенных приложениях с низким энергопотреблением, где между событиями, требующими внимания MPU, могут проходить длительные периоды времени, и никакой другой обработки не требуется. STP не будет использоваться в обычном программировании, так как это приведет к полному прекращению обработки.

Сноски

  1. ^ Б The ABORT вход доступен только с W65C816S.
  2. ^ a b Команда COP доступна в обоих режимах работы.
  3. ^ У 65C816 / 65C802 нет вектора прерывания в собственном режиме длясигнала RESET , так как сброс всегда возвращает процессор в режим эмуляции.
  4. ^ Значениефлага B в самом регистре состояния всегда равно 1 , независимо от типа прерывания.  B имеет значение только в копии регистра состояния, которая помещается в стек в ответ на прерывание, и фактически не существует в регистре флагов.

использованная литература

  1. ^ а б в г д Дж. С. Андерсон (1994). Микропроцессорная техника . Баттерворт-Хайнеманн. С. 143–144. ISBN 9780750618397.
  2. ^ Б с д е е г ч я J к л м п о р Q R сек т у V ш х у г аа David глазами и Рон Lichty (1992-04-28). «Программирование 65816» (PDF) . The Western Design Center, Inc. Архивировано из оригинального (PDF) 23 июля 2012 года . Проверено 29 ноября 2012 . Цитировать журнал требует |journal=( помощь )
  3. ^ а б «Базовая архитектура» . 6502 . 2002-01-02.
  4. ^ а б Лео Дж. Скэнлон (1980). 6502 Дизайн программного обеспечения . HW Sams. С.  172–173 . ISBN 9780672216565.
  5. ^ a b c Лэнс А. Левенталь (1986). 6502 Программирование на языке ассемблера . Осборн / Макгроу-Хилл. ISBN 9780078812163.
  6. ^ Рональд Дж. Токчи и Лестер П. Ласковски (1979). Микропроцессоры и микрокомпьютеры: аппаратное и программное обеспечение . Прентис-Холл. п. 379 . ISBN 9780135813225.
  7. ^ Артур Ф. Кукес и Б. Томпсон (1987). Apple II в лаборатории . UP Архив. п. 93. ISBN 9780521321983.
  8. ^ Харрод, Dennette А. (октябрь 1980). «6502 получает микропрограммируемые инструкции» . БАЙТ . Vol. 5 шт. 10. Макгроу Хилл . С. 282–285. Архивировано из оригинала на 2006-05-25 . Проверено 31 мая 2009 .
  9. ^ Ричард Р. Смардзевски (1984). Программирование микропроцессоров и приложения для ученых и инженеров . Эльзевир. п. 125 . ISBN 9780444424075.

дальнейшее чтение