ESP8266 Developer Zone The Official ESP8266 Forum 2017-09-25T13:46:13+08:00 https://bbs.espressif.com:443/feed.php?f=7&t=6302 2017-09-25T13:46:13+08:00 2017-09-25T13:46:13+08:00 https://bbs.espressif.com:443/viewtopic.php?t=6302&p=16008#p16008 <![CDATA[Re: OTA升级完成后跳转失败]]>
Her Majesty wrote:
是不是原本的用法,在 system_upgrade_reboot 之后,应用程序还有别的操作,而系统就已经开始准备关机重启了。
而放到 定时器触发后,应用程序的操作都完成了,才开始重启?


在system_upgrade_reboot之后有结束任务vTaskDelete(NULL)的操作,难道这个对重启有影响?

Statistics: Posted by xiaoleizii — Mon Sep 25, 2017 1:46 pm


]]>
2017-09-09T10:21:42+08:00 2017-09-09T10:21:42+08:00 https://bbs.espressif.com:443/viewtopic.php?t=6302&p=15652#p15652 <![CDATA[Re: OTA升级完成后跳转失败]]> 而放到 定时器触发后,应用程序的操作都完成了,才开始重启?

Statistics: Posted by Her Mary — Sat Sep 09, 2017 10:21 am


]]>
2017-09-08T15:54:03+08:00 2017-09-08T15:54:03+08:00 https://bbs.espressif.com:443/viewtopic.php?t=6302&p=15634#p15634 <![CDATA[Re: OTA升级完成后跳转失败]]>
Her Majesty wrote:
把 while(1) 删掉呢?

之前时没有while(1);这句的,也是同样的现象,加上while(1)时为了阻止任务调度,不过没有什么用。

现在的情况时把升级的重启代码从任务中挪到一个定时器的回调函数中执行,暂时解决了问题,不过感觉问题没有彻底解决。

Code:

         wifi_save_bin_info();
         debug_printf("wifi update verify block success!!Rebooting......\r\n");
         system_upgrade_flag_set(UPGRADE_FLAG_FINISH);

         os_timer_disarm(&WifiUpgradeFinishTimer);
         os_timer_setfn(&WifiUpgradeFinishTimer, (os_timer_func_t *) wifi_upgrade_finish_timer_tick,
         NULL);
         os_timer_arm(&WifiUpgradeFinishTimer, 500, 0);
         vTaskDelete(NULL);


wifi_upgrade_finish_timer_tick:

Code:

void wifi_upgrade_finish_timer_tick(void) {
   system_upgrade_reboot();
   while (1);
}


这样修改了之后,反复测试,没有再出现失败。

但是不能确定是否真的解决问题,这种问题没法调试,很头疼。。。。

Statistics: Posted by xiaoleizii — Fri Sep 08, 2017 3:54 pm


]]>
2017-09-08T14:58:25+08:00 2017-09-08T14:58:25+08:00 https://bbs.espressif.com:443/viewtopic.php?t=6302&p=15632#p15632 <![CDATA[Re: OTA升级完成后跳转失败]]> Statistics: Posted by Her Mary — Fri Sep 08, 2017 2:58 pm


]]>
2017-09-08T11:34:12+08:00 2017-09-08T11:34:12+08:00 https://bbs.espressif.com:443/viewtopic.php?t=6302&p=15629#p15629 <![CDATA[OTA升级完成后跳转失败]]> 重启代码如下:

Code:

      
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 l32ra4, 401000d8 <_DoubleExceptionVector+0x68>
401000e3:0438 l32i.na3, a4, 0
401000e5:07b327 bgeua3, a2, 401000f0 <prvInsertBlockIntoUsedList+0x10>
401000e8:438c beqz.na3, 401000f0 <prvInsertBlockIntoUsedList+0x10>
401000ea:034d mov.na4, a3
401000ec:fffcc6 j401000e3 <prvInsertBlockIntoUsedList+0x3>
401000ef:023900 excw
401000f2:fffa31 l32ra3, 401000dc <_DoubleExceptionVector+0x6c>
401000f5:0429 s32i.na2, a4, 0
401000f7:1248 l32i.na4, a2, 4
401000f9:0328 l32i.na2, a3, 0
401000fb:242a add.na2, a4, a2
401000fd:0329 s32i.na2, 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:

#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打印,但是没有任何输出。

Statistics: Posted by xiaoleizii — Fri Sep 08, 2017 11:34 am


]]>