ds18b20. lua задача голодает? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть датчик ds18b20, подключенный к контакту D3, и датчик Холла на контакте D1. Я использую tmr.trig на выводе D1 для подсчета событий с падающим фронтом. Когда я звоню ds18b20:read_temp(callback, pin, ds18b20.C), все работает как положено.

Странная вещь начинает происходить, когда начинают поступать прерывания от датчика Холла. Достаточно просто прерывания в секунду. read_temp зависает и не перезванивает, и я не получаю показаний. Через некоторое время много вызовов read_temp накапливаются, и esp8266 сбрасывается.

Я проследил проблему до строки 205 ds18b20.lua:

if lcb then node_task_post(node_task_LOW_PRIORITY, lcb) end

Если я заменил node_task_LOW_PRIORITY с node.task.HIGH_PRIORITY проблема исправлена. Похоже, что планировщик истощает задачу с низким приоритетом.

Мне интересно, что я делаю что-то не так? Или это ошибка? Прерывания мешают работе node.task?

1 Ответ

0 голосов
/ 28 апреля 2020

Я отвечаю на свой вопрос. Я выяснил, что мешало выполнению задачи. Это было не прерывание само по себе, а скорее вызов gpio.serout внутри функции обратного вызова. Как указано в документации:

HW таймер Режим FRC1_SOURCE используется для изменения состояний. Поскольку имеется только один аппаратный таймер, существуют ограничения на то, какие модули можно использовать одновременно. Если таймер уже используется, возникнет ошибка.

Действительно, я получил ошибку, но не смог прочитать ее, потому что в последовательном терминале она напечатана как gibberi sh.

...