ESP8266如何调试分析
时间:10-02
整理:3721RD
点击:
ESP8266的开发环境采用的是在Linux编译开发的,不像在IAR或者MDK里面开发那么方便,可以设置断点等等分析问题,出了问题就只有靠猜了,最头疼的是官方还不开源所有的错误信息,导致出了问题就更没法跟踪了。比如我这段时间遇到一个域名解析一直重启的问题,特别纳闷,折腾了一个多礼拜还没解决,不过最终还是被我解决了(大胆假设,小心求证),相关信息如下:
只有加了右边的代码就模块一直重启,搞得我还以为官方wifi固件是不支持多个服务器交互的,毕竟官方也没这样的案例和应用~~~~~~~~~~~~~~~~~~~~
对于这种问题,虽然我们定位比较苦难,但是也不是一无所措,对此我们应该如何定位呢?
1:首先你在调试时最好将错误信息打印出来,这个对于你定位问题有帮助,定位代码如下:
struct rst_info *rst_info = system_get_rst_info();
os_printf("reset reason: %x\n", rst_info->reason);
if(rst_info->reason == REASON_WDT_RST || rst_info->reason == REASON_EXCEPTION_RST || rst_info->reason == REASON_SOFT_WDT_RST)
{
if (rst_info->reason == REASON_EXCEPTION_RST)
{
os_printf("Fatal exception (%d):\n", rst_info->exccause);
}
os_printf("epc1=0x%08x, epc2=0x%08x, epc3=0x%08x, excvaddr=0x%08x, depc=0x%08x\n",rst_info->epc1, rst_info->epc2, rst_info->epc3, rst_info->excvaddr, rst_info->depc);
}
我们在第一张图片看到了模块复位原因是2,2是神马呢?我们在源码中找到错误定义
enum rst_reason {
REASON_DEFAULT_RST = 0,
REASON_WDT_RST = 1,
REASON_EXCEPTION_RST = 2,
REASON_SOFT_WDT_RST = 3,
REASON_SOFT_RESTART = 4,
REASON_DEEP_SLEEP_AWAKE = 5,
REASON_EXT_SYS_RST = 6
};原来是异常重启,这样你就缩短了问题,比如你不会去考虑上面其他六种问题,什么电源不稳定,任务占用时间太长导致看门狗复位等等。既然是异常服务,那我们接下来如何分析了,我们找到我们的代码.s文件。这个文件可以告诉你错误出现在那个函数。根据错误epc1=40222bc2,我们找到这个地址的代码(不过都是汇编,水平有限没看出什么问题)。
40222bbc <espconn_regist_reconcb>:
40222bbc: 628c beqz.n a2, 40222bc6 <espconn_regist_reconcb+0xa>
40222bbe: 2248 l32i.n a4, a2, 8
40222bc0: 020c movi.n a2, 0
40222bc2: 5439 s32i.n a3, a4, 20
40222bc4: f00d ret.n
40222bc6: 427c movi.n a2, -12
40222bc8: f00d ret.n
哇靠,直接卡壳了,到这部怎么分析了?我之前一直卡着这里,被搞懵逼了。对于这部分,说心里话,我没搞明白,那问题怎么分析下去呢?我采用大胆假设,小心求证的方法,我是这样认为的:既然是espconn_regist_reconcb异常了,那一定是有关TCP这块哪里配置有问题,为什么这样说呢?因为所有有关TCP的错误信息都需要在这个回调函数里面处理,所以我就仔细查看有关TCP的配置信息,终于被我找到了m2m_conn没有被初始化导致异常,最后加入如下代码,世界从此安静了!
m2m_conn.proto.tcp=&m2m_tcp;
m2m_conn.type = ESPCONN_TCP;
m2m_conn.state = ESPCONN_NONE;
最后上传一个文件
最后我的代码很happy的跑了一上午,从此不再担心模块宕机了~~~~~~~~~~~~
只有加了右边的代码就模块一直重启,搞得我还以为官方wifi固件是不支持多个服务器交互的,毕竟官方也没这样的案例和应用~~~~~~~~~~~~~~~~~~~~
对于这种问题,虽然我们定位比较苦难,但是也不是一无所措,对此我们应该如何定位呢?
1:首先你在调试时最好将错误信息打印出来,这个对于你定位问题有帮助,定位代码如下:
struct rst_info *rst_info = system_get_rst_info();
os_printf("reset reason: %x\n", rst_info->reason);
if(rst_info->reason == REASON_WDT_RST || rst_info->reason == REASON_EXCEPTION_RST || rst_info->reason == REASON_SOFT_WDT_RST)
{
if (rst_info->reason == REASON_EXCEPTION_RST)
{
os_printf("Fatal exception (%d):\n", rst_info->exccause);
}
os_printf("epc1=0x%08x, epc2=0x%08x, epc3=0x%08x, excvaddr=0x%08x, depc=0x%08x\n",rst_info->epc1, rst_info->epc2, rst_info->epc3, rst_info->excvaddr, rst_info->depc);
}
我们在第一张图片看到了模块复位原因是2,2是神马呢?我们在源码中找到错误定义
enum rst_reason {
REASON_DEFAULT_RST = 0,
REASON_WDT_RST = 1,
REASON_EXCEPTION_RST = 2,
REASON_SOFT_WDT_RST = 3,
REASON_SOFT_RESTART = 4,
REASON_DEEP_SLEEP_AWAKE = 5,
REASON_EXT_SYS_RST = 6
};原来是异常重启,这样你就缩短了问题,比如你不会去考虑上面其他六种问题,什么电源不稳定,任务占用时间太长导致看门狗复位等等。既然是异常服务,那我们接下来如何分析了,我们找到我们的代码.s文件。这个文件可以告诉你错误出现在那个函数。根据错误epc1=40222bc2,我们找到这个地址的代码(不过都是汇编,水平有限没看出什么问题)。
40222bbc <espconn_regist_reconcb>:
40222bbc: 628c beqz.n a2, 40222bc6 <espconn_regist_reconcb+0xa>
40222bbe: 2248 l32i.n a4, a2, 8
40222bc0: 020c movi.n a2, 0
40222bc2: 5439 s32i.n a3, a4, 20
40222bc4: f00d ret.n
40222bc6: 427c movi.n a2, -12
40222bc8: f00d ret.n
哇靠,直接卡壳了,到这部怎么分析了?我之前一直卡着这里,被搞懵逼了。对于这部分,说心里话,我没搞明白,那问题怎么分析下去呢?我采用大胆假设,小心求证的方法,我是这样认为的:既然是espconn_regist_reconcb异常了,那一定是有关TCP这块哪里配置有问题,为什么这样说呢?因为所有有关TCP的错误信息都需要在这个回调函数里面处理,所以我就仔细查看有关TCP的配置信息,终于被我找到了m2m_conn没有被初始化导致异常,最后加入如下代码,世界从此安静了!
m2m_conn.proto.tcp=&m2m_tcp;
m2m_conn.type = ESPCONN_TCP;
m2m_conn.state = ESPCONN_NONE;
最后上传一个文件
最后我的代码很happy的跑了一上午,从此不再担心模块宕机了~~~~~~~~~~~~
淘宝联系你了。请回复
看见你对8266的了解。能交流下吗?我QQ237369073 我也淘宝刚联系你了
不用淘宝联系我,我基本好少登淘宝,如果需要买东西,直接下单就行,至于交流技术,直接在论坛就行
这款片子我去年开始玩的,反正也走了很多弯路。
多走弯路是好事,可以学到很多东西,孤独九剑也是从败招里面抽取出来的,。没问题才可怕。