лучшая практика для производительности: пустой цикл () при использовании прерывания?
Я работаю над небольшим аппаратным миди-проектом и использую attachInterrupt()
для назначения функции обратного вызова контакту прерывания.
В функции цикла ничего не делается, поэтому она выглядит так:
void loop() { return; }
Пока это работает, но мне интересно, является ли это плохой практикой? Вместо этого я попытался добавить короткий вызов delay(), но не смог точно измерить, работает ли он лучше или хуже.
@strudelkopf, 👍0
Обсуждение2 ответа
Лучший ответ:
Нет особой причины беспокоиться о том, что в цикле
ничего не делается — процессор должен что-то делать — вам не нужно давать ему дополнительную работу.
Кроме того, в конце функций подразумевается return
, вам не нужно добавлять свой собственный.
Большая проблема заключается в том, что обработчики прерываний должны быть короткими, чтобы вы не пропустили еще одно прерывание, пока выполняете что-то продолжительное в первом прерывании.
Думаю, я сам могу ответить на свой вопрос.
Я понял, что могу сохранить логику изменения состояния и устранения дребезга в подпрограмме обработки прерывания, а все остальное перенести в функцию цикла, которая кажется чище.
редактировать: ну, не обязательно чище. Я согласен с @jsotola, ISR должен делать только самый минимум.
В конце концов я решил, что даже не использовать ISR с самого начала было бы даже лучше для моего варианта использования.
помещая слишком много кода в ISR, вы просто напрашиваетесь на неприятности... особенно код устранения ложных срабатываний, он слишком долго зависает в программе, если она находится внутри блока кода без цикла... поместите код устранения ложных срабатываний внутрь loop()
чтобы интервал между нажатиями клавиш можно было измерить, не останавливая программу, @jsotola
Код отката в ISR может быть в порядке, если работает, отклоняя события (скажем, нажатия кнопок), которые происходят, скажем, в течение 50 мс после последнего принятого события, потому что это можно закодировать без блокировки. Но да, в принципе, ISR должен быть очень легким и быстрым в выполнении., @6v6gt
- Arduino Мигает двумя светодиодами без задержки (количество повторений)
- Аппаратное прерывание срабатывает случайным образом
- Чтение квадратурного энкодера в реальном времени с полным разрешением только с одним прерыванием на ATmega328
- Прекращает ли DmxSerial прерывания?
- Оптимизация кода: Прерывание при достижении значения 0
- Программное обеспечение, устраняющее дребезг кнопки при отпускании
- Как объявить массив переменного размера (глобально)
- Использование millis() и micros() внутри процедуры прерывания
не надо
возврата
... не к чему возвращаться, @jsotolaloop()
возвращается кmain()
(откуда он был вызван, внутри бесконечного цикла) после каждой итерации, независимо от того, написали ли вы оператор return или нет. Единственный случай, когда такая функция не возвращает ту, которая содержит бесконечный цикл для предотвращения этого., @JRobertЕсли вы используете только один ISR для проверки контакта, это сводится к вопросу, какая альтернатива имеет больше накладных расходов: цикл, опрашивающий контакт, или вход и выход службы прерывания. Вам нужно измерить или посмотреть в ассемблерный код., @the busybee