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