полный список общих библиотечных методов, которые не работают в процедурах обслуживания прерываний
Где находится полный и авторитетный список часто используемых библиотек или встроенных методов (функций), которые не работают должным образом в процедурах обслуживания прерываний Arduino?
Мне известно следующее:
- не используйте задержку()
- не используйте методы последовательной печати
которые являются частью совета Ника Гаммона, ссылки на которые приведены здесь. Его резюме TLDR:
TL;DR:
При написании процедуры обслуживания прерываний (ISR):
Keep it short Don't use delay () Don't do serial prints Make variables shared with the main code volatile Variables shared with main code may need to be protected by "critical sections" (see below) Don't try to turn interrupts off or on
Однако, как я уже сказал, мне нужен более полный и авторитетный список.
@H2ONaCl, 👍0
Обсуждение2 ответа
Лучший ответ:
... которые не работают должным образом в процедурах обслуживания прерываний Arduino...
Гораздо более безопасным подходом было бы спросить, что работает правильно в ISR. Учитывая, что мой совет заключался в том, чтобы «быть кратким», это привело бы к исключению вызова любых функций, кроме тех, о которых известно, что все в порядке. Например, можно вызвать millis()
или micros()
, чтобы узнать текущие значения таймера (принимая во внимание, что цифры, возвращаемые millis(), будут допустимы).
не будет увеличиваться).
По моему мнению, все, что достаточно сложное для размещения в библиотеке, скорее всего будет исключено просто на этом основании, если иное специально не задокументировано.
Поэтому я бы не стал пытаться записывать файлы, выполнять последовательный вывод, вывод I2C, управлять двигателями и т. д.
На самом деле ISR должен делать одно или несколько из следующих действий:
- Установка флага (например, «клавиша была нажата»)
- Запишите время (например, «Пульс получен в этот момент»)
- Получить какое-либо значение (например, какое число находится в регистре таймера)
Затем основной код, а не ISR, делает с этими данными что-то более длинное.
Другой вопрос, о котором следует беспокоиться: Является ли функция повторным входом?
В качестве примера: если вы выполняете strcpy
в ISR, закодирована ли функция strcpy
для повторного ввода? (Я пока не знаю ответа). Если он не является реентерабельным, и вы выполняете strcpy
в основном коде, а ISR также выполняет strcpy
, то один из них будет поврежден.
Что касается получения полного списка, это практически невозможно. Некоторые библиотеки больше не поддерживаются. Другие могут поддерживаться, но меняться каждый месяц, и это изменение может повлиять на то, как они работают внутри ISR. Это похоже на вопрос, который люди задают о том, «какие библиотеки используют какие таймеры или контакты?». На эти вопросы сложно или невозможно дать адекватный ответ.
Основное правило довольно простое, но список составить практически невозможно.
Правило:
- Вы не можете использовать что-либо, работа которого зависит от прерывания, из подпрограммы обслуживания прерываний.
Чипы AVR имеют только один приоритет прерывания. Одновременно может работать только одна программа обработки прерываний. Если прерывание срабатывает во время выполнения ISR, это прерывание будет отложено до завершения ISR. Если этот ISR опирается на функцию, которая сама требует запуска ISR (например, millis()
или последовательная передача), то он никогда не завершится.
Неполный список того, что нужно знать:
- Вы не можете передавать серийный номер больше, чем есть в буфере TX, иначе он блокируется.
- Время, генерируемое функцией
millis()
(от которого зависитdelay()
), никогда не меняется. - Серводвигателями невозможно управлять, и они будут дрожать, если процедура прерывания занимает слишком много времени. Звуки, генерируемые
tone()
, также будут дрожать, поскольку ISR задерживается, пока выполняется другой ISR.
И вообще все, что использует прерывания.
- Использование millis() и micros() внутри процедуры прерывания
- Подсчет импульсов с прерыванием
- Устранение дребезга кнопки с помощью прерывания
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Использование поворотных энкодеров с прерываниями смены контактов
- Arduino непрерывно считывает значение АЦП с помощью прерывания
Авторитетный список (например, фонда Arduino) может включать только библиотеки, разработанные этим органом. Это не будет включать большинство доступных библиотек. Никто не хочет давать гарантии на библиотеку, автором которой он не является., @chrisl