Разница между ISR и вызовом функции?

Я хочу понять разницу между ISR (процедура прерывания службы) и вызовом функции.

Я чувствую, что вызов функции и ISR одинаковы с аппаратной точки зрения. Пожалуйста, поправьте меня, если я ошибаюсь. Все, что я мог найти об ISR и вызове функции, выглядит следующим образом:

ISR:

  • асинхронное событие, которое может произойти в любое время во время выполнения программа

  • сохраняет ПК, Флаги и регистры в стеке и отключает все прерывания и загружает адрес ISR

  • ISR не может иметь аргументов, которые могут быть переданы ему

  • не удается вернуть значения
  • включает прерывания
  • как правило, мало, поскольку они занимают время какого-то другого процесса
  • некоторые из ISR имеют свой собственный стек

функция:

  • происходит, когда когда-либо есть вызов функции

  • сохраняет ПК и регистрируется в стеке

  • могут быть аргументы

  • может возвращать значения

  • нет ограничений по размеру и продолжительности исполнения

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

4 ответов


они не обязательно совпадают с вашим статетом в первой точке на ISRs: прерывания асинхронны и поэтому должны каким-то образом "прерывать" работу основного процессора(ов).

например, давайте посмотрим на этот код MIPS, украшенный адресами, который не делает ничего полезного:

4000.       add , , 
4004.       sw $ra, 0($sp)
4008.       jal subr   # function call, sets $ra to 4012 and jumps to 4024
4012.       lw $ra, 0($sp)
4016.       jr $ra
4020.
4024. subr: sub , , 
4028.       jr $ra

этот код можно передать от главного процессора: арифметические операции (строки 1, 7) выполняются арифметическим блоком, доступ к памяти (строки 2, 4) - контроллер памяти и прыжки (строки 3, 5, 8) также выполняются основным процессором. (Фактический адрес jal устанавливается во время привязки объектного файла.)

это вызовы функций. В любой момент времени определяется, где код находится прямо сейчас и какой код выполняется в следующий момент времени (т. е. когда счетчик программ увеличивается: PC+=4).

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

подумайте, процессор находится в вычислении выше, но в то же время вы хотите сохранить количество ключевых ударов по адресу keys. Затем вы пишете программу, начинающуюся по адресу 0x80000180 (это определяется как адрес обработчика exeption в MIPS):

lw $at, keys
addi $at, $at, 1
sw $at, keys
eret

теперь, что происходит при нажатии клавиши?

  1. сопроцессор узнает о нажатии клавиши
  2. текущий ПК основного procesor сохраняется
  3. ПК главного процессора установлен в 0x80000180, код прерывания выполнен
  4. On eret ПК установлен на ПК основного процессора до того, как произошло прерывание
  5. исполнение главной progamm продолжается там.

здесь переключатель от нормального выполнения для того чтобы прервать регулировать между шагами 2 и 3 и назад снова от 4 до 5.

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


Итак, утверждая, что они одинаковы, вы продолжаете перечислять способы, которыми они отличаются - что, возможно, скорее отвечает на ваш вопрос.

ваши первые четыре пункта об ISR в целом и в целом верны. Пункты о включении прерываний не обязательно имеют место и являются решением о реализации программиста и могут быть определены архитектурой, а быть небольшими-это руководство, а не требование - и "маленький" полностью субъективный."

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

функция (или процедура или подпрограмма в более общем смысле) должна быть явно вызвана и является частью того же контекста и потока выполнения, что и ее вызывающий. Аппаратный ISR не вызывается явно, но скорее вызывается каким - то внешним событием (внешним по отношению к процессорному ядру, которое является периферийным устройством на чипе, может генерировать прерывания). При вызове прерывания контекст текущего потока автоматически сохраняется перед переключением контекста на ISR. На возвращение, обратное переключение контекста происходит восстановление состояния процессора до прерывания, так что выполнение продолжается с точки прерывания.

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

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

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


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

на ОС, которые поддерживают многопоточность / процессы, функция вызовы происходят в том же контексте процесса / потока, что и вызывающий. Прерывание, OTOH, не имеет контекста потока или процесса - сетевое прерывание в результате фоновой загрузки BitTorrent может произойти во время редактирования документа Word, и поэтому обработчик очень ограничен в том, что он может сделать. Он может загружать данные в / из предварительно выделенных буферов, принадлежащих процессу / потоку, к которому он привязан, он может сигнализировать семафор, он может устанавливать флаги событий ОС. Вот и все.

часто обработчик прерываний выполняет возврат прерывания напрямую, что позволяет продолжить выполнение прерванного кода без каких-либо дальнейших помех. На более простых контроллерах, таких как yopur 8051, которые часто запускают встроенный код без ОС compex, это единственный доступный курс. С упреждающей многопоточной ОС обработчик прерываний имеет дополнительную возможность выполнять его возврат прерывания через код ОС и, таким образом, вызывает запуск планировщика. Это позволяет обработчикам прерываний чтобы сделать потоки, ожидающие прерывания, готовыми и, возможно, запущенными (и, возможно, упреждающими поток, который был первоначально прерван). Это позволяет таким системам иметь хорошую производительность ввода-вывода без опроса.

аппаратные источники прерываний my be периферийные устройства, встроенные в чип процессора - сетевые контроллеры, дисковые контроллеры, контроллеры дисплея, контроллеры DMA, USB-контроллеры, контроллеры intercore-comms (на процессорах с несколькими ядрами), таймеры и т. д. или interrupt-request pin / s на пакете можно использовать для генерации прерывания от внешнего источника оборудования (возможно, кнопки, клавиатуры, клавиатуры или сенсорного экрана).


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

единственное дополнение, которое я сделал бы это. Контекст регистра, хранящийся в вызове функции, определяется соглашением о вызове процедуры для архитектуры ЦП. Это обычно означает, что вызывающий сохраняет что-то в стеке, а вызываемый сохраняет некоторые вещи и является в значительной степени статическим набором. Исключение: IA64 с динамическим окном сохранения/восстановления регистра.

в ISR единственным сохраненным контекстом регистра является то, что будет использоваться в ISR. Если используется один регистр, сохраняется/восстанавливается только этот регистр.

на большинстве процессоров набор регистров, сохраненный/восстановленный в вызове функции, намного больше, чем те, которые сохранены / восстановлены в ISR из-за статического характера соглашений о вызове процедур.