首页 文章

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

提问于
浏览
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由Lua 5.1.4开发,支持SDK 1.4.0模块:adc,bit,file,gpio,i2c,net,node,pwm,rtcfifo,rtcmem,rtctime ,SNTP,TMR,UART,无线网络

2 回答

  • 1

    我有几乎相同的问题 . 使用 GPIO14 Interrupt 运行 ESP8266Webserver ,脉冲输入过快,系统会停止记录中断 . 请看这里了解更多详情 .

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

    我正在使用ARDUINO IDE 1.69,但问题似乎是一样的 . 我使用 ESP8266-07 作为生成器和计数器(没有Web服务器)来生成脉冲,连接到我的ESP8266-Watersystem .

    发电机工作得很好,比同一个ESP生成和计数多得多 240 puls / sec, .

    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 Berlin Germany电子邮件:michael.lorenz@web.de

  • 1

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

    所以,问题是“这是一个已知的约束吗?”而短暂但不尽如人意的答案是“不” . 不能这样离开......

    代码摘录是否足以让您得出结论必须由于这几行内的某些内容而发生重置?我对此表示怀疑 . 你似乎正在做的是每个GPIO 'down'的一个简单的"global"增量,带有一些去抖逻辑 . 但是,我没有看到任何去抖,我错过了什么?你有时间进入全球 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有关 .

相关问题