前几天部署ESP8266_NONOS_SDK时遇到了一个看似奇怪的问题,描述如下:

  examples例程可以通过编译,但烧写到ESP8266模块后,程序无法正常运行,编译和烧写的相关配置均无误。在boot模式下编译,串口输出jump to run user1后,触发Fatal Exception (29)。进一步测试其它例程,运行结果完全相同。串口输出日志如下:

 ets Jan   ,rst cause:, boot mode:(,)
load , room
tail
chksum 0xe5
load , room
tail
chksum 0x84
load , room
tail
chksum 0xd8
csum 0xd8
2nd boot version : 1.6
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size & Map: 4Mbit(1024KB+1024KB)
no GPIO select!
jump to run user1 @ 

Fatal Exception ()

epc1=0x4000df64, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

Fatal Exception ()

epc1=0x4000df64, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

Fatal Exception ()

epc1=0x4000df64, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

  在这里开一文记录解决该问题的思路,以供遇到相似问题的朋友参考,避免入坑。

  鉴于例程本身的可靠性可以保证,只剩下SDK或者工具链的问题。考虑到espressif并没有完全开源其技术细节,在SDK中仍留有闭源的archive静态链接库文件(参见lib目录),而这些静态库可能链接同时依赖于工具链中的库(例如libc、libhal等),而若当前使用的工具链版本SDK官方使用的工具链版本不同时,可能会出现兼容性问题。

  通过仔细阅读NONOS_SDK的文档,发现官方原始使用的工具链gcc版本信息如下(SDK v3.0):

xtensa-lx106-elf-gcc (crosstool-NG 1.20.0) 4.8.2

  而当前我所使用的交叉编译工具链中gcc版本信息为:

xtensa-lx106-elf-gcc.exe (crosstool-NG crosstool-ng-1.22.0-92-g8facf4c0) 5.2.0

  于是尝试将当前交叉编译工具链回退版本到4.8.2,重新编译后,故障消除。

备注: NONOS_SDK v3.0可以在espressif release页面上找到:https://github.com/espressif/ESP8266_NONOS_SDK/releases。

配置ESP8266 NONOS SDK时由于工具链版本差异引发的故障的更多相关文章

  1. ESP8266 NON-OS SDK 和 RTOS SDK实现GPIO中断不同点

    ESP8266 Non-OS SDK 和 RTOS SDK 实现GPIO的方法稍有不同: 对于 Non-OS SDK,比如需要把 MTDO 配置成输入,同时下降沿触发中断: gpio_init(voi ...

  2. ESP8266 NONOS SDK学习

    一.概况 1.存储 ESP8266 带有 160 KB 的 RAM,其中 64 KB 为 iRAM,96 KB 为 dRAM.iRAM 进一步 分成两块:32 KB iRAM 块运行标有 IRAM_A ...

  3. X86上搭建交叉工具链,来给龙芯笔记本编译本地工具链(未完待续)

    故事的背景是,我买了一台龙芯2F的笔记本来装B. 为什么说是装B呢?因为不但操作系统是Linux,而且CPU还是龙芯的. 一般人有这么酷的装备吗?简直是装B大圣啊. 这里一定要申明一点,本人不是IT技 ...

  4. X86给龙芯笔记本编译本地工具链(未完待续)

    我买了一台龙芯2F的笔记本来当玩具. 买回来发现,这台笔记本上没法安装软件,因为既没有软件仓库,也没有GCC. 因此需要构建交叉工具链和构建本地工具链. 下面是我研究如何搞定着一切的笔记. 工具链组件 ...

  5. xmake v2.3.4 发布, 更加完善的工具链支持

    为了让xmake更好得支持交叉编译,这个版本我重构了整个工具链,使得工具链的切换更加的方便快捷,并且现在用户可以很方便地在xmake.lua中扩展自己的工具链. 关于平台的支持上,我们新增了对*BSD ...

  6. 为DS5添加新的gcc工具链

    环境: 步骤: 1.下载mingw32版本的工具链 下面有两个下载工具链的网站: ARM官网的: https://developer.arm.com/tools-and-software/open-s ...

  7. 迁移到MSYS2 与 Qt 工具链注意的几个事情(g++在链接时,符号依赖项查找遵循从左至右的顺序,但qmake会自动合并造成错误。使用脚本给Mingw32-make创造出一个局部的VC编译环境)

    Microsoft Visual Studio 2015社区版提供了强大的开发体验,且 Qt 提供了预编译版本.然而,由于客户提出兼容Windows XP ~ Windows 8.1 这样宽泛的环境要 ...

  8. nRF5 SDK for Mesh(三) Installing the mesh toolchain 安装编译工具链

    Installing the mesh toolchain To build the example applications, a toolchain based on either CMake o ...

  9. [技术博客] 软工-Ruby on Rails前端工具链的配置以及对Web应用结构设计的一点思考

    一.相关工具链简介 HAML HAML是专门面向Ruby on Rails模版语法设计的一门标记语言,其结合RoR的views部分模版语法的特点,对原来的*.html.erb(嵌入Ruby代码的HTM ...

随机推荐

  1. 【rabbitmq】RabbitMQ 集群与网络分区

    网络分区(network partitions) 官网-网络分区 网络设备故障导致的网络分裂.比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连.若 ...

  2. 负载均衡器技术Nginx和F5的优缺点对比

    负载均衡器技术Nginx和F5的优缺点对比 博客分类: 应用服务 F5nginx  对于数据流量过大的网络中,往往单一设备无法承担,需要多台设备进行数据分流,而负载均衡器就是用来将数据分流到多台设备的 ...

  3. jupyter依赖tornado版本

    使用jupyter莫名奇妙出现500错误,发现是更新tornado出了问题,我的jupyter版本是5.7.4不支持6.x版本的tornado,回退到5.x版本的tornado就好了. pip ins ...

  4. 【docker】服务随容器启动而自启动

    场景: 有一个docker, 在该docker中有服务A,希望每次启动容器时服务A都随着容器启动.这样就不用每次都进入容器手动启动服务了. 方法: 1.需要在docker中添加一个启动服务脚本auto ...

  5. Galaxy2D Game Engine 4.2 开发版发布

    Update: ◆删除Graph_GetRenderTarget()函数,添加Graph_CopyBackBuffer()/Graph_CopyRanderTarget()函数 ◆Graph_EndS ...

  6. vs关于“当前不会命中断点 还没有为该文档加载任何符号”的解决方法

    首先调式的时候确定在debug模式下, 解决方法:工具-选项-调试 -(启用“仅我的代码”)勾去掉.

  7. Vue 表格里的下拉列表

    下拉列表column-select.vue组件内容: <template> <div class="column-select-wrapper"> < ...

  8. python爬百度文库课件

    库:re;selenium;requests 源码: from selenium import webdriverimport reimport requests def open_img(items ...

  9. k8s创建pod流程

    kubernetes 创建Pod 的 工作流: step.1 kubectl 向 k8s api server 发起一个create pod 请求(即我们使用Kubectl敲一个create pod命 ...

  10. @Override is not allowed when implementing interface method

    使用idea导入maven项目时 会出现如下报错 @Override从jdk1.5开始出现的,是用来标注方法重写:通常方法重写发生在继承父类,重写父类方法,或者实现接口,实现接口方法: @Overri ...