注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
wateras1的个人空间 https://home.eeworld.com.cn/space-uid-361439.html [收藏] [复制] [分享] [RSS]
日志

ESP8266如何调试分析

已有 7225 次阅读2016-5-18 11:43 |个人分类:ESP8266 WIFI

          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的跑了一上午,从此不再担心模块宕机了~~~~~~~~~~~~




本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章