Уважаемые программисты-ардуинщики и прочие "атмеговцы"! Извините если вдруг не совсем в тему чата, вроде тематика не исключает. Есть 2 принципиальных вопроса по обработке аппаратных прерываний. Допустим, по входу разрешено прерывание, но не по фронту а по уровню, например по низкому. Пришел низкий уровень, пошла процедура обработчика прерываний. Вопрос 1. Процедура обработчика выполнена до конца, но уровень на входе всё ещё низкий, прерывание всё ещё активно. Процедура-обработчик будет выполняться в "бесконечном цикле" снова и снова пока уровень не станет высоким и прерывание не дезактивируется? Или закончит свою работу, вернется к основному коду, и будет ждать пока прерывание сбросится и потом снова станет активным по низкому уровню? Вопрос 2. Обратная ситуёвина. Активировалось прерывание, выполняется процедура обработки. Но до ее окончания уровень по входу стал высокий, прерывание дезактивировалось. Обработчик прервётся прямо на текущем месте кода и вернётся к основной программе? Или выполнится до конца и уже только потом уйдёт в основной код? В "научно-популярной" литературе как то не нашел этих ответов, если только лезть в спец даташиты и переводить с разных иноземных языков... и то не факт.

Комментарии: 28

  1. Andrey

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

    • Humka

      Даташит нужно читать, а это лень

  2. Fait

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

    • Vlad

      Спасибо, на первый вопрос понятно. А на счет "вылета" из обработчика? Блин, я думал только у радиоюбителей (особенно не знакомых между собой) такая тенденция есть, "подсказать могу но ты пойди и почитай лучше, а что почитать - найди в интернете...". 20 лет назад программеры не такие были и кодом делились, и решениями Это не в обиду никому

      • Danil

        Если выставлено прерывание по уровню, низкому например, то при разрешении этого прерывания и низком уровне на пине оно будет вызвано сразу, если по спаду, то только при смене высокого уровня на на низкий. А вот будет ли прерывание по уровню возводиться снова, после сброса флага в обработчике - это в ДШ

        • Serjio

          Наверное потому что в голове вертится, что прерывание вызывается событием. А тут- какое же оно событие?

        • Vlad

          ПО сути, прерывание (событие) наступило, обработка прошла и пусть даже флаг сбросился. Обработчик выполнился, прошел возврат в основной код а событие то опять есть! По идее опять должен выполняться обработчик, и так далее. Но логика процессора не всегда == человческой

          • Serjio

            Можно же в обработчике и запретить

      • Sanchez

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

        • Serjio

          А. В смысле не ждать события, а при разрешении прерывания - происходит вызов. Вот оно, правильное объяснение кмк.

        • Dmitriy

          "Сто лет"... Если бы

          • Sanchez

            Да, утрирую уж. Самому иногда проще купить ардуину в чипидипсе и по быстрому что-нить оттестить. Главное помнить что штатный бутлоадер ардауины не сбрасывает собаку, лол

      • Danil

        "вылет" из текущего обработчика прерывания может быть только в обработчик с более высоким приоритетом, и всё равно потом вернётся обратно. В атмегах этот режим ещё и включить нужно (nested interrupt) - емнип по умолчанию оно выключено

        • Vlad

          Мне именно надо знать, если прерывание дезактивировалось до конца обработчика, он сразу прервется или выполнится до последней строчки кода?

          • Danil

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

      • Fait

        Если активно несколько прерываний тут уже вопросы как выставляется приоритет прерываний и как реализована очерёдность. Давно не работал с AVR-ками, не помню, при обработке прерывания и появлении нового ядро перескочит сразу на новое или же закончит выполнение кода текущего прерывания и возьмётся за новое.

        • Serjio

          Не помню, есть ли там такое же, но только по высокому уровню

          • Vlad

            вопрос не про два прерывания, а про одно

            • Fait

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

              • Danil

                ДШ и вражеский язык ваши друзья навек ))

            • Saw

              какой чип?

              • Vlad

                Резюмирую. 1. Пока прерывание активно, обработчик будет выполняться в цикле. 2. После старта обработчика он в любом случае выполняется до конца, даже если прерывание стало не активно или запрещено уже на первых строчках кода обработчика. Тогда вот что еще. Тут говорили про приоритет прерываний. Но если я правильно понял из даташитов на атмеги, (в частности на 328), то там нет "вложенности" прерываний. То есть когда выполняется один обработчик, то другие прерывания игнорируются. Вернее не игнорируются а в режиме "ожидания". И если были то будут обрабатываться после окончания обработчика первого. Это так? Речь об АППАРАТНЫХ прерываниях.

                • Sanchez

                  2) будет выполняться до команды reti, независимо от причины.

                  • Vlad

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

                • Saw

                  1. смотря какой чип. У некоторых чипов можно отключить цифровой буфер и тогда, вход семплироваться не будет. прерывание сработает лишь 1 раз при неизменности состояния. А вырубаем в управлении пином: PORTА.PIN1CTRL |= 0x4; Прерывание сработает при низком уровне и больше не будет срабатывать. Все зависит от чипа и надо смотреть в даташит. странно, немаскируемые прерывания имеют высокий приоритет и будут обрабатываться всегда, типа NMI0 и NMI1. А вообще, проще по перепаду уровня делать, как-то проще.

  3. Ilya

    Насколько я помню, в атмегах прерывания по переднему фронту, заднему, и по ИЗМЕНЕНИЮ уровня (прерывание по переднему и заднему фронту). При входе в обработчик прерывания автоматически устанавливается флаг запрета прерываний, сбрасывается либо cli, либо reti. Если внутри прерывания произошло ещё одно, то переход в него будет после сброса флага запрета. Если прилетели 2 прерывания, то первым выполнится то, у которого меньше адрес. Флаги прерываний можно устанавливать и сбрасывать программно: если установить какой-нибудь, то произойдет прерывание (если флаг запрета не установлен конечно), если сбросить пока установлен флаг запрета, то после снятия флага переход не произойдёт. Все сказанное относится к МК серии atmega.

  4. Anonim

    1. Будет выполнятся, пока высокий уровень не появится 2. дойдет до конца и выйдет из прерывания https://t.me/ru_electronics_feed/205

Не нашли ответ?

Вам также может быть интересно