День добрый. Потихоньку ковыряюсь с проектом, хоть пишу в 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; И нашел, пояснение данных строк кода, кому интересно может прочесть тут
Если прерывание не требует немедленной обработки, можно в обработчике ставить флаг, а в главном цикле программы мониторить его и сбрасывать после обработки. Вообще код прерывания должен быть как можно более коротким и делать только то, без чего в обработчике нельзя обойтись. Если прерывания возникают с одинаковым интервалом, можно дергать ножку контроллера из прерывания и на осциллографе оценить примерную нагрузку.
Пока все требуют немедленной обработки и являются не делимыми. Но на будущие буду учитывать, возможно в следующих прерываниях, это понадобится. Так и написано. Есть 2-х канальный осциллограф и видимо надо приобрести анализатор логических уровней, чтобы видеть картину в целом. Все таки возможности отладки в Arduino сильно ограничены. Спасибо за советы. А если что-то еще, кроме моих 4-х пунктов, которые я должен учитывать, при написании кода?
Вероятнее всего, общих проблем больше нет, хотя могут возникнуть специфические связанные с особенностями моего кода. Проверю текущую нагрузку и буду потихоньку добавлять прерывания по мере необходимости. Еще раз спасибо Megakoteyka.