ОБРАБОТКА ИСКЛЮЧЕНИЙ

         МНОГОКРАТНЫЕ ИСКЛЮЧЕНИЯ

   Далее описан процесс обработки в случае одновременного возникновения нескольких исключений. Исключения могут быть сгруппированы по своему происхождению и приоритету. Исключения группы 0 - это сброс, сбой шины и ошибка адреса. Эти исключения приводят к прекращению выполнения текущей инструкции и началу обработки исключения в два такта синхронизации. Группу 1 представляют трассирование и прерывание, нарушение привилегий и недопустимые инструкции. Трассирование и прерывание позволяют выполнить до конца текущую инструкцию, но следующая инструкция не обрабатывается, а вызывается обработчик исключения. Инструкция с нарушением привилегий и недопустимая инструкция обнаруживаются, когда должна быть выполнена следующая инструкция. Исключения группы 2 представляют собой этап нормального выполнения инструкций. К этой группе относятся: исключения TRAP, TRAPV, CHK и деления на нуль. Для этих исключений нормальное выполнение инструкции может привести к обработке исключения.
   Исключения группы 0 имеют наивысший приоритет, тогда как группа 2 - низший. В группе 0 наиболее высокий приоритет имеет сброс, далее следует ошибка адреса, а затем сбой шины. В группе 1 трассирование имеет приоритет над всеми внешними прерываниями, которые в свою очередь приоритетны по отношению к недопустимой инструкции и нарушению привилегий. Так как в любой момент времени выполняется только одна инструкция, в группе 2 отсутствуют приоритетные отношения. Отношение приоритетов между двумя исключениями определяется тем, какие исключения имели место, и какие произошли первыми при одновременном возникновении условий для них. Таким образом, если сбой шины возникает в ходе выполнения инструкции TRAP, он имеет приоритет, и выполнение TRAP прерывается. Другой пример: если происходит запрос на прерывание в процессе выполнения инструкции при выставленном бите T, трассирование имеет приоритет и обрабатывается в первую очередь. Однако, перед возобновлением выполнения инструкции, также обрабатывается исключение-прерывание, а обработка инструкций полностью начинается в процедуре обработчика прерывания. Исключения, разбитые по группам и приоритетам, приведены в табл.6.3.
    Основное правило: чем ниже приоритет исключения, тем скорее выполняется процедура обработчика этого исключения. Например, если одновременно ожидают обработки исключения ловушки, трассирования и прерывания, первой произойдет обработка исключения для ловушки, за ним последует обработка трассирования и затем прерывания. Когда процессор продолжит выполнение инструкций, он сперва находится в обработчике прерывания, который возвратит управление обработчику трассировки, который, в свою очередь, вернет управление обработчику исключения ловушки. Это правило не распространяется на исключение сброса; оно обрабатывается первым, даже несмотря на то, что он имеет наивысший приоритет, потому что операция сброса устраняет все другие исключения.

         СТЕКОВЫЕ ФРЕЙМЫ ИСКЛЮЧЕНИЙ

   При обработке исключений наиболее непостоянная часть контекста процессора сохраняется в вершине стека супервизора. Этот контекст организован в формате, называемом стековым фреймом исключения (Exception Stack Frame). Хотя эта информация варьируется в зависимости от процессора или типа исключения, она всегда отражает содержимое регистра состояния и программный счетчик процессора, когда происходит исключение.
   Количество и тип информации, заносимой в стек, определяется типом процессора и видом исключения. Исключения группируются по типу согласно своему приоритету.
    Из исключений группы 0 только сброс не запоминает информацию в стеке. Информация, сохраняемая в стеке при исключениях сбоя шины и ошибки адреса в MC68000, MC68HC000, MC68HC001, MC68EC000 и MC68008, описана в 6.3.9.1 и показана на рис.6.7.
    Стековый фрейм исключений 1 и 2 групп для процессоров MC68000, MC68HC000, MC68HC001, MC68EC000 и MC68008 показан на рис.6.5. Сохраняется только программный счетчик и регистр состояния. Программный счетчик указывает на инструкцию, исполнение которой должно следовать за окончанием обработки исключения. Стековый фрейм исключений MC68010 показан на рис.6.6. Число слов, действительно сохраняемых в стеке, зависит от типа исключения. Если имеют место исключения группы 0 (кроме сброса), то сохраняется 29 слов, групп 1 и 2 - четыре слова. Для поддержки настраиваемых обработчиков исключений процессор помещает также смещение вектора в стековый фрейм исключения. Поле кода формата позволяет выполнить инструкцию возврата из исключения (RTE) для идентификации информации, находящейся в стеке с целью правильного восстановления. В табл.6.4 перечислены коды формата MC68010. Хотя некоторые форматы специфичны для отдельных процессоров семейства MC68000, допустим всегда формат 0000, показывающий, что присутствуют только первые четыре слова фрейма.


         ПОСЛЕДОВАТЕЛЬНОСТЬ ОБРАБОТКИ ИСКЛЮЧЕНИЯ


    На первом шаге обработки исключения создается внутренняя копия регистра состояния. После этого устанавливается бит S регистра состояния, и процессор переключается в режим супервизора. Сбрасывается бит T, обеспечивающий при трассировании беспрепятственное выполнение обработчика исключения. Также для исключений сброса и прерывания соответствующим образом обновляется маска приоритетов прерываний (interrupt priority mask).
     На втором шаге определяется номер вектора исключения. Для прерываний процессор получает номер вектора в шинном цикле, классифицируемом как цикл подтверждения прерывания. Для остальных исключений номер вектора обеспечивает внутренняя логика. Далее этот номер используется для вычисления адреса вектора исключения.
     Третий шаг необходим для сохранения регистра состояния (это не касается исключения, т.к. при нем контекст не запоминается). Текущее значение программного счетчика и сохраненная копия регистра состояния заносятся в стек с использованием SSP. Сохраненное в стеке значение программного счетчика обычно указывает на следующую невыполненную инструкцию. Однако для сбоя шины и ошибки адреса сохраненное значение непредсказуемо и может быть результатом инкремента адреса инструкции, вызвавшей ошибку. Исключения группы 1 и 2 используют короткий формат стекового фрейма исключения (для MC68010 формат 0000). Дополнительная информация, определяющая текущий контекст, сохраняется в стеке для исключений по сбою шины и ошибке адреса.     Последний шаг одинаков для всех исключений. Из вектора исключения считывается новое значение программного счетчика. Затем процессор возобновляет выполнение инструкции: инструкция выбирается по адресу, находящемуся в векторе исключения, и начинается декодирование и выполнение обычных инструкций.