2

似乎在执行网络 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)

分支:大师

构建于: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

4

2 回答 2

1

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

所以,问题是“这是一个已知的约束吗?” 简短但不令人满意的答案是“不”。不能就这样离开...

代码摘录是否足以让您断定由于这几行中的某些事情而必须发生重置?我对此表示怀疑。您似乎在做的是每个 GPIO 'down' 的简单“全局”增量,并带有一些去抖动逻辑。但是,我没有看到任何反跳,我错过了什么?您将时间投入到全球范围内lastTrig,但您没有做任何事情。只是为了去抖动,你不需要rtctimeIMO,但我怀疑这与问题有关。

我有一个基于 - 的去抖的要点,tmr.delay以及一个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 有关。

于 2016-04-19T19:03:44.810 回答
1

我有几乎同样的问题。运行ESP8266Webserver,使用GPIO14 Interrupt,以太快的脉冲作为输入,系统停止记录中断。请参阅此处了解更多详情。

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

我正在使用 ARDUINO IDE 1.69,但问题似乎是一样的。我使用了一个ESP8266-07作为生成器和计数器(没有网络服务器)来生成脉冲,连接到我的 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();

    }

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

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

有兴趣获得一些解决方案。谁能帮忙?

感谢 Mickbaer Berlin Germany 电子邮件:michael.lorenz@web.de

于 2016-04-27T10:40:20.520 回答