前幾天部署ESP8266_NONOS_SDK時遇到了一個看似奇怪的問題,描述以下:git
examples例程能夠經過編譯,但燒寫到ESP8266模塊後,程序沒法正常運行,編譯和燒寫的相關配置均無誤。在boot模式下編譯,串口輸出jump to run user1後,觸發Fatal Exception (29)。進一步測試其它例程,運行結果徹底相同。串口輸出日誌以下:github
ets Jan 8 2013,rst cause:2, boot mode:(3,7) load 0x40100000, len 2408, room 16 tail 8 chksum 0xe5 load 0x3ffe8000, len 776, room 0 tail 8 chksum 0x84 load 0x3ffe8310, len 632, room 0 tail 8 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 @ 1000 Fatal Exception (29) epc1=0x4000df64, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000 Fatal Exception (29) epc1=0x4000df64, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000 Fatal Exception (29) epc1=0x4000df64, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
在這裏開一文記錄解決該問題的思路,以供遇到類似問題的朋友參考,避免入坑。工具
鑑於例程自己的可靠性能夠保證,只剩下SDK或者工具鏈的問題。考慮到espressif並無徹底開源其技術細節,在SDK中仍留有閉源的archive靜態連接庫文件(參見lib目錄),而這些靜態庫可能連接同時依賴於工具鏈中的庫(例如libc、libhal等),而若當前使用的工具鏈版本與SDK官方使用的工具鏈版本不一樣時,可能會出現兼容性問題。測試
經過仔細閱讀NONOS_SDK的文檔,發現官方原始使用的工具鏈gcc版本信息以下(SDK v3.0):spa
xtensa-lx106-elf-gcc (crosstool-NG 1.20.0) 4.8.2日誌
而當前我所使用的交叉編譯工具鏈中gcc版本信息爲:code
xtensa-lx106-elf-gcc.exe (crosstool-NG crosstool-ng-1.22.0-92-g8facf4c0) 5.2.0blog
因而嘗試將當前交叉編譯工具鏈回退版本到4.8.2,從新編譯後,故障消除。文檔
備註: NONOS_SDK v3.0能夠在espressif release頁面上找到:https://github.com/espressif/ESP8266_NONOS_SDK/releases。部署