Как контроллер узнает, когда перейти к ISR?


12

Я говорю о вещах на уровне ядра.

Насколько я понимаю, ядро ​​контроллера просто выполняет инструкции, которые извлекаются из памяти (Fetch - Decode - Execute). Когда приходит прерывание, как ядро ​​/ ALU решает перейти на ISR?

Поскольку мы или компилятор не добавляем никаких инструкций для опроса статуса прерывания - тогда как он узнает, что прерывание должно быть обработано?

Ответы:


13

Что вам не хватает, так это то, что ядро делает больше, чем просто выполняет коды операций, извлекаемые из памяти. В нем есть особая логика для реализации прерываний.

Когда аппаратное обеспечение обнаружения прерываний выдает сигнал о том, что пришло время сделать прерывание, обычно в ядро ​​вставляется специальная инструкция, которая никогда не извлекалась из памяти. В большинстве случаев это инструкция CALL для адреса вектора прерывания. При этом используется существующий механизм выполнения команд, чтобы сохранить текущий ПК в стеке вызовов и изменить его на адрес вектора прерывания. Это также касается отказа от предварительно извлеченных инструкций и тому подобного.

Специальная логика получения прерываний также должна блокировать прерывания таким образом, чтобы такое же условие прерывания не вызывало очередной вызов адреса вектора прерывания в следующем цикле. Разные процессоры имеют разные способы справиться с этим. Самое простое - просто отключить прерывания, требуя от программного обеспечения их повторного включения в конце процедуры обработки прерываний. Другие процессоры имеют уровень приоритета прерывания. Этот уровень повышен, так что только условия прерывания с более высоким приоритетом могут вызвать новое прерывание. Приоритет прерывания - это то, что автоматически сохраняется вместе с обратным адресом CALL и восстанавливается, когда код возвращается из прерывания.


1
Часто, это не обычная CALLинструкция, так как прерывания прекращается по-другому (см RETпротив RETI).
glglgl

1
Могу ли я с уверенностью предположить, что когда аппаратное обеспечение обнаружения прерываний подает сигнал, вместо памяти ЦП получает инструкцию откуда-то еще прыгать ... Как, например, переключатель ... Когда переключатель выключен, извлекает инструкцию из памяти и когда переключатель включен Выполнить эту инструкцию?
Swanand

3

Обычно в современных микроконтроллерах есть выделенный блок контроллера прерываний (IC), который отвечает за управление прерываниями. Кроме того , каждый периферийный компонент имеет прерывания выход (ы) , который собирается из 0к 1(или наоборот) , если какое - то условие применяется (например , это периферического завершил определенную работу). Этот выход подключен к контроллеру прерываний. CoreCPU может сказать IC либо игнорировать это конкретное прерывание (маскировать его) или уведомить MCU всякий раз , когда это происходит, вызывая специфические сигналы, а затем MCU решает , что делать с ним. Обычный способ - иметь IC, чтобы сообщить MCU, какое прерывание произошло, и перейти к соответствующему коду обработки.


2

В ядре компьютера имеется аппаратное обеспечение, которое запихивает новое значение в программный счетчик, соответствующее конкретному прерыванию, которое было запущено. Чтобы запомнить, куда возвращаться после завершения процедуры прерывания, текущее значение в программном счетчике помещается в стек до того, как аппаратное обеспечение запирает адрес прерывания в программном счетчике. Когда процедура прерывания завершена, исходное значение счетчика программы восстанавливается обратно из стека.

Значения, которые необходимо вставить в программный счетчик во время прерывания, обычно определяются по одной из двух схем. Один из подходов запирает фиксированный адрес для каждого типа прерывания в счетчике программы, и затем ядро ​​компьютера начинает выполнение из этого фиксированного местоположения. Пространство в фиксированном местоположении часто ограничено по размеру, поэтому обычно кодируют инструкцию перехода по фиксированным адресам, которые переходят в фактическое местоположение службы прерывания. Другая схема использует то, что называется таблицей векторов прерываний. Здесь аппаратное обеспечение генерирует фиксированное смещение адреса в векторную таблицу на основе типа прерывания. Аппаратное обеспечение затем извлекает содержимое в этом месте таблицы и использует это значение в качестве адреса, чтобы вставить его в счетчик программ.


2

Контроллер имеет регистр для счетчика программ, который отслеживает адрес, по которому хранится следующая для исполнения инструкция. (Этот регистр также записывается при выполнении прыжка.)

Контроллер имеет вектор прерывания (или иногда более одного, в зависимости от типа прерывания), который является адресом, где хранится ISR. Этот адрес всегда один и тот же - это как вектор сброса, с которого начинается программа.

(Часто в этом векторе хранится инструкция перехода, которая переходит к фактическому коду для выполнения, поскольку места в векторе недостаточно для хранения всей процедуры. Однако важно то, что ISR всегда находится в одном и том же месте. позиция.)

Когда происходит прерывание, в контроллере есть специальное оборудование, которое записывает счетчик программ с вектором прерывания. Затем, когда контроллер достигает следующего цикла инструкций, он выбирает команду с адреса, на который указывает программный счетчик (то есть вектор прерывания).

(В одном цикле команд контроллера есть разные задачи, которые он выполняет: он выбирает следующую инструкцию с адреса, на который указывает счетчик программы; он увеличивает счетчик программы; он декодирует инструкцию и выполняет ее.)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.