【经验】在 ESP8266 长延时中使用 yield 函数-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6651|回复: 4

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

[复制链接]
发表于 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 后台正常运行,以不重启、不断网为标准。

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



发表于 2020-7-31 21:13 | 显示全部楼层
学习了,多谢分享。
发表于 2020-8-1 21:54 | 显示全部楼层
根据你说的我解决了我的问题。
发表于 2022-4-14 23:28 | 显示全部楼层
对的,怪不得我之前看到别人的代码有时候又“莫名其妙”的使用delay()函数。这个问题折腾我一天了,起初我还以为是栈溢出了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 07:05 , Processed in 0.079099 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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