配置ESP8266 NONOS SDK時由於工具鏈版本差異引發的故障
阿新 • • 發佈:2019-02-24
cep add 通過 str 交叉 div 2.0 庫文件 版本信息 與SDK官方使用的工具鏈版本不同時,可能會出現兼容性問題。
前不久部署ESP8266_NONOS_SDK時遇到了一個奇怪的問題,描述如下:
examples例程可以通過編譯,但燒寫到ESP8266模塊後,程序無法正常運行,編譯和燒寫的相關配置均無誤。在boot模式下編譯,串口輸出jump to run user1後,觸發Fatal Exception (29)。串口輸出日誌如下:
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 chksum0x84 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等),而若當前使用的工具鏈版本
通過仔細閱讀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時由於工具鏈版本差異引發的故障