Обработка прерываний
В документе разъясняются принципы работы с прерываниями. Расшифровываются понятия «исключение», «прерывание», «обработчик». Приводится алгоритм обработки и требования к обработчику прерываний. Представлены примеры создания проекта с обработкой прерываний для сред MCStudio 3M и MCStudio 4. В настоящем документе описание дано на примере процессора 1892ВМ10Я. Документ применим ко всем MIPS32-совместимым процессорам серии «Мультикор» (1892ВМ2Я, 1892ВМ3Т, 1892ВМ5Я, 1892ВМ7Я, 1892ВМ10Я, 1892ВМ12AT, 1892ВМ15АФ).
Основные понятия при работе с прерываниями
Исключение
В архитектуре MIPS понятие «исключение» (англ. exception) покрывает все виды событий, при которых CPU может прервать поток исполнения основной программы и вызвать программу-обработчик. Например, переполнение в арифметической команде. Исключения обрабатываются единым механизмом, который рассмотрен ниже в настоящем документе. По событию исключения аппаратно CPU ничего не сохраняет в стек, не записывает в память, не сохраняет регистров. Если эти действия необходимы, они должны выполняться программно в обработчике. Ниже перечислены все возможные исключения применительно к процессору 1892ВМ10Я по убыванию приоритета обработки.
Аппаратный сброс Reset
Аппаратный сброс — это событие, которое происходит при установке внешнего сигнала nRST. Когда оно возникает, процессор выполняет полную начальную инициализацию, то есть приводит автоматы к начальному состоянию и переводит процессор в состояние, из которого он может начать запуск команд, находящихся в некэшируемой и неотображаемой области. После возникновения исключения аппаратного сброса состояние процессора не определено, за исключением следующего:
- регистр CP0.Random устанавливается в значение, равное количеству строк TLB - 1;
- регистр CP0.Wired устанавливается в 0;
- регистр CP0.Config устанавливается в свое начальное состояние (boot state);
- поля BEV, TS, NMI и ERL регистра CP0.Status устанавливаются в заданные значения;
- в PC загружается значение 0xBFC0_0000 (виртуальный адрес);
Устанавливаются следующие значение регистра CP0.Status:
RP <= 0
BEV <= 1
TS <= 0
NMI <= 0
ERL <= 1
Немаскируемое прерывание NMI
Немаскируемое прерывание (nonmaskable interrupt, NMI) возникает по положительному фронту входного сигнала NMI или при срабатывании сторожевого таймера WDT. Оно не вызывает сброса или другую переинициализацию аппаратных средств. Состояние кэш, памяти, а также другие состояния процессора остаются неизменными. Значения регистров также сохраняются за исключением следующего:
- поля BEV, TS, NMI и ERL регистра CP0.Status принимают заданные значения;
- в регистр CP0.ErrorEPC загружается значение PC - 4, если прерывание произошло на фоне команды в слоте задержки перехода. В противном случае в регистр CP0.ErrorEPC загружается значение PC;
- в PC загружается значение 0xBFC0_0000.
Устанавливаются следующие значение регистра CP0.Status:
BEV <= 1
TS <= 0
NMI <= 1
ERL <= 1
Отладка программы, исполняющейся из параллельной флеш-памяти
В свете вышесказанного, отладка, в сущности, необходима только загрузчику. Основная программа отлаживается еще до того, как начинается работа с флеш. Тем не менее, некоторые особенности стоит отметить.
Отладка программы, записанной в параллельную флеш, практически не отличается от отладки программы, находящейся в ОЗУ. Если говорить об отладке с помощью MDB — фактически, после исполнения команды reset, уже началась отладка программы. В среде разработки MCStudio необходимо установить флаг «Don’t load the project», так как к моменту старта отладки программа уже в памяти, и удалить настройки «Startup registers», чтобы достоверно воспроизвести режим загрузки устройства после ресета.
Кроме того, при работе в MCStudio необходимо использовать только аппаратные точки останова, так как программная точка останова — это замена инструкции в памяти инструкцией BREAK. Поскольку такая запись в энергонезависимую память невозможна — программные точки останова работать не будут.
Исключения TLB
В этом пункте перечислены все возможные исключения, возникающие при работе с буфером асcоциативной трансляции (translation lookaside buffer, TLB).
Промах буфера ассоциативной трансляции TLB_Ri
Исключение TLB Refill происходит во время выборки команды или доступа к данным, если в TLB нет ни одной строки, соответствующей ссылке к отображенному адресному пространству, и бит EXL в регистре CP0. Status равен 0.
Процессор может хранить несколько последних записей, прочитанных из таблицы страниц в небольшой кэш- памяти, называемой буфером ассоциативной трансляции (TLB). Процессор «заглядывает» в TLB в поисках информации о трансляции прежде чем обратиться к таблице страниц в физической памяти. В реальных программах большинство обращений находят в TLB нужную информацию (в этом случае говорят, что произошло попадание в TLB).
TLB_Ii
Исключение TLB Invalid происходит во время выборки команды или доступа к данным в одном из следующих случаев:
- в TLB нет ни одной строки, соответствующей ссылке к отображенному адресному пространству, и бит EXL в регистре CP0.Status равен 1;
- cтрока TLB соответствует ссылке к отображенному адресу, но ее бит валидности выключен;
Промах TLB при загрузке данных TLB_Rd
Исключение (TLB miss) возникает, когда при обращении к TLB в ней нет соответствующего адреса.
Попадание в инвалидную страницу TLB (V=0) при загрузке данных TLB_Idd
Исключение (TLB invalid exception) возникает, когда адрес найден, но он недействителен.
Исключение сохранения в запрещенной области TLB_M
Это исключение (TLB Modified Exception) возникает при обращении по записи данных к отображенному адресу, если выполняется следующее условие: найденная строка TLB действительна, но страница запрещена для записи.
Исключение по ошибке адресации во вре мя доступа к команде или данным AdELi
Исключение AdELi (Address Error Exception — Instruction Fetch/Data Access) возникает при попытке выполнить одно из следующих действий:
- выбрать команду, загрузить или сохранить слово данных, если они не выровнены в границах слова;
- загрузить или сохранить половину слова, если оно не выровнено в границах полуслова;
- обратиться по адресу пространства Kernel при работе в режиме User.
Исключение по аппаратному контролю Mcheck
Данное исключение возникает, если при выполнении команды записи в TLB (TLBWI или TLBWR) обнаруживается, что поле виртуального адреса записываемой строки соответствует такому же полю одной из строк, уже хранящихся в TLB.
Исключения исполнения
В архитектуре процессора серии «Мультикор» существует 6 исключений исполнения. Они обладают одинаковым приоритетом и имеют целью быть легко узнаваемыми в процессе создания ПО в безопасном режиме (системные вызовы, условные ловушки и точки останова).
Cистемный вызов System Call
Исключение System Call возникает при исполнении команды SYSCALL.
Останов в контрольной точке Breakpoint
Исключение Breakpoint возникает при исполнении команды BREAK.
Недоступность процессора CpU
Исключение недоступности сопроцессора (Coprocessor Unusable) вызывается при попытке исполнения команды сопроцессора CP0 в режиме User, или в случае, если происходит обращение к другому сопроцессору, доступ к которому запрещен битами CU[3:1] регистра CP0.Status.
Зарезервированная команда RI
Исключение зарезервированной команды (Reserved Instruction). вызывается при исполнении команды с неопределенным старшим кодом операции (major opcode) или полем функции.
Целочисленное переполнение (Ov)
Исключение целочисленного переполнения (Integer Overflow) вызывается, когда выбранные целочисленные команды приводят к переполнению в двоичном коде.
Trap
Исключение Trap вызывается, если условие команды trap истинно (TRUE).
Ошибка выравнивания адреса при загрузке данных AdELd
Ссылка на адрес режима Kernel при работе в режиме User при загрузке данных.
Ошибка выравнивания адреса при сохранении данных AdES
Попытка сохранения по адресу Kernel в режиме User.
Исключение прерывания (Interrupt Exception)
Об этом виде исключений — в разделе "Прерывания".
Прерывание
Прерывание (interrupt exception) — это разновидность исключения. Особенность прерываний в том, что они возникают вне CPU и используются для привлечения внимания CPU к какому-то внешнему событию. У программиста есть возможность заблокировать (замаскировать) возникновение прерывания от периферийного устройства, если это необходимо. Все остальные исключения замаскировать нельзя — они происходят в случае соответствующих событий.
Обработчик
Обработчик исключений — это код, являющийся, как правило, частью операционной системы, который выясняет причину возникновения исключения и реагирует соответствующим образом (например, чтением клавиатуры в ответ на прерывание). Затем управление возвращается программе, выполнявшейся до возникновения исключения.
Обработчик должен быть размещен по адресу вектора соответствующего исключения.
Когда возникает исключение, процессор всегда переходит по этому адресу. Допустимые адреса векторов исключений указаны в соответствующих разделах руководства пользователя на конкретную м икросхему. Часто по вектору обработчика размещают минимальный обработчик, который выполняет только сохранение контекста и переход на основную функцию, которая располагается в отличных от вектора областях.
Вектор исключения
Вектор исключения — это адрес, c которого стартует процессор при обработке исключений. По этому адресу должен быть размещен обработчик исключения. В руководстве пользователя на процессор имеются таблицы, позволяющие определить вектор для каждого вида прерывания. Значения этого адреса зависят от битов BEV, EXL, IV регистра CP0.Status и состояния бита TR_CRAM системного регистра CSR. Векторы исключений аппаратного сброса и NMI всегда находятся по адресу 0xBFC_0000. Обработчик прерывания от периферийного устройства может быть расположен по адресам 0x8000_0180, 0xBFC0_0380, 0xB800_0180.