Я говорю о вещах на уровне ядра.
Насколько я понимаю, ядро контроллера просто выполняет инструкции, которые извлекаются из памяти (Fetch - Decode - Execute). Когда приходит прерывание, как ядро / ALU решает перейти на ISR?
Поскольку мы или компилятор не добавляем никаких инструкций для опроса статуса прерывания - тогда как он узнает, что прерывание должно быть обработано?
источник
CALL
инструкция, так как прерывания прекращается по-другому (смRET
противRETI
).Обычно в современных микроконтроллерах есть выделенный блок контроллера прерываний (IC), который отвечает за управление прерываниями. Кроме того , каждый периферийный компонент имеет прерывания выход (ы) , который собирается из
0
к1
(или наоборот) , если какое - то условие применяется (например , это периферического завершил определенную работу). Этот выход подключен к контроллеру прерываний.Core
CPU может сказать IC либо игнорировать это конкретное прерывание (маскировать его) или уведомить MCU всякий раз , когда это происходит, вызывая специфические сигналы, а затем MCU решает , что делать с ним. Обычный способ - иметь IC, чтобы сообщить MCU, какое прерывание произошло, и перейти к соответствующему коду обработки.источник
В ядре компьютера имеется аппаратное обеспечение, которое запихивает новое значение в программный счетчик, соответствующее конкретному прерыванию, которое было запущено. Чтобы запомнить, куда возвращаться после завершения процедуры прерывания, текущее значение в программном счетчике помещается в стек до того, как аппаратное обеспечение запирает адрес прерывания в программном счетчике. Когда процедура прерывания завершена, исходное значение счетчика программы восстанавливается обратно из стека.
Значения, которые необходимо вставить в программный счетчик во время прерывания, обычно определяются по одной из двух схем. Один из подходов запирает фиксированный адрес для каждого типа прерывания в счетчике программы, и затем ядро компьютера начинает выполнение из этого фиксированного местоположения. Пространство в фиксированном местоположении часто ограничено по размеру, поэтому обычно кодируют инструкцию перехода по фиксированным адресам, которые переходят в фактическое местоположение службы прерывания. Другая схема использует то, что называется таблицей векторов прерываний. Здесь аппаратное обеспечение генерирует фиксированное смещение адреса в векторную таблицу на основе типа прерывания. Аппаратное обеспечение затем извлекает содержимое в этом месте таблицы и использует это значение в качестве адреса, чтобы вставить его в счетчик программ.
источник
Контроллер имеет регистр для счетчика программ, который отслеживает адрес, по которому хранится следующая для исполнения инструкция. (Этот регистр также записывается при выполнении прыжка.)
Контроллер имеет вектор прерывания (или иногда более одного, в зависимости от типа прерывания), который является адресом, где хранится ISR. Этот адрес всегда один и тот же - это как вектор сброса, с которого начинается программа.
(Часто в этом векторе хранится инструкция перехода, которая переходит к фактическому коду для выполнения, поскольку места в векторе недостаточно для хранения всей процедуры. Однако важно то, что ISR всегда находится в одном и том же месте. позиция.)
Когда происходит прерывание, в контроллере есть специальное оборудование, которое записывает счетчик программ с вектором прерывания. Затем, когда контроллер достигает следующего цикла инструкций, он выбирает команду с адреса, на который указывает программный счетчик (то есть вектор прерывания).
(В одном цикле команд контроллера есть разные задачи, которые он выполняет: он выбирает следующую инструкцию с адреса, на который указывает счетчик программы; он увеличивает счетчик программы; он декодирует инструкцию и выполняет ее.)
источник