重启原因 ROM Code 判断重启原因 用户程序判断重启原因 常见 Fatal Exception 及原因 版本 1.0 版权 © 2016 ESP8266 重启原因以及常 ⻅ Fatal Exception 原因 关于本⼿册 本⽂介绍了 ESP8266 重启原因以及常⻅ Fatal exception 原因的判断⽅法。 本⼿册结构如下: 发布说明 章 标题 内容 第 1 章 重启原因 介绍通过 ROM code 和⽤户程序判断 ESP8266 重启原因的⽅ 法。 第 2 章 常⻅ Fatal Exception 及原因 介绍 ESP8266 常⻅ Fatal exception 及原因。 ⽇期 版本 发布说明 2016.08 V1.0 ⾸次发布。 ⽬录 1. 重启原因! 1"................................................................................................................................. 1.1. ROM Code 判断重启原因! 1"........................................................................................................... 1.2. ⽤户程序判断重启原因! 1"............................................................................................................... 2. 常⻅ Fatal Exception 及原因!3................................................................................................... 1. 重启原因 1. 重启原因 1.1. ROM Code 判断重启原因 ESP8266 每次重启,ROM code 都会将此次重启原因的序号打印出来,如下图。⽤户可 以根据该序号知道此次重启的原因。这种调试⽅式⽤于⽤户程序⽆法启动,但是需要分析 此次重启原因时。 ROM code ⾥⾯打印的重置原因如下表。 1.2. ⽤户程序判断重启原因 ⽤户也可以通过应⽤层添加程序判断此次重启的原因。这种⽅式判断⽐较全⾯。该⽅式⽤ 于发⽣崩溃的位置打印乱码,⽆法调试。 添加代码段如下: struct rst_info *rtc_info = system_get_rst_info(); 表 1-1. ROM Code 判断重启原因 Rst cause 号 原因 0 没有定义 1 电源重启 2 外部复位或 Deep-sleep 醒来 4 硬件 WDT 重启 ⚠ 注意: 软件 WDT 重启或者软件复位都会维持上次重启状态。⽐如第⼀次是电源重启,rst cause 为 1,软件复位后 rst cause 仍然为 1。 Espressif /1 4 2016.08 1. 重启原因 os_printf("reset reason: %x\n", rtc_info->reason); if (rtc_info->reason == REASON_WDT_RST || rtc_info->reason == REASON_EXCEPTION_RST || rtc_info->reason == REASON_SOFT_WDT_RST) { if (rtc_info->reason == REASON_EXCEPTION_RST) { os_printf("Fatal exception (%d):\n", rtc_info- >exccause); } os_printf("epc1=0x%08x, epc2=0x%08x, epc3=0x%08x, excvaddr=0x%08x, depc=0x%08x\n", rtc_info->epc1, rtc_info->epc2, rtc_info- >epc3, rtc_info->excvaddr, rtc_info->depc);//此次会打印上次崩溃的地址,多 ⽤于崩溃时乱码调试。 } 关于 system_get_rst_info() 和相关数据结构,请参考 SDK 的 API 参考:《ESP8266 Non-OS SDK API 参考》和《ESP8266 RTOS SDK API 参考》(链接为:espressif.com/ zh-hans/support/download/documents)。 通过添加判断重启原因的代码,得到的重启原因如下表。 表 1-2. ⽤户程序判断重启原因 Rst cause 号 原因 GPIO 状态 0 电源重启 改变 1 硬件看⻔狗复位 改变 2 Fatal Exception 保持 3 软件看⻔狗复位 保持 4 软件复位 保持 5 Deep-sleep 改变 6 硬件复位 改变 Espressif /2 4 2016.08 2. 常⻅ Fatal Exception 及原因 2. 常⻅ Fatal Exception 及原因 当程序崩溃时,可以根据 Fatal exception 号协助调试。Fatal exception 号以及描述如下。 ⽐如: Fatal exception (28): epc1=0x4025bfa6, epc2=0x00000000, epc3=0x00000000, excvaddr=0x0000000f, depc=0x00000000 • 如果使⽤的是 user1.1024.new.2.bin,那么就在 user1.1024.new.2.S ⽂件⾥查证 exception 地址“0x4025bfa6”,然后在⽤户代码中添加打印进⾏调试。 • 如果使⽤的是 eagle.irom0text.bin,就在 eagle.S 中查找 exception 地址。 • 如果查找不到对应地址,说明程序崩溃问题是在中断中发⽣或者是 ROM ⾥⾯的代 码问题,⽐如: - 4000e190 - 4000df48 - 4000dea8 - 4000de84 - 4000e1e0 表 2-1. 常⻅ Fatal Exception 及原因 Fatal exception 号 描述 可能原因 0 ⾮法指令 1. BIN ⽂件被破坏 2. 函数指针野指针 6 除数为 0 除数为 0 9 读/写操作地址⾮对⻬ 1. 读/写 Cache 地址不对⻬ 2. 函数指针野指针 28/29 访问⾮法地址 1. Cache 被关闭后访问 Cache 2. 函数指针野指针 Espressif /3 4 2016.08 免责申明和版权公告 本⽂中的信息,包括供参考的 URL 地址,如有变更,恕不另⾏通知。 ⽂档“按现状”提供,不负任何担保责任,包括对适销性、适⽤于特定⽤途或⾮侵 权性的任何担保,和任何提案、规格或样品在他处提到的任何担保。本⽂档不 负任何责任,包括使⽤本⽂档内信息产⽣的侵犯任何专利权⾏为的责任。本⽂ 档在此未以禁⽌反⾔或其他⽅式授予任何知识产权使⽤许可,不管是明示许可 还是暗示许可。 Wi-Fi 联盟成员标志归 Wi-Fi 联盟所有。蓝⽛标志是 Bluetooth SIG 的注册商标。 ⽂中提到的所有商标名称、商标和注册商标均属其各⾃所有者的财产,特此声 明。 版权归© 2016 乐鑫所有。保留所有权利。 乐鑫 IOT 团队 www.espressif.com