полный список общих библиотечных методов, которые не работают в процедурах обслуживания прерываний

Где находится полный и авторитетный список часто используемых библиотек или встроенных методов (функций), которые не работают должным образом в процедурах обслуживания прерываний 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

Однако, как я уже сказал, мне нужен более полный и авторитетный список.

, 👍0

Обсуждение

Авторитетный список (например, фонда Arduino) может включать только библиотеки, разработанные этим органом. Это не будет включать большинство доступных библиотек. Никто не хочет давать гарантии на библиотеку, автором которой он не является., @chrisl


2 ответа


Лучший ответ:

2

... которые не работают должным образом в процедурах обслуживания прерываний Arduino...

Гораздо более безопасным подходом было бы спросить, что работает правильно в ISR. Учитывая, что мой совет заключался в том, чтобы «быть кратким», это привело бы к исключению вызова любых функций, кроме тех, о которых известно, что все в порядке. Например, можно вызвать millis() или micros(), чтобы узнать текущие значения таймера (принимая во внимание, что цифры, возвращаемые millis(), будут допустимы). не будет увеличиваться).

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

Поэтому я бы не стал пытаться записывать файлы, выполнять последовательный вывод, вывод I2C, управлять двигателями и т. д.

На самом деле ISR должен делать одно или несколько из следующих действий:

  • Установка флага (например, «клавиша была нажата»)
  • Запишите время (например, «Пульс получен в этот момент»)
  • Получить какое-либо значение (например, какое число находится в регистре таймера)

Затем основной код, а не ISR, делает с этими данными что-то более длинное.

Другой вопрос, о котором следует беспокоиться: Является ли функция повторным входом?

В качестве примера: если вы выполняете strcpy в ISR, закодирована ли функция strcpy для повторного ввода? (Я пока не знаю ответа). Если он не является реентерабельным, и вы выполняете strcpy в основном коде, а ISR также выполняет strcpy, то один из них будет поврежден.


Что касается получения полного списка, это практически невозможно. Некоторые библиотеки больше не поддерживаются. Другие могут поддерживаться, но меняться каждый месяц, и это изменение может повлиять на то, как они работают внутри ISR. Это похоже на вопрос, который люди задают о том, «какие библиотеки используют какие таймеры или контакты?». На эти вопросы сложно или невозможно дать адекватный ответ.

,

3

Основное правило довольно простое, но список составить практически невозможно.

Правило:

  • Вы не можете использовать что-либо, работа которого зависит от прерывания, из подпрограммы обслуживания прерываний.

Чипы AVR имеют только один приоритет прерывания. Одновременно может работать только одна программа обработки прерываний. Если прерывание срабатывает во время выполнения ISR, это прерывание будет отложено до завершения ISR. Если этот ISR опирается на функцию, которая сама требует запуска ISR (например, millis() или последовательная передача), то он никогда не завершится.

Неполный список того, что нужно знать:

  • Вы не можете передавать серийный номер больше, чем есть в буфере TX, иначе он блокируется.
  • Время, генерируемое функцией millis() (от которого зависит delay()), никогда не меняется.
  • Серводвигателями невозможно управлять, и они будут дрожать, если процедура прерывания занимает слишком много времени.
  • Звуки, генерируемые
  • tone(), также будут дрожать, поскольку ISR задерживается, пока выполняется другой ISR.

И вообще все, что использует прерывания.

,