重启代码如下:
Code: Select all
wifi_save_bin_info();
debug_printf("wifi update verify block success!!Rebooting......\r\n");
system_upgrade_flag_set(UPGRADE_FLAG_FINISH);
system_upgrade_reboot();
while (1);
打印出的log如下:
wifi update verify block success!!Rebooting......
reboot to use2
Fatal exception (28):
epc1=0x401000e3
epc2=0x00000000
epc3=0x40100b07
epcvaddr=0x00006d70
depc=0x00000000
rtn_add=0x401002b9
检查.s文件查到该地址为:
401000e0 <prvInsertBlockIntoUsedList>:
401000e0: fffe41 l32r a4, 401000d8 <_DoubleExceptionVector+0x68>
401000e3: 0438 l32i.n a3, a4, 0
401000e5: 07b327 bgeu a3, a2, 401000f0 <prvInsertBlockIntoUsedList+0x10>
401000e8: 438c beqz.n a3, 401000f0 <prvInsertBlockIntoUsedList+0x10>
401000ea: 034d mov.n a4, a3
401000ec: fffcc6 j 401000e3 <prvInsertBlockIntoUsedList+0x3>
401000ef: 023900 excw
401000f2: fffa31 l32r a3, 401000dc <_DoubleExceptionVector+0x6c>
401000f5: 0429 s32i.n a2, a4, 0
401000f7: 1248 l32i.n a4, a2, 4
401000f9: 0328 l32i.n a2, a3, 0
401000fb: 242a add.n a2, a4, a2
401000fd: 0329 s32i.n a2, a3, 0
401000ff: f00d ret.n
40100101: 000000 ill
但是发现该问题发生的现象为:从一个有debug_log输出的固件升级到一个没有debug_log输出的固件时100%会发生,从没有debug_log升级到有debug_log输出固件偶尔会发生,从没有debug_log升级到没有debug_log输出的固件偶尔会发生。
debug_log的定义:
Code: Select all
#ifndef os_printf
/* NOTE: don't use printf_opt in irq handler, for test */
#define os_printf(fmt, ...) do { \
static const char flash_str[] ICACHE_RODATA_ATTR STORE_ATTR = fmt; \
printf(flash_str, ##__VA_ARGS__); \
} while(0)
#endif
#ifdef OS_PRINTF_ENABLED
#define debug_printf os_printf
#else
#define debug_printf
#endif
所有的重启失败均发生在新固件启动的初始位置,我在初始位置做了debug_log打印,但是没有任何输出。