2015-03-05 9 views
2

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

first instruction; 
interrupt event here; 
go inside the ISR; 
exit ISR; 
second instruction; 

ИЛИ

first instruction; 
interrupt event here; 
go inside the ISR 
exit ISR; 
first instruction; 

Я имею в виду, делает точки ПК инструкции, выполняемой до входа ISR, или он переходит к следующей инструкции (после возврата из ISR)? Надеюсь, у вас есть идея.

+3

Что это связано с C? – OldProgrammer

+0

CPU вытолкнет адрес возврата следующей команды, которая должна быть выполнена после вызова функции. Или, если вы: нажимаете счетчик программ и увеличиваете его на одну команду. – Lundin

+0

Это в значительной степени зависит от конкретного прерывания/исключения. Например: прерывание trap/syscall/программного обеспечения, очевидно, будет указывать адрес следующей инструкции, но исключение ошибки страницы/исключение TLB будет толкать адрес инструкции о нарушении, чтобы его можно было повторить. – ninjalj

ответ

3

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

Поэтому, возвращаясь из процедуры прерывания, ПК будет указывать на инструкцию после первого.

first instruction fetch (PC is updated meanwhile) 
first instruction decode 
interrupt is raised 
first instruction execution 
** now and only now the CPU checks for a possible interrupt ** 
interrupt is present, pushing PC on stack and other things 
jump to interrupt address 
execution of interrupt 
return from interrupt (pop of PC and other things) 
second instruction fetch 
... 
1

Точное поведение прерываний конкретного оборудования, но процессор будет просто ждать, пока first_instruction не будет закончена. После этого он переместит состояние процессора в стек (или сохранит его другим способом) и запустит ISR. Это означает, что ваш ISR не будет выполнен немедленно - есть небольшая задержка, которая может стать проблемой в жестких приложениях реального времени.

2

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

  • Приостанавливает выполнение выполняемой программы и сохраняет ее контекст. Это означает, что он сохраняет адрес следующей команды, которая должна быть выполнена, то есть значение счетчика программ и других соответствующих данных.

  • Обновить счетчик программ с начальным адресом этой процедуры обработки прерываний.

Когда процедура обработчика прерываний завершена, CPU может возобновить выполнение программы в точке прерывания.

enter image description here

прерывание произошло в инструкции i и после того, как программа пользователя завершения возобновляет выполнение из i+1 инструкции.

+0

Обратите внимание, что иногда следующая инструкция представляет собой одну и ту же инструкцию (но с разными значениями регистра), например последовательность | rep movsb | , – rcgldr

0

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

Как это обрабатывается процессором?

Очень похоже на исключение в Java. В этом случае запрос прерывания немедленно обрабатывается (текущая i-я команда не завершена). Текущее значение ПК (указывающее адрес i + 1-й инструкции) сохраняется в определенном месте. Прерывание обрабатывается и после прерывания обслуживания возвращается для исполняющей программы деления для завершения i + 1-й инструкции и остальной части инструкций.

b) Аппаратное прерывание - процессор запускает программу, когда какой-либо вход поступает с клавиатуры (например) или на другое оборудование.

Как это обрабатывается процессором?

В этом случае центральный процессор не выполняет немедленный запрос прерывания. Затем он прослушивает это прерывание, завершает его, а затем возвращается к старой программе i + 1.

Смежные вопросы