Прерывания в процессорах 65xx
Семейство микропроцессоров 65xx , состоящее из MOS Technology 6502 и его производных, WDC 65C02 , WDC 65C802 и WDC 65C816 , а также CSG 65CE02 , обрабатывают прерывания одинаковым образом. Существует три сигнала аппаратного прерывания, общих для всех процессоров 65xx, и одно программное прерывание . Инструкция БРК . В WDC 65C816 добавлено четвертое аппаратное прерывание. ABORT , полезный для реализации архитектур виртуальной памяти — и Команда программного прерывания COP (также присутствует в 65C802), предназначенная для использования в системе с сопроцессором какого-либо типа (например, процессором с плавающей запятой ). [1] [2]
Типы прерываний
[ редактировать ]Прерывать | Вектор (шестнадцатеричный) | |
---|---|---|
младший бит | MSB | |
прерывание / БРК | ФФФЕ | ФФФФ |
ПЕРЕЗАГРУЗИТЬ | ФФФК | ФФФД |
НМИ | ФФФА | ФФФБ |
ПРЕРВАТЬ [номер 1] | FFF8 | ФФФ9 |
КС [номер 2] | ФФФ4 | ФФФ5 |
Все сигналы аппаратного прерывания имеют низкий уровень активности и следующие: [1]
- ПЕРЕЗАГРУЗИТЬ
- сигнал сброса , срабатывающий по уровню
- НМИ
- немаскируемое прерывание , запускаемое по фронту
- прерывание
- , маскируемое прерывание запускаемое по уровню
- ПРЕРВАТЬ
- специальное немаскируемое прерывание (только 65C816, см. ниже), запускаемое по уровню
Обнаружение Сигнал RESET заставляет процессор войти в период инициализации системы в шесть тактов, после чего он устанавливает флаг отключения запроса прерывания в регистре состояния и загружает счетчик программ значениями, хранящимися в векторе инициализации процессора ( $00FFFC – $00FFFD ) перед началом выполнения. [1] При работе в собственном режиме устройства 65C816/65C802 переключаются обратно в режим эмуляции и остаются в нем до тех пор, пока не вернутся в собственный режим под управлением программного обеспечения.
Прерывать | Вектор (шестнадцатеричный) | |
---|---|---|
младший бит | MSB | |
прерывание | 00FFEE | 00 ФЕВ |
ПЕРЕЗАГРУЗИТЬ | Никто [номер 3] | |
НМИ | 00FFEA | 00FFEB |
ПРЕРВАТЬ [номер 1] | 00FFE8 | 00FFE9 |
БРК | 00FFE6 | 00FFE7 |
КС [номер 2] | 00FFE4 | 00FFE5 |
Обнаружение НМИ или сигнал IRQ , а также выполнение Команда BRK вызовет ту же общую последовательность событий, которые по порядку: [1] [3]
- Процессор завершает текущую инструкцию и обновляет регистры или память по мере необходимости, прежде чем ответить на прерывание.
- 65C816/65C802 при работе в собственном режиме: Регистр банка программы ( ПБ , A16-A23 Часть адресной шины ) помещается в аппаратный стек .
- Самый старший байт (MSB) счетчика программ ( PC ) помещается в стек.
- Младший байт (LSB) счетчика программ помещается в стек.
- Регистр состояния ( SR ) помещается в стек.
- Флаг запрета прерываний устанавливается в регистре состояния.
- 65C816/65C802: ПБ загружен $00 .
- ПК загружается из соответствующего вектора (см. таблицы).
Поведение 65С816 при Утверждается, что ABORT в некоторых отношениях отличается от приведенного выше описания и отдельно обсуждается ниже.
Обратите внимание, что процессор не помещает аккумулятор и индексные регистры в стек — код в обработчике прерывания должен выполнить эту задачу, а также при необходимости восстановить регистры по завершении обработки прерывания. Также обратите внимание, что вектор для IRQ такой же, как и для BRK во всех восьмибитных процессорах 65xx, а также в 65C802/65C816 при работе в режиме эмуляции. При работе в собственном режиме 65C802/65C816 предоставляют отдельные векторы для прерывание и БРК . [4]
Если установлен, флаг отключения запроса на прерывание (флажок I бит в регистре состояния) отключит обнаружение IRQ , но не окажет никакого влияния на другие прерывания (однако см. раздел ниже , посвященный Инструкция WAI , реализованная в CMOS-процессорах WDC). Кроме того, если 65(c)02 или 65C816/65C802 работают в режиме эмуляции, копия регистра состояния, помещаемая в стек, будет иметь Флаг B устанавливается, если BRK ( программное прерывание ) было причиной прерывания или очищалось, если IRQ . Причиной было [номер 4] Следовательно, программа обслуживания прерываний должна получить копию сохраненного регистра состояния, откуда она была помещена в стек, и проверить состояние регистра. Флаг B , чтобы различать IRQ и БРК . [1] [2] [4] Это требование устраняется при работе 65C802/65C816 в собственном режиме благодаря раздельным векторам для двух типов прерываний. [2]
ОТМЕНИТЬ прерывание
[ редактировать ]65C816 Вход прерывания ABORTB предназначен для предоставления средств для перенаправления выполнения программы при обнаружении аппаратного исключения, такого как ошибка страницы или нарушение доступа к памяти . Отсюда и реакция процессора, когда Входной сигнал ABORTB утверждается (отрицается) отличается от того, когда IRQB и/или NMIB утверждаются. Кроме того, достижение корректной работы в ответ на ABORTB требует, чтобы прерывание происходило в нужное время в течение машинного цикла , тогда как для IRQB или НМИБ .
Когда Команда ABORTB выдается во время допустимого цикла памяти, то есть когда процессор выдает команду VDA и/или При выводе статуса VPA произойдет следующая последовательность событий: [2]
- Процессор завершает текущую инструкцию , но никак не меняет регистры или память — результаты вычислений завершенной инструкции отбрасываются. Прерывание отмены не прерывает команду в буквальном смысле. [2]
- Банк программ ( PB , см. выше) помещается в стек.
- Самый старший байт (MSB) адреса прерванной инструкции помещается в стек.
- Младший байт (LSB) адреса прерванной инструкции помещается в стек.
- Регистр состояния помещается в стек.
- Флаг запрета прерываний устанавливается в регистре состояния.
- ПБ загружен $00 .
- Счетчик программ загружается из Вектор ABORT (см. таблицы).
Поскольку в стек помещается адрес прерванной инструкции, а не содержимое счетчика программы, выполнение RTI ( возврат из ) прерывания после Прерывание ABORT заставит процессор вернуться к прерванной инструкции, а не к следующей инструкции, как это было бы в случае с другими прерываниями.
Чтобы процессор правильно отреагировал на прерывание, системная логика должна утверждать (инвертировать) Вход ABORTB , как только действительный адрес был помещен на шину и было определено, что адрес представляет собой ошибку страницы, нарушение доступа к памяти или другую аномалию (например, попытку выполнения привилегированной инструкции). Следовательно, логика не должна утверждать ABORTB до тех пор, пока процессор не подтвердит команду. VDA или ВПА Сигналы . Также, Команда ABORTB должна оставаться в состоянии до истечения тактовой частоты второй фазы, а затем быть немедленно освобождена. Если эти временные ограничения не соблюдаются, сам обработчик прерывания прерывания может быть прерван, что приведет к изменению регистров и/или памяти возможно неопределенным образом. [2]
Аномалии прерываний
[ редактировать ]В NMOS 6502 и его производных (например, 6510) одновременное установление линии аппаратного прерывания и выполнение БРК в проекте не был учтен – В таком случае инструкция BRK будет проигнорирована. Кроме того, состояние флага десятичного режима в регистре состояния процессора не изменяется после любого прерывания. будет трудно обнаружить ошибку, Такое поведение потенциально может привести к тому, что в обработчике прерывания если во время прерывания будет включен десятичный режим. Эти аномалии исправлены во всех CMOS- версиях процессора. [2]
Рекомендации по обработчику прерываний
[ редактировать ]Хорошо спроектированный и лаконичный обработчик прерываний или программа обслуживания прерываний (ISR) не только оперативно обслужит любое событие, вызывающее прерывание, но и сделает это, никоим образом не мешая прерванной задаче приоритетного плана — ISR должен быть «прозрачным» для прерванная задача (хотя в особых случаях могут применяться исключения). Это означает, что ISR должен сохранять состояние микропроцессора (MPU) и не нарушать в памяти ничего, что он не должен нарушать. Кроме того, ISR должен быть полностью реентерабельным , что означает, что если два прерывания поступают близко друг к другу, ISR сможет возобновить обработку первого прерывания после того, как второе будет обслужено. Повторный вход обычно достигается за счет использования для хранения только аппаратного стека MPU (хотя существуют и другие возможные методы).
Сохранение состояния MPU означает, что ISR должен гарантировать, что любые значения, которые были в регистрах MPU во время прерывания, будут там, когда ISR завершится. Часть процесса сохранения автоматически обрабатывается MPU, когда он подтверждает прерывание, поскольку он помещает программный счетчик (и банк программ в 65C816/65C802) и регистр состояния в стек перед выполнением ISR. По завершении ISR, когда Инструкция RTI выполнена, MPU обратит процесс вспять. Ни один из членов семейства 65xx не помещает в стек другие регистры. [2]
В большинстве ISR аккумуляторные и/или индексные регистры должны быть сохранены для обеспечения прозрачности, а затем восстановлены на последних этапах перед выполнением. РТИ . В случае 65C816/65C802 необходимо учитывать, работает ли он в режиме эмуляции или в собственном режиме во время прерывания. В последнем случае также может потребоваться сохранение банка данных ( БД ) и прямая (нулевая) страница ( DP ) регистрируется, чтобы гарантировать прозрачность. Кроме того, операционная система в собственном режиме 65C816 вполне может использовать другое местоположение стека, чем прикладное программное обеспечение, а это означает, что ISR должен будет сохранить и впоследствии восстановить указатель стека ( СП ). Еще больше усложняет ситуацию с 65C816/65C802 то, что размеры аккумуляторного и индексного регистров могут составлять 8 или 16 бит при работе в собственном режиме, что требует сохранения их размеров для последующего восстановления. [2]
Методы сохранения и восстановления состояния MPU в ISR будут различаться в зависимости от версии семейства 65xx. Для процессоров NMOS (например, 6502, 6510, 8502 и т. д.) может быть только один метод сохранения аккумулятора и индексных регистров, поскольку только аккумулятор можно загружать в стек и извлекать из него. [5] Поэтому типичным является следующий код входа ISR:
PHA ; save accumulator
TXA
PHA ; save X-register
TYA
PHA ; save Y-register
CLD ; ensure binary mode by clearing decimal flag
The Инструкция 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 вернется в десятичный режим, если это было его состояние на момент прерывания. [5]
65C02 . и 65C816/65C802 при работе в режиме эмуляции требуют меньше кода, поскольку они могут передавать и извлекать индексные регистры без использования аккумулятора в качестве посредника [2] Они также автоматически очищают десятичный режим перед выполнением ISR. [2] Типично следующее:
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 при работе в собственном режиме возникает немного больше сложностей из-за переменных размеров регистров и необходимости учета БД и Регистры ДП . В случае индексных регистров их можно загружать независимо от их размеров, поскольку при изменении размеров старший байт (MSB) в этих регистрах автоматически обнуляется, и никакие данные не будут потеряны при восстановлении помещенного значения, при условии, что индексные регистры имеют тот же размер, что и при нажатии. [2]
Однако аккумулятор на самом деле состоит из двух регистров: обозначенных .А и .Б . [2] Нажатие аккумулятора, когда он установлен на 8 бит, не сохранит .Б , [2] что может привести к потере прозрачности в случае изменения ISR .Б никак. Следовательно, аккумулятор всегда должен быть установлен на 16 бит перед его передачей или извлечением, если ISR будет использовать .Б . Также более эффективно установить индексные регистры на 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 Technology и 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 автоматически восстановит размеры регистров до тех, которые были на момент возникновения прерывания, поскольку при извлечении ранее сохраненного регистра состояния устанавливаются или очищаются оба бита размера регистра до тех значений, которые они были на момент прерывания. [2]
Хотя можно переключить 65C816/65C802 из собственного режима в режим эмуляции внутри ISR, это чревато риском. [2] В дополнение к принудительному увеличению размера аккумулятора и индексных регистров до 8 бит (что приводит к потере старшего байта в индексных регистрах), вход в режим эмуляции приведет к усечению указателя стека до 8 бит и перемещению самого стека на страницу 1 ОЗУ . [2] В результате стек, существовавший на момент прерывания, будет недоступен, если только он не находился в оперативной памяти страницы 1 и не превышал 256 байт. В общем, переключение режима во время обслуживания прерывания не является рекомендуемой процедурой, но может быть необходимо в определенных операционных средах.
С использованием БРК и КС
[ редактировать ]Как отмечалось ранее, БРК и COP являются программными прерываниями и, как таковые, могут использоваться различными способами для реализации системных функций.
Историческое использование BRK должен был помочь в исправлении PROM системы при обнаружении ошибок в прошивке . Типичный метод, часто используемый при разработке встроенного ПО, заключался в организации Вектор BRK , указывающий на незапрограммированную «область исправления» в PROM. инструкции В случае обнаружения ошибки исправление будет осуществляться путем «перегорания» всех предохранителей по адресу, где находилась ошибочная инструкция, таким образом изменяя код операции на 00 долларов . После выполнения полученного BRK , MPU будет перенаправлен в область исправления, в которую будет записан подходящий код исправления. Часто код области исправления начинался с «прослушивания стека» для определения адреса, по которому была обнаружена ошибка, что потенциально допускало наличие более одного исправления в PROM. Использование BRK для исправлений PROM уменьшился после того, как EPROM и EEPROM стали общедоступными.
Другое использование BRK в разработке программного обеспечения служит средством отладки в сочетании с монитором машинного языка . Перезаписав код операции с помощью БРК ( 00 долларов США ) и руководство Аппаратный вектор BRK к точке входа монитора позволяет остановить программу в любой желаемой точке, позволяя монитору взять управление на себя. В это время можно проверить память, просмотреть значения регистров процессора, код исправления и т. д. Отладку, как предлагают Кукс и Томпсон, можно облегчить, обильно наполняя свой код NOP (код операции Инструкции $EA ), который можно заменить на инструкции BRK без изменения фактического поведения отлаживаемой программы. [5] [6] [7]
Характеристика БРК и COP- инструкции заключаются в том, что процессор обрабатывает любую из них как двухбайтовую инструкцию: сам код операции и следующий за ним байт, который называется «подписью». [2] При исполнении БРК или COP процессор добавит два к счетчику программ, прежде чем поместить его в стек. Следовательно, когда RTI ( ReT . urn from Interrupt ) выполняется, прерванная программа продолжит работу по адресу, следующему сразу за подписью Если BRK используется в качестве устройства отладки, возможно, придется настроить счетчик программ, чтобы он указывал на сигнатуру, чтобы выполнение возобновилось там, где ожидалось. Альтернативно, NOP может быть вставлен как «заполнитель» подписи, и в этом случае корректировка счетчика программы не потребуется.
Тот факт, что БРК и COP дважды увеличивает счетчик программ перед помещением его в стек, что облегчает обработку их как инструкций вызова супервизора , как это происходит на некоторых мейнфреймах . Обычная процедура — рассматривать подпись как индекс службы операционной системы. Операционная система БРК или Обработчик COP извлекает значение счетчика программы, помещенное в стек, уменьшает его и читает из полученной области памяти, чтобы получить подпись. [8] [9] После преобразования подписи в индекс, начинающийся с нуля, можно обратиться к простой таблице поиска, чтобы загрузить в программный счетчик адрес соответствующей служебной процедуры. По завершении процедуры обслуживания Инструкция RTI будет использоваться для возврата управления программе, выполнившей вызов операционной системы. Обратите внимание, что подпись для BRK может иметь любое значение, тогда как подпись для COP должен быть ограничен диапазоном $00 - 7 франков . [2]
Использование БРК и/или COP для запроса службы операционной системы означает, что пользовательским приложениям не нужно знать адрес входа каждой функции операционной системы, а только правильный байт подписи для вызова желаемой операции. Следовательно, перемещение операционной системы в памяти не нарушит совместимости с существующими пользовательскими приложениями. Также в качестве выполнения БРК или COP всегда направляет процессор на один и тот же адрес, можно использовать простой код для сохранения регистров в стеке перед передачей управления запрошенной службе. Однако эта модель программирования приведет к несколько более медленному выполнению по сравнению с вызовом службы как подпрограммы , в первую очередь из-за активности стека, которая происходит при любом прерывании. Кроме того, запросы на прерывание будут отключены при выполнении БРК или COP , требуя, чтобы операционная система повторно включила их.
ВАИ и STP Инструкции
[ редактировать ]WAI ( WA это прерывание , код операции $CB ) — это инструкция, доступная в версии WDC микропроцессоров (MPU) 65C02 и 65C816/65C802, которая останавливает MPU и переводит его в полукататоническое состояние до тех пор, пока не произойдет какое-либо аппаратное прерывание. [2] Основное использование для WAI используется во встроенных системах с низким энергопотреблением, где MPU нечего делать до тех пор, пока не произойдет ожидаемое событие, и желательно минимальное энергопотребление, пока система ожидает, и/или требуется быстрый ответ. Типичный пример кода, в котором будет использоваться WAI выглядит следующим образом:
SEI ; disable IRQs
WAI ; wait for hardware interrupt
; ... execution resumes here
В приведенном выше фрагменте кода MPU остановится после выполнения WAI и перейдет в состояние очень низкого энергопотребления. Несмотря на то, что запросы на прерывание (IRQ) были отключены до WAI , MPU будет реагировать на любое аппаратное прерывание во время ожидания. При получении прерывания MPU «пробуждается» за один такт и возобновляет выполнение с инструкции, следующей сразу за ним. ВАИ . Следовательно, задержка прерывания будет очень короткой (70 наносекунд при частоте 14 МГц), что приведет к максимально быстрой реакции на внешнее событие.
В чем-то похож на ВАИ – это STP ( ST o P , код операции $DB ), которая полностью отключает MPU во время ожидания одного входного прерывания. [2] Когда STP выполняется, MPU останавливает свои внутренние часы (но сохраняет все данные в своих регистрах) и переходит в состояние низкого энергопотребления. MPU выводится из этого состояния, потянув за его входной контакт сброса ( RESB , который классифицируется как вход прерывания) низкий. Затем выполнение возобновится по адресу, хранящемуся в местах. $00FFFC-$00FFFD — вектор аппаратного сброса. Как и в случае с вода , STP предназначен для использования во встроенных приложениях с низким энергопотреблением, где между событиями, требующими внимания MPU, может пройти длительное время и никакой другой обработки не требуется. STP не будет использоваться в обычном программировании, поскольку это приведет к полному прекращению обработки.
Сноски
[ редактировать ]- ^ Перейти обратно: а б The Вход ABORT доступен только в модели W65C816S. [2]
- ^ Перейти обратно: а б The Инструкция COP доступна в обоих режимах работы. [2]
- ^ 65C816/65C802 не имеет вектора прерывания в собственном режиме для Сигнал RESET , поскольку сброс всегда возвращает процессор в режим эмуляции. [2]
- ^ Стоимость Флаг B в самом регистре состояния всегда 1 независимо от типа прерывания. B имеет смысл только в копии регистра состояния, которая помещается в стек в ответ на прерывание и фактически не существует в регистре флагов. [2]
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с д и Андерсон, Дж. С. (1994). Микропроцессорная техника . Баттерворт-Хайнеманн. стр. 143–144. ISBN 9780750618397 .
- ^ Перейти обратно: а б с д и ж г час я дж к л м н тот п д р с т в v В х и С аа Дэвид Айс и Рон Личти (28 апреля 1992 г.). «Программирование 65816» (PDF) . The Western Design Center, Inc. Архивировано из оригинала (PDF) 23 июля 2012 г. Проверено 29 ноября 2012 г.
- ^ Перейти обратно: а б «Базовая архитектура» . 6502 . 02 января 2002 г.
- ^ Перейти обратно: а б Лео Дж. Скэнлон (1980). 6502 Проектирование программного обеспечения . Х.В. Сэмс. стр. 172–173 . ISBN 9780672216565 .
- ^ Перейти обратно: а б с Лэнс А. Левенталь (1986). 6502 Программирование на языке ассемблера . Осборн/МакГроу-Хилл. ISBN 9780078812163 .
- ^ Рональд Дж. Точчи и Лестер П. Ласковски (1979). Микропроцессоры и микрокомпьютеры: аппаратное и программное обеспечение . Прентис-Холл. п. 379 . ISBN 9780135813225 .
- ^ Кукес, Артур Ф.; Томпсон, Б.Г. (1987). Apple II в лаборатории . Архивы УП. стр. 93 . ISBN 9780521321983 . LCCN 86-21531 .
- ^ Харрод, Деннетт А. (октябрь 1980 г.). «6502 получает микропрограммируемые инструкции» . БАЙТ . Том. 5, нет. 10. МакГроу Хилл . стр. 282–285. Архивировано из оригинала 25 мая 2006 г. Проверено 31 мая 2009 г.
- ^ Ричард Р. Смардзевски (1984). Микропроцессорное программирование и приложения для ученых и инженеров . Эльзевир. п. 125 . ISBN 9780444424075 .
Дальнейшее чтение
[ редактировать ]- Внутреннее устройство BRK/IRQ/NMI/RESET на MOS 6502
- Брэд Тейлор. «Флаг 6502 'B' и код операции BRK» .
- Ресурсы и форум по микропроцессорам семейства 6502
- 65xx Interrupt Primer – подробное обсуждение обработки прерываний семейства 65xx.
- Исследование прерываний 65C816 . Подробное обсуждение обработки прерываний, специфичной для работы в собственном режиме 65C816.