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