【关于eps8266自动重启 Soft WDT reset】

简介: 【关于eps8266自动重启 Soft WDT reset】

1. 前言

最近使用esp8266进行远程遥控时, 但是在驱动舵机servo库的过程中出现了esp8266 自动重启问题, 具体表现为串口助手不断输出错误信息,如下。

1.png

--------------- CUT HERE FOR EXCEPTION DECODER ---------------
Soft WDT reset
>>>stack>>>
ctx: cont
sp: 3ffffce0 end: 3fffffc0 offset: 01a0
3ffffe80:  00000002 40105a43 00000001 60000200 
3ffffe90:  00000002 4000410f 00001001 00000205 
3ffffea0:  3fffc718 40004a3c 000003fb 00000001


2.png

2. 分析问题

2.1 长时间没有喂狗

显然是由于长时间没有喂狗导致的看门狗复位, 原因是在loop函数中长时间执行函数,没有延时函数delay,


2.2 delayMicroseconds 函数触发

注意的是 delay 函数和 delayMicroseconds 函数之间的区别, 长时间执行 delay 函数不会出现复位, 但是长时间执行 delayMicroseconds 函数则会导致复位


delayMicroseconds(1000);
servo.write(90);//舵机驱动自带delayMicroseconds操作

由于远程控制中含有Ticker定时器与`delayMicroseconds``冲突


Ticker是ESP32 arduino的自带库,可以设置以固定时间间隔反复执行某个任务,特别适合以固定频率从传感器收集数据。

官方解释:Arduino Ticker 库允许您轻松创建 Ticker 回调,这些回调可以在预定的时间间隔内调用函数。您可以更改回调的重复次数,如果重复为 0,则代码以无限模式运行。工作方式类似于“线程”,必要时将运行辅助函数。该库不使用硬件计时器的中断,并使用micros() / millis()函数。您(实际上)不受股票代码数量的限制。


3. 解决问题

3.1 解决长时间没有喂狗

所以添加了喂狗函数或者delay函数,如下



ESP.wdtFeed();
delay(100);//延时100ms

3.2 解决delayMicroseconds 函数触发

解决delayMicroseconds 函数问题关键在于替代方法,delay 函数内部有喂狗机制, 而 delayMicroseconds 没有这个机制,自己写一个servo驱动函数,具体可见Arduino与SG90舵机握手


3.png



/*
int servopin 是端口号
int myangle  目标位置0~180度,此函数不精确,只有4分度-90 -45 45 90
int loops    循环次数,响应时间
*/
void servopulse(int servopin, int myangle, int loops) /*定义一个脉冲函数,用来模拟方式产生PWM值*/
{
  for (int i = 0; i <= loops; i++)  //给予舵机足够的时间让它转到指定角度
  {
    int pulsewidth = (myangle * 11) + 500;  //将角度转化为500-2480 的脉宽值
    digitalWrite(servopin, HIGH);           //将舵机接口电平置高
    delay(pulsewidth / 1000);               //延时脉宽值的微秒数
    digitalWrite(servopin, LOW);            //将舵机接口电平置低
    delay(20 - pulsewidth / 1000);          //延时周期内剩余时间
  }
  delay(1);
}


3.3 设置定义域

采用舵机的attach函数定义时,设定范围就可解决


servo_R.attach(D5,500,2500);


4. 小结

🥳🥳🥳通过对这篇文章我们掌握了关于eps8266自动重启 Soft WDT reset问题解决,接下来会有许多有趣的实验,尝试与Arduino通讯做语音小车,进而丰富我们的生活。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣

目录
相关文章
|
1月前
|
Linux
linux启动卡一会在random: nonblocking pool is initialized之前
linux启动卡一会在random: nonblocking pool is initialized之前
220 1
|
17天前
|
Linux 数据安全/隐私保护
anaconda运行Notebook和jupyter报错resource.setrlimit(resource.RLIMIT_NOFILE, (soft, hard)) ValueError
anaconda运行Notebook和jupyter报错resource.setrlimit(resource.RLIMIT_NOFILE, (soft, hard)) ValueError
16 0
|
1月前
|
Linux
嵌入式Linux系统(NUC980)tf卡出错处理errors=remount-ro改为errors=continue
嵌入式Linux系统(NUC980)tf卡出错处理errors=remount-ro改为errors=continue
24 1
|
6月前
|
关系型数据库 数据库
Harbor断电重启postgres报错 could not locate a valid checkpoint record
Harbor断电重启postgres报错 could not locate a valid checkpoint record
348 0
|
10月前
|
机器学习/深度学习 Kubernetes 关系型数据库
gitlab--job 作业运行控制 tag、when、allow_failure、retry、timeout、parallel
gitlab--job 作业运行控制 tag、when、allow_failure、retry、timeout、parallel
|
Linux
Linux重新启动后提示 Failed to load SELinux policy. Freezing系统hung住
重新启动之前修改了selinux的配置,disable selinux,估计多半是修改的时候哪里改错了。
145 0
排错-lr回放错误Vuser failed to initialize extensi...解决方法
排错-lr回放错误Vuser failed to initialize extensi...解决方法
80 0
未解决:dpkg-source: error: aborting due to unexpected upstream changes, see /tmp/-1.diff.rm5mTN
未解决:dpkg-source: error: aborting due to unexpected upstream changes, see /tmp/-1.diff.rm5mTN
96 0
|
Ubuntu
ubuntu启动virtualbox出错解决办法:RTR3InitEx failed with rc=-1912 (rc=-1912)
ubuntu启动virtualbox出错解决办法:RTR3InitEx failed with rc=-1912 (rc=-1912)
464 0
ubuntu启动virtualbox出错解决办法:RTR3InitEx failed with rc=-1912 (rc=-1912)
|
Ubuntu JavaScript
ubuntu 文件监视数量 Error: ENOSPC: System limit for number of file watchers reached, watch‘所在文件路径‘
vue 运行执行 npm run dev | * Error: ENOSPC: System limit for number of file watchers reached, watch’所在文件路径’ 最简单的命令 沾走就能用
156 0
ubuntu 文件监视数量 Error: ENOSPC: System limit for number of file watchers reached, watch‘所在文件路径‘

热门文章

最新文章