立即注册

扫一扫,访问微社区

micropython-microbit 中文社区

查看: 235|回复: 8

ESP32 定时器callback程序执行时大量missed

  [复制链接]

该用户从未签到

发表于 2019-1-11 00:59:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
真奇怪的问题,ESP32 刷的MicroPython ESP32_LoBo_v3.2.24固件,创建了4个Timer,用于OLED屏刷新(period=100ms),按钮动作检测(period=10ms),传感器数据检测及马达启停控制(period=800ms),电池电量检测(period=180000)。4个Timer皆出现Callback events missed的问题,而且是period越长的timer,missed占比越大,比如电量检测,3分钟执行一次callback,10分钟内居然全部miss,一次都没有被执行成功;传感器数据监测和马达启停控制的也是,没800ms执行一次callback,29个events,成功4次,失败25次。

真是百思不得其解啊,究竟是为何? Missed也没给任何报错,纯粹就是漏了。根据loboris的wiki,period小于15ms会有一定的miss,所以按钮动作监测那个timer有miss我不奇怪,但其他三个定时器就不知为何了。

可有高手能指点下,什么情况下会出现callback event miss,或者什么样的callback function容易被miss

多谢!!

手机扫码浏览
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2019-1-11 03:52:17 | 显示全部楼层
问题找到了,timer执行的callback程序里,传感器测量值返回有延时,产生了阻塞,影响到了其他的timer

这部分我改用_thread了,但新的问题又来了,把oled刷新的程序放进_thread里,莫名其妙就会stack overflow,而且很没有规律可循,我另开一贴,请大家帮我看下,多谢
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2019-1-26 00:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2019-1-11 09:43:00 | 显示全部楼层
    有延时的程序,可以设置标志位,在主循环中去处理,避免阻塞。

    线程尽量少用,目前还不稳定
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2019-1-11 16:04:34 | 显示全部楼层
    shaoziyang 发表于 2019-1-11 09:43
    有延时的程序,可以设置标志位,在主循环中去处理,避免阻塞。

    线程尽量少用,目前还不稳定

    邵工,关于“设置标志位,在主循环中去处理,避免阻塞”,可有示例代码供参考?我完全没有头绪啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-1-26 00:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2019-1-11 16:38:01 | 显示全部楼层
    dukeduck 发表于 2019-1-11 16:04
    邵工,关于“设置标志位,在主循环中去处理,避免阻塞”,可有示例代码供参考?我完全没有头绪啊 ...

    就像C语言那样,中断(回调)函数中不要做太复杂的处理,只是设置一个全局标志位,在主程序中,根据标志位进行进行处理。虽然实时性差一点,但是不会出现问题
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2019-1-16 23:08:18 | 显示全部楼层
    shaoziyang 发表于 2019-1-11 16:38
    就像C语言那样,中断(回调)函数中不要做太复杂的处理,只是设置一个全局标志位,在主程序中,根据标志 ...

    我调整了一下代码,在主程序中以一个list作为任务的队列,用定时器将任务加入到队列中。调试中发现延迟很严重,后来发现是OLED刷新速度比较慢,产生了阻塞。最后也没有想出比较好的解决方法,不得已还是讲OLED刷新的函数放进了线程,并且把stack设置得大一些,暂时解决了死机的问题。

    不知道大家用SSD1306这样的OLED屏都是怎么保证其刷新的,是否有代码可参考下?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-1-26 00:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2019-1-17 09:17:42 | 显示全部楼层
    dukeduck 发表于 2019-1-16 23:08
    我调整了一下代码,在主程序中以一个list作为任务的队列,用定时器将任务加入到队列中。调试中发现延迟很 ...

    OLED、TFT这样的屏,需要速度快,一个是使用SPI接口,另外可以单独写一个C语言的底层库。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2019-1-18 08:15:33 | 显示全部楼层
    原来如此,我图方便用的i2c,回头换成spi试下,谢邵工指点!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2019-3-2 22:42:30 | 显示全部楼层
    python编程:www.99kao.com
    回复 支持 反对

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|micropython-microbit 中文社区 ( 鄂ICP备17012469号 )

    GMT+8, 2019-3-20 07:30 , Processed in 0.130065 second(s), 21 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表