Как бы ISR узнал, какой контакт вызывает прерывание? - PullRequest
0 голосов
/ 05 декабря 2018

Прерывания могут быть разрешены для определенного контакта (ов) на цифровом порту ввода / вывода, верно?Как ISR определит, какой вывод вызвал прерывание?

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

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

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

Для порта GPIO вы обычно активируете только те контакты, которые интересны для генерации прерывания.Если вы можете организовать только один вывод порта для генерации прерывания, задание выполнено, ваш обработчик для этого порта может выполнить работу, безопасно зная, что он будет вызываться только тогда, когда правильный выводactive.

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

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

0 голосов
/ 05 декабря 2018

Как другие люди предположили в комментариях, это может зависеть от MCU, но для ARM (ядро MSP432) обычно ответ - он не знает, он ищет его.ARM имеет vectored interrupt system, что означает, что каждый источник имеет свой собственный вектор прерывания, поэтому CPU может легко определить, какой источник запускает прерывание.пока все хорошо.
, но тогда случается, что устройство может инициировать несколько прерываний, например, GPIO, как вы сказали, в этом случае ЦП знает, что на каком порте сработало прерывание, поэтому он генерирует ISR, но затем этоISR ответственность опрашивать регистры устройства для определения точного источника прерываний, многие из этих периферийных устройств имеют несколько прерываний, таймеры, DMA, и это лишь некоторые из них.
Именно поэтому обычно периферийные устройства имеют бит разрешения прерываний,позволяет им запускать прерывания, но у них также есть битовые маски, которые контролируют, что именно может инициировать это внутреннее прерывание,
Также посмотрите на эту ссылку для примера в действии, особенно на их ISR, которыеделает точно так же, как описано выше

...