Семейство 65xx микропроцессоров, состоящее из технологии MOS 6502 и его производные, WDC 65C02, WDC 65C802 и WDC 65C816 и CSG 65CE02, все обрабатывают прерывания аналогичным образом. Имеется три сигнала аппаратного прерывания, общих для всех процессоров 65xx, и одно программное прерывание, инструкция BRK. WDC 65C816 добавляет четвертое аппаратное прерывание - ABORT, полезное для реализации архитектур виртуальной памяти - и инструкцию программного прерывания COP (также присутствующую в 65C802), предназначенную для использования в системе с сопроцессором . некоторого типа (например, процессор с плавающей запятой ).
Прерывание | Вектор (шестнадцатеричный) | |
---|---|---|
LSB | MSB | |
ABORT | FFF8 | FFF9 |
COP | FFF4 | FFF5 |
IRQ /BRK | FFFE | FFFF |
NMI | FFFA | FFFB |
RESET | FFFC | FFFD |
Все сигналы аппаратных прерываний имеют активный низкий уровень и следующие:
Обнаружение сигнала RESET заставляет процессор войти в период инициализации системы из шести тактовых циклов, после чего он устанавливает флаг отключения запроса прерывания в регистре состояния и загружает в счетчик программы значения, хранящиеся в векторе инициализации процессора ($ 00FFFC– $ 00FFFD) перед началом выполнения. При работе в основном режиме 65C816 / 65C802 переключаются обратно в режим эмуляции и остаются в нем до тех пор, пока не вернутся в основной режим под управлением программного обеспечения.
Прерывание | Вектор (шестнадцатеричный) | |
---|---|---|
LSB | MSB | |
ABORT | 00FFE8 | 00FFE9 |
BRK | 00FFE6 | 00FFE7 |
COP | 00FFE4 | 00FFE5 |
IRQ | 00FFEE | 00FFEF |
NMI | 00FFEA | 00FFEB |
RESET | Нет |
Обнаружение сигнала NMI или IRQ, а также выполнение инструкции BRK вызовет ту же общую последовательность событий, которые находятся в следующем порядке:
Поведение 65C816 при утверждении ABORT в некоторых отношениях отличается от приведенного выше описание и отдельно обсуждается ниже.
Обратите внимание, что процессор не помещает в стек аккумулятор и индексные регистры - код в обработчике прерывания должен выполнять эту задачу, а также восстанавливать регистрируется при завершении обработки прерывания по мере необходимости. Также обратите внимание, что вектор для IRQ такой же, как и для BRK во всех восьмибитных процессорах 65xx, а также в 65C802 / 65C816 при работе в режиме эмуляции. При работе в основном режиме 65C802 / 65C816 предоставляют отдельные векторы для IRQ и BRK.
Если установлен, флаг отключения запроса прерывания (бит Iв регистре состояния) будет отключить обнаружение сигнала IRQ, но не повлияет на другие прерывания (однако см. ниже в разделе инструкции WAI, реализованной в процессорах WDC CMOS). Кроме того, с 65 (c) 02 или 65C816 / 65C802, работающими в режиме эмуляции, копия регистра состояния, помещенная в стек, будет иметь установленный флаг B, если BRK (программное прерывание ) было причиной прерывания или сбрасывалось, если причиной было IRQ. Следовательно, подпрограмма обслуживания прерывания должна получить копию сохраненного регистра состояния, откуда он был помещен в стек, и проверить состояние флага B, чтобы различать IRQ и BRK. Это требование устраняется при работе 65C802 / 65C816 в основном режиме из-за отдельных векторов для двух типов прерываний.
Вход прерывания ABORTB 65C816 предназначен для обеспечения средств перенаправления выполнения программы при обнаружении аппаратного исключения, такого как отказ страницы или нарушение доступа к памяти. Следовательно, реакция процессора при подтверждении (инвертировании) входа ABORTB отличается от того, когда IRQB и / или NMIB . утверждал. Кроме того, для достижения правильной работы в ответ на ABORTB требуется, чтобы прерывание происходило в надлежащее время в течение машинного цикла, тогда как для такого требования нет. IRQB или NMIB .
Когда ABORTB утверждается во время допустимого цикла памяти, то есть когда процессор подтвердил VDA и / или выходы состояния VPA, произойдет следующая последовательность событий:
Поскольку адрес, помещенный в стек, является адресом прерванной инструкции, а не содержимым счетчика программ, выполняется RTI (ReTurn 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 регистры аккумулятора и / или индекса должны быть сохранены для обеспечения прозрачности, а затем восстановлены в качестве последних шагов перед выполнением РТИ. В случае 65C816 / 65C802 необходимо учитывать, работает ли он в режиме эмуляции или в собственном режиме во время прерывания. В последнем случае может также потребоваться сохранить регистры банка данных (DB) и прямой (нулевой) страницы (DP), чтобы гарантировать прозрачность. Кроме того, операционная система 65C816 в собственном режиме вполне может использовать другое расположение стека, чем прикладное программное обеспечение, что означает, что ISR должна будет сохранять и впоследствии восстанавливать указатель стека (SP). Еще больше усложняет ситуацию с 65C816 / 65C802 то, что размеры регистров накопителя и индекса могут составлять 8 или 16 бит при работе в основном режиме, что требует сохранения их размеров для последующего восстановления.
состояние MPU, которое сохраняется и восстанавливается в ISR, будет варьироваться в зависимости от различных версий семейства 65xx. Для процессоров NMOS (например, 6502, 6510, 8502 и т. Д.) Может быть только один метод, с помощью которого сохраняются регистры накопителя и индекса, поскольку только накопитель может быть помещен в стек и извлечен из него. Следовательно, следующий код записи ISR является типичным:
PHA; сохранить аккумулятор TXA PHA; сохранить X-регистр TYA PHA; сохранить Y-регистр CLD; Обеспечьте двоичный режим, сбросив десятичный флаг
. Команда CLD необходима, потому что, как отмечалось ранее, версии NMOS 6502 не сбрасывают флаг D (десятичный режим) в регистре состояния при возникновении прерывания.
После сохранения регистров аккумулятора и индекса ISR может использовать их по мере необходимости. Когда ISR завершит свою работу, он восстановит регистры, а затем возобновит прерванную задачу переднего плана. Опять же, следующий код NMOS является типичным:
PLA TAY; восстановить Y-регистр PLA TAX; восстановить X-регистр PLA; восстановить аккумулятор РТИ; возобновить прерванную задачу
Следствием инструкции RTI является то, что MPU вернется в десятичный режим, если это было его состояние во время прерывания.
65C02, и 65C816 / 65C802 при работе в режиме эмуляции требуют меньше кода, так как они могут перемещать и извлекать индексные регистры без использования аккумулятора в качестве посредника. Они также автоматически очищают десятичный режим перед выполнением ISR. Следующее является типичным:
PHA; сохранить аккумулятор PHX; сохранить X-регистр PHY; сохранить регистр Y
По окончании обработки ISR обратит процесс:
PLY; восстановить Y-регистр PLX; восстановить X-регистр PLA; восстановить аккумулятор РТИ; возобновить прерванную задачу
Как указывалось ранее, 65C816 / 65C802 немного сложнее при работе в собственном режиме из-за размеров переменных регистров и необходимости учета регистров DB и DP. В случае индексных регистров они могут быть переданы независимо от их размеров, так как изменение размеров автоматически устанавливает самый значимый байт (MSB) в этих регистрах на ноль, и никакие данные не будут потеряны при восстановлении переданного значения, при условии, что индексные регистры имеют тот же размер, что и при нажатии.
Аккумулятор, однако, на самом деле состоит из двух регистров: обозначенных.A и.B. Передача аккумулятора, когда он установлен на 8 бит, не сохранит.B, что может привести к потере прозрачности, если ISR каким-либо образом изменит.B. Следовательно, аккумулятор всегда должен быть установлен на 16 бит перед тем, как он будет выдвинут или извлечен, если ISR будет использовать.B. Также более эффективно установить индексные регистры на 16 бит перед их перемещением. В противном случае ISR должен затем отправить дополнительную копию регистра состояния, чтобы он мог восстановить размеры регистров до их извлечения из стека.
Для большинства ISR следующий код записи обеспечивает прозрачность:
PHB; сохранить текущий банк данных PHD; сохранить прямой указатель страницы REP #% 00110000; выбрать 16-битные регистры PHA; сохранить аккумулятор PHX; сохранить X-регистр PHY; сохранить регистр Y
В приведенном выше фрагменте кода символ %- это MOS Technology и WDC стандартный синтаксис языка ассемблера для побитовый операнд.
Если ISR имеет собственное назначенное местоположение стека, сохранение указателя стека (SP) должно происходить в памяти после того, как произошли указанные выше нажатия - должно быть очевидно, почему это так. Следующий код, добавленный к приведенной выше последовательности, будет обрабатывать это требование:
TSC; копировать указатель стека в аккумулятор STA stkptr; сохранить где-нибудь в надежной оперативной памяти LDA isrptr; получить указатель стека ISR... TCS; установить новое местоположение стека
По завершении ISR вышеуказанные процессы будут отменены следующим образом:
REP #% 00110000; выбрать 16-битные регистры TSC; сохранить ISR SP... STA isrptr; для последующего использования LDA isstkptr; получить SP... TCS задачи переднего плана; установите PLY; восстановить Y-регистр PLX; восстановить X-регистр PLA; восстановить аккумуляторную ПЛИС; восстановить прямой указатель страницы PLB; восстановить текущий банк данных РТИ; возобновить прерванную задачу
Обратите внимание, что после выполнения RTI, 65C816 / 65C802 автоматически восстановит размеры регистров до тех, которые были на момент прерывания, поскольку извлечение ранее сохраненного регистра состояния устанавливает или очищает оба бита размера регистра до какими они были во время прерывания.
Хотя можно переключить 65C816 / 65C802 из основного режима в режим эмуляции в пределах ISR, это чревато опасностями. В дополнение к принудительному использованию 8-битных регистров накопителя и индекса (что приводит к потере наиболее значимого байта в индексных регистрах), переход в режим эмуляции усечет указатель стека до 8 бит и переместит сам стек на страницу 1 RAM. В результате стек, который существовал во время прерывания, будет недоступен, если он также не находится в ОЗУ страницы 1 и не превышает 256 байт. В общем, переключение режима во время обслуживания прерывания не является рекомендуемой процедурой, но может быть необходимо в определенных операционных средах.
Как отмечалось ранее, BRK и COP являются программными прерываниями и, как таковые, могут использоваться в различных способы реализации системных функций.
Исторически BRK использовался для помощи в исправлении PROM при обнаружении ошибок в прошивке системы. Типичный метод, часто используемый во время разработки микропрограмм, заключался в том, чтобы вектор BRK указывал на незапрограммированную «область исправления» в PROM. В случае обнаружения ошибки исправление будет выполнено путем «перегорания» всех предохранителей по адресу, по которому была обнаружена неисправная инструкция, таким образом изменяя код операции на $ 00. После выполнения результирующего BRK MPU будет перенаправлен в область исправления, в которую будет записан подходящий код исправления. Часто код области исправления начинается с «прослушивания стека» для определения адреса, по которому обнаружена ошибка, что потенциально допускает наличие более одного исправления в PROM. Использование BRK для исправления PROM уменьшилось, когда стали доступны EPROM и EEPROM.
Другое использование BRK при разработке программного обеспечения - это средство отладки в сочетании с монитором машинного языка. Перезаписав код операции с помощью BRK ($ 00) и направив аппаратный вектор BRK к точке входа монитора, можно вызвать остановку программы в любой желаемой точке, позволяя монитору взять на себя управление.. В это время можно проверить память, просмотреть значения регистров процессора, код патча и т. Д. Отладку, как рекомендуют Кукес и Томпсон, можно облегчить, обильно добавив в код инструкции NOP ( код операции $ EA), который может быть заменен инструкциями BRK без изменения фактического поведения отлаживаемой программы.
Особенностью инструкций BRK и COP является то, что процессор обрабатывает либо двухбайтовую инструкцию: сам код операции, либо следующий байт, который называется «сигнатурой». После выполнения BRK или COP процессор добавит два к счетчику программы перед тем, как поместить его в стек. Следовательно, когда выполняется RTI (ReTurn from I nterrupt), прерванная программа продолжит работу по адресу, непосредственно следующему за подписью. Если BRK используется в качестве отладочного устройства, счетчик программы, возможно, придется настроить так, чтобы он указывал на подпись, чтобы выполнение продолжилось там, где ожидалось. В качестве альтернативы, NOP может быть вставлен как «заполнитель» подписи, и в этом случае корректировка счетчика программы не потребуется.
Тот факт, что BRK и COP дважды увеличивают программный счетчик, прежде чем помещать его в стек, упрощает технику обработки их как инструкций вызова супервизора, как показано на некоторые мэйнфреймы. Обычная процедура - рассматривать подпись как служебный индекс операционной системы. Операционная система BRK или обработчик COP будет извлекать значение программного счетчика, помещенного в стек, уменьшать его и читать из полученной области памяти, чтобы получить подпись. После преобразования подписи в индекс, начинающийся с нуля, можно обратиться к простой справочной таблице, чтобы загрузить в счетчик программ адрес соответствующей процедуры обслуживания. По завершении процедуры обслуживания инструкция RTI будет использоваться для возврата управления программе, которая сделала вызов операционной системы. Обратите внимание, что подпись для BRK может быть любым значением, тогда как подпись для COP должна быть ограничена диапазоном $00-$7F.
Использование BRK и / или COP для запроса службы операционной системы означает, что пользовательские приложения не должны знать адрес входа каждой функции операционной системы, а только правильный байт подписи, чтобы вызвать желаемую операцию. Следовательно, перемещение операционной системы в память не нарушит совместимость с существующими пользовательскими приложениями. Кроме того, поскольку выполнение BRK или COP всегда направляет процессор к одному и тому же адресу, можно использовать простой код для сохранения регистров в стеке перед передачей управления запрошенной службе. Однако эта модель программирования приведет к несколько более медленному выполнению по сравнению с вызовом службы как подпрограммы , в первую очередь из-за активности стека, которая происходит при любом прерывании. Кроме того, запросы на прерывание будут отключены путем выполнения BRK или COP, требуя, чтобы операционная система повторно их разрешила.
WAI (WAit for I nterrupt, opcode $ CB) - это инструкция, доступная в версиях WDC для 65C02 и 65C816 / 65C802 микропроцессоры (MPU), которые останавливают MPU и переводят его в полукататоническое состояние до тех пор, пока не произойдет какое-либо аппаратное прерывание. В основном WAI используется во встроенных системах с низким энергопотреблением, где MPU не имеет ничего общего до тех пор, пока не произойдет ожидаемое событие, требуется минимальное энергопотребление, поскольку система ожидает и требуется быстрый ответ. Типичный пример кода, который будет использовать WAI, выглядит следующим образом:
SEI; отключить IRQs WAI; дождитесь аппаратного прерывания;... выполнение здесь возобновляется
В приведенном выше фрагменте кода MPU останавливается после выполнения WAI и переходит в состояние очень низкого энергопотребления. Несмотря на то, что запросы прерывания (IRQ) были отключены до инструкции WAI, MPU будет реагировать на любое аппаратное прерывание во время ожидания. При получении прерывания MPU «проснется» за один такт и возобновит выполнение инструкции, следующей сразу за WAI. Следовательно, задержка прерывания будет очень короткой (70 наносекунд при 14 мегагерцах), что приведет к максимально быстрой реакции на внешнее событие.
В некотором смысле похожа на WAI, это инструкция STP (SToP, код операции $ DB), которая полностью отключает MPU в ожидании ввода единственного прерывания.. Когда выполняется STP, MPU останавливает свои внутренние часы (но сохраняет все данные в своих регистрах) и переходит в состояние низкого энергопотребления. MPU выводится из этого состояния, переводя его входной контакт сброса (RESB, который классифицируется как вход прерывания) на низкий уровень. Затем выполнение возобновится с адреса, хранящегося в ячейках $ 00FFFC- $ 00FFFD, вектор аппаратного сброса. Как и WAI, STP предназначен для использования во встроенных приложениях с низким энергопотреблением, где между событиями, требующими внимания MPU, могут проходить длительные периоды времени, и никакой другой обработки не требуется. STP не будет использоваться в обычном программировании, так как это приведет к полному прекращению обработки.
| journal =
()| journal =
()