查看: 1203|回复: 2

【经验】在 ESP8266 长延时中使用 yield 函数

[复制链接]
  • TA的每日心情
    擦汗
    2019-7-29 00:08
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2020-7-31 18:31 | 显示全部楼层 |阅读模式
    本帖最后由 t3486784401 于 2020-7-31 18:35 编辑

    【背景】
    近期用 ESP8266 板验证个 28BYJ 步进电机驱动,遇到了一个蛋疼的问题:
    loop 当中包含长延时(总计几秒)以后,会造成 Soft WDT 重启。

    查看底层代码、官方文档后了解到:
    由于 C/C++ 单线程的特性,loop 不适合使用长延时,单次 loop 运行时间也不宜过长,
    否则易造成 8266 后台更新不及时,进而触发 Soft WDT 或是断网等问题。


    【解决】
    官方提供了一个简单的函数 yield,专用于主动调用运行后台。


    【验证】
    为了简化过程,特编写如下代码说明 yield 的功能。

    代码1:使用 delayMicroseconds 实现长延时(实测 delay 内部包含了 yield 代码,因而测不出重启):
    1. void setup()
    2. {
    3.     Serial.begin(9600);
    4. }
    5. void loop()
    6. {
    7.     Serial.println("Hello");
    8.     for(int i=0; i<5000; i++)
    9.     {
    10.         delayMicroseconds(1000);
    11.     }
    12. }
    复制代码


    代码1结果:Soft WDT 重启:

    2020-07-31_181224.png


    代码2:追加了 yield 的长延时:
    1. void setup()
    2. {
    3.     Serial.begin(9600);
    4. }
    5. void loop()
    6. {
    7.     Serial.println("Hello");
    8.     for(int i=0; i<5000; i++)
    9.     {
    10.         delayMicroseconds(1000);
    11.         yield();
    12.     }
    13. }
    复制代码


    代码2结果:重启故障消失。
    2020-07-31_181308.png


    【结论】
    在 ESP8266 当中,如果无可避免的需要长时间运行在 loop 当中(例如解算浮点),
    应当时不时调用 yield 保证 8266 后台正常运行,以不重启、不断网为标准。

    至于需要多高的调用频率,欢迎大家来测试之 : )



  • TA的每日心情
    开心
    2021-1-28 06:56
  • 签到天数: 179 天

    [LV.7]常住居民III

    发表于 2020-7-31 21:13 | 显示全部楼层
    学习了,多谢分享。

    该用户从未签到

    发表于 2020-8-1 21:54 | 显示全部楼层
    根据你说的我解决了我的问题。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    OLED 128*64自制可达10000000个选项的菜单(已更新)
    OLED 128*64自制可达10000
    OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
    这是什么板?
    这是什么板?
    这是什么板?
    (blinker+wifiduino)自制远程遥控“机甲大师”
    (blinker+wifiduino)自
    之前就尝试过其他云平台做远程遥控小车,但是某APP 界面无法自定义设计,操作方式
    ps2遥控小车——uno实现
    ps2遥控小车——uno实现
    前几天在阁楼发现了好久以前3d打印,激光切割的底盘,于是决定做这个东西 正好手上又
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表