网络I / O期间中断==崩溃?

时间:2016-04-18 00:11:07

标签: esp8266 nodemcu

似乎在执行网络I / O时发生I / O引脚中断时,系统会重置 - 即使中断函数只声明一个局部变量并分配它(基本上是一个无用的例行程序)。所以我非常肯定在中断功能上花费太多时间并不是事实。 (我的实际工作中断函数非常简洁,严格递增和赋值,甚至没有任何条件逻辑。)

这是一个已知的约束吗?我的解决方法是在使用网络时断开中断,但这当然会带来数据丢失的可能性。

function fnCbUp(level)
    lastTrig = rtctime.get()
    gpio.trig(pin, "down", fnCbDown)
end

function fnCbDown(level)
    local spin = rtcmem.read32(20)
    spin = spin + 1
    rtcmem.write32(20, spin)
    lastTrig = rtctime.get()
    gpio.trig(pin, "up", fnCbUp)
end

gpio.trig(pin, "down", fnCbDown)
gpio.mode(pin, gpio.INT, gpio.FLOAT)
  

分支:主人

     

build build on:2016-03-15 10:39

     

由SDK 1.4.0上的Lua 5.1.4提供支持

     

模块:adc,bit,file,gpio,i2c,net,node,pwm,rtcfifo,rtcmem,rtctime,sntp,tmr,uart,wifi

2 个答案:

答案 0 :(得分:1)

不确定这应该是答案还是评论。虽然评论可能有点长。

所以,问题是"这是一个已知的约束吗?"简短但不尽如人意的答案是" no"。不能那样离开......

代码摘录是否足以让您得出结论必须由于这几行内的某些内容而发生重置?我对此表示怀疑。 你似乎在做的是一个简单的全球性的#34;增加每个GPIO' down'有一些去抖逻辑。但是,我没有看到任何去抖,我错过了什么?您有时间进入全球lastTrig,但您不会对此做任何事情。只是为了去抖,你不需要rtctime IMO,但我怀疑它与这个问题有什么关系。

我有gist of a tmr.delay-based debounce以及one with tmr.now更像是油门。你可以这样使用第一个:

GPIO14 = 5
spin

function down()
    spin = spin + 1
    tmr.delay(50)                    -- time delay for switch debounce
    gpio.trig(GPIO14, "up", up)      -- change trigger on falling edge
end

function up()
    tmr.delay(50)
    gpio.trig(GPIO14, "down", down)  -- trigger on rising edge
end

gpio.mode(GPIO14, gpio.INT)          -- gpio.FLOAT by default
gpio.trig(GPIO14, "down", down)

我还建议针对dev分支运行此操作,因为您说它在中断期间与网络I / O相关。

答案 1 :(得分:1)

我有几乎相同的问题。 使用ESP8266Webserver运行GPIO14 Interrupt,输入速度过快, 系统停止记录中断。 有关详细信息,请参阅此处。

http://www.esp8266.com/viewtopic.php?f=28&t=9702

我使用ARDUINO IDE 1.69,但问题似乎是一样的。 我使用ESP8266-07作为生成器&计数器(没有Webserver) 生成脉冲,连接到我的ESP8266-Watersystem。

发电机运行良好,远远超过240 puls / sec, 生成并统计同一个ESP。

ESP-Watersystem会停止在impuls > 50/ second:

处录制中断
/*************************************************/

/*  ISR Water pulse counter                      */

/*************************************************/

/**

 * Invoked by interrupt14 once per rotation of the hall-effect sensor. Interrupt

 * handlers should be kept as small as possible so they return quickly.

 */


 void ICACHE_RAM_ATTR pulseCounter()

    {

      // Increment the pulse Counter

      cli();

      G_pulseCount++;

     Serial.println ( "!" );

     sei();

    }

串行输出仅用于显示发生的事情。 它显示正确的计数Impuls,直到网络服务器与网络交互。 中断被阻塞了。(这里没有串行输出) 通过强调系统,当我在短时间内刷新网站几次时, 中断计数会在短时间内开始,但会再次短时间停止。

问题出在中断处理和Web服务的任何地方。 我希望我能帮助找到这个问题。

积极寻求解决方案。 谁可以帮忙?

感谢Mickbaer 柏林,德国 电子邮件:michael.lorenz@web.de

相关问题