Большое кол-во прерываний, чего опасаться?

Тема в разделе "Микроконтроллеры AVR", создана пользователем Alex19, 24 июн 2015.

  1. Alex19

    Alex19 Гуру

    День добрый.
    Потихоньку ковыряюсь с проектом, хоть пишу в Arduino IDE, блоки кода которые требуют большой производительности пишу на Си под конкретные микропроцессоры ATmega328P, ATmega32U4, ATmega2560 (если так и дальше пойдет от ардуино останется только loop и setup:)).

    Возникли опасения из-за большого кол-во прерываний используемых в коде. Сейчас используется
    USART_UDRE_vect (работает только в момент отправки)
    USART_RX_vect (работает всегда)
    TWI_vect (работает только в момент работы с I2C)
    TIMER2_OVF_vect (запускается после завершения работы USART_UDRE_vect отсчитывает положенное время и останавливается. Уйдет со временем, таймер останется, но буду пользоваться встроенной возможностью инвертировать пин)

    Пока все это отлично работает, но и загрузка пока не велика, в дальнейшем она вырастит и планируются добавить к этому списку
    ADC_vect
    Возможно
    Прерывание/ия таймера T1 (уход от библиотеки Servo)
    Прерывание SPI

    Вот список моих опасений
    1. Загрузка МК прерываниями
    2. Время выполнения самого прерывания
    Данная проблема частично пересекается с первой, кроме этого, если прерывание будет "тупить" есть вероятность потери данных в других прерываниях.

    К примеру TIMER2_OVF_vect имеет более высокий приоритет по сравнению USART_RX_vect, и если код в TIMER2_OVF_vect будет выполнятся долго, есть вероятность потери данных. Понятно, что UART как и то, что мы можем контролировать, нужно проверять.

    Но что делать если мы пропустили нужное значение в ANALOG_COMP_vect.

    3. Приоритет прерываний
    А если будет код будет в прерывании и произойдет новое с высоким приоритетом, пока не отработает текущее до следующего не дойдем (тут не уверен).

    Правильно я понимаю проблемы с которыми столкнусь и учтены ли все проблемы?

    UPD.
    4. Атомарный доступ к переменным
    Пытался прояснить для себя следующую конструкцию
    Код (Text):
    unsigned char _sreg = SREG; cli();
    ......
    SREG = _sreg;
    И нашел, пояснение данных строк кода, кому интересно может прочесть тут
     
    Последнее редактирование: 24 июн 2015
  2. Megakoteyka

    Megakoteyka Оракул Модератор

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

    Alex19 Гуру

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

    Так и написано.

    Есть 2-х канальный осциллограф и видимо надо приобрести анализатор логических уровней, чтобы видеть картину в целом. Все таки возможности отладки в Arduino сильно ограничены.

    Спасибо за советы.
    А если что-то еще, кроме моих 4-х пунктов, которые я должен учитывать, при написании кода?
     
  4. Alex19

    Alex19 Гуру

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

    Еще раз спасибо Megakoteyka.