esp8266 - 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 吗?
解决方案
我回答我自己的问题。我发现是什么干扰了任务。它本身不是中断,而是gpio.serout
对回调函数内部的调用。如文档中所述:
硬件定时器 FRC1_SOURCE 模式用于改变状态。由于只有一个硬件定时器,因此可以同时使用哪些模块是有限制的。如果计时器已在使用中,则会引发错误。
事实上,我确实收到了一个错误,但无法读取它,因为它在串行终端中打印为乱码。
推荐阅读
- python - csv writer to stdout 在 with 块中抛出错误
- .htaccess - htaccess 将我恢复到 wampserver 仪表板
- php - 如何为流文件(m3u8)获取 wmsAuthSign?或 PHP
- node.js - 如何使用nodejs动态调度?
- asp.net-mvc - Visual Studio for Mac 是否支持 ASP MVC 5?
- django - Django CBV's:自定义 mixin,覆盖一个 View 的相同方法
- javascript - 将 javascript 对象原封不动地传递给 ruby 类
- database - 更改数据库模型 - Sequelize
- linux - 通读所有文件并在 Linux 中应用命令
- r - 如何让这个 R 脚本工作