Разница между событиями и прерываниями

Я знаю, что эта тема обсуждалась давно (ссылка: Разница между прерыванием и событием), хотя я не считаю ответ адекватным. Причина в следующем: когда говорят о событиях в сравнении с прерываниями, термин «события» означает что-то об оборудовании, а не о программном обеспечении. Более того, согласно этому объяснению, событие предсказуемо, а не то, что происходит внезапно, но в случае события пробуждения это не может быть правдой, потому что это событие не ожидается, это что-то спонтанное. Например, можно взглянуть на таблицу stm32 и заметить, что есть так называемый регистр включения события пробуждения. Это событие не связано ни с конкретным фрагментом кода, который нужно выполнить, ни с чем-то связанным с программным обеспечением.


person pauk    schedule 21.04.2021    source источник
comment
Я думаю, что исходный вопрос, заданный сегодня, был бы закрыт как вопрос мнения, так что не по теме. Ответ или, по крайней мере, ваша интерпретация, представленная здесь, безусловно, кажется неадекватной, а ИМО неверной. событие - это то, что происходит в реальном мире / среде, в которой существует система. То, как такое событие может быть обнаружено, включает, но не исключительно, прерывания. Нажатие кнопки может быть событием, событие может вызвать прерывание или, например, может быть произведен опрос.   -  person Clifford    schedule 21.04.2021
comment
Тогда почему в stm32 есть регистры включения для события ‹* wake-up ** ** ** ››, а не для прерывания пробуждения, даже если другие регистры включения предназначены для прерываний, а не для пробуждения?   -  person pauk    schedule 23.04.2021
comment
Термин «событие» имеет общее значение. Если вас беспокоит конкретный контекст, вы должны указать этот контекст в вопросе. Более того, сигнал пробуждения ни в коем случае не является прерыванием. Он пробуждает процессор, и он перезагружается, как если бы произошел сброс.   -  person Clifford    schedule 23.04.2021


Ответы (1)


События - это концепция более высокого уровня абстракции, обычно встречающаяся в системном или прикладном программировании. Они не обязательно основаны на оборудовании, но могут запускаться исключительно программным обеспечением. Единого определения этого термина нет, оно довольно широкое.

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

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

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

Но поскольку событие - это такой широкий термин, в некоторых случаях события представляют собой объекты, которые можно использовать вместе с более широкими функциями API. И тогда у них не обязательно есть функция обратного вызова - они, по сути, просто флаги. В ОС Windows, например, прикладной программист может создать событие, чтобы сигнализировать что-то запущенному потоку, после чего поток может использовать эффективную функцию сна ЦП и ждать, пока не будет получено событие. Это один из нормальных способов правильно остановить поток, позволив ему корректно завершиться самостоятельно.

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

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

person Lundin    schedule 21.04.2021
comment
They are not necessarily based on hardware, but could be purely triggered by software. Прерывания также могут быть программными. - person pauk; 23.04.2021
comment
Interrupts on the other hand are always triggered by hardware, on the lowest level. Это то, что я уже говорил. - person pauk; 23.04.2021
comment
Interrupts and hardware exceptions require the handler function to be registered in a hardware lookup table often called interrupt vector table. Есть ли другое название для так называемой «таблицы векторов прерываний» ››? - person pauk; 23.04.2021
comment
Events however use software callback functions, typically by the application passing on a function pointer upon event creation. ... But even though a driver is the lowest-level code on top of the hardware, it is still software and performing a call designed by software. Что ж, здесь я мог бы упомянуть событие пробуждения, которое не требует ни выполнения инструкций, ни вмешательства программного обеспечения. - person pauk; 23.04.2021
comment
But since "event" is such a broad term, in some cases events are objects that can be used together with broader API functions. Это события другого рода. Я говорил об аппаратных событиях. - person pauk; 23.04.2021
comment
What interrupts and events have in common is that they both lead to effective but non-deterministic execution. The program can do other things when the interrupt/event hasn't fired and it doesn't need to use polling of some flag, which is the alternative to interrupts. Я согласен с вами, поэтому очень сложно заметить разницу между этими двумя терминами. - person pauk; 23.04.2021