Тикер Arduino ESP8266 прерывается DallasTemperature/OneWire?

Я использую Тикер для успешного мигания светодиода. Однако теперь я получаю температуру из DS18B20 в основном цикле (который использует библиотеку OneWire), и мигание теперь неустойчиво.

Приостановлен ли тикер библиотекой DallasTemperature/OneWire?

Это приостановка прерываний или что-то в этом роде?

Может быть, использовать одно и то же прерывание?

, 👍1


2 ответа


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

2

Тикер не прерывает ваш код. Это ОС-таймер, и он вызовет вашу функцию по истечении указанного времени.

Обратный вызов Tiker может быть прерван "реальным" прерыванием или другой Задачей с более высоким приоритетом и не обеспечивает никакой надежности - он просто будет вызван.

Решением (не самым лучшим) было бы отключить вручную все прерывания, если вы не можете решить эту проблему другим способом.

Если вам просто нужен мигающий светодиод, вы должны использовать прерывание таймера, так как ваш обратный вызов короткий и быстрый. Может быть, с атрибутом ICACHE_RAM_ATTR.

,

OS-timer означает, что он вызывается после цикла() или во время yield() это правильно?, @HixField

@HixField извините, я не правильно написал. Он вызывается во время цикла. Он будет "прерывать" цикл, но не другое прерывание и не важную операцию (например, доступ к SPIFFS). Например, он будет выполнен после завершения транзакции SPIFFS или после завершения прерывания SPI/OneWire. (HW-таймер может прерывать и SPIFFS-доступ)., @Adriano

Хм, ладно. Однако это странно, потому что я только что изменил свою реализацию DS18B20 на неблокирующую (в цикле), и теперь все работает нормально. Я проверил DS18B20 lib, и единственное, что он делает для "блокировки", - это while(...) {} (без какого-либо выхода). У меня сложилось впечатление, что тикер может быть заблокирован блокирующими функциями..., @HixField


0

Я столкнулся с проблемой, используя библиотеки с датчиком DS18B20 в ticker. Если я запрашиваю температуру через millis(), то все в порядке. Когда я запрашиваю температуру в тикере, я получаю "Panic core_esp8266_main.cpp:137 __yield". К сожалению, я не могу этого объяснить.

,

На самом деле это не дает ответа на вопрос. Чтобы задать другой вопрос, просто нажмите [Задать вопрос](https://arduinoprosto.ru/q/ask) выше. Если вы хотите, включите ссылку на этот вопрос, чтобы помочь обеспечить контекст., @sempaiscuba

Вы правы: это не ответ, а просто дополнительная информация. Я совершил ошибку: Я разместил этот текст не в том месте. Это должно было быть в комментариях., @Mikhail