Обработка прерываний
В документе разъясняются принципы работы с прерываниями. Расшифровываются понятия «исключение», «прерывание», «обработчик». Приводится алгоритм обработки и требования к обработчику прерываний. Представлены примеры создания проекта с обработкой прерываний для сред 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 соответствует ссылке к отображенному адресу, но ее бит валидности выключен;