首页 > 解决方案 > ds18b20.lua 任务饿死?

问题描述

我在引脚 D3 上连接了一个 ds18b20 传感器,在引脚 D1 上连接了一个霍尔传感器。我在引脚 D1 上使用 tmr.trig 来计算下降沿事件。当我打电话时,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 吗?

标签: esp8266nodemcu

解决方案


我回答我自己的问题。我发现是什么干扰了任务。它本身不是中断,而是gpio.serout对回调函数内部的调用。如文档中所述:

硬件定时器 FRC1_SOURCE 模式用于改变状态。由于只有一个硬件定时器,因此可以同时使用哪些模块是有限制的。如果计时器已在使用中,则会引发错误。

事实上,我确实收到了一个错误,但无法读取它,因为它在串行终端中打印为乱码。


推荐阅读