OTA升级完成后跳转失败

xiaoleizii
Posts: 14
Joined: Fri Aug 12, 2016 11:30 am

OTA升级完成后跳转失败

Postby xiaoleizii » Fri Sep 08, 2017 11:34 am

OTA升级完成后,跳转到新的固件时启动失败,但是烧录进新的固件却可以正常启动。
重启代码如下:

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

Her Majesty
Posts: 191
Joined: Mon Oct 27, 2014 11:09 am

Re: OTA升级完成后跳转失败

Postby Her Majesty » Fri Sep 08, 2017 2:58 pm

把 while(1) 删掉呢?

xiaoleizii
Posts: 14
Joined: Fri Aug 12, 2016 11:30 am

Re: OTA升级完成后跳转失败

Postby xiaoleizii » Fri Sep 08, 2017 3:54 pm

Her Majesty wrote:把 while(1) 删掉呢?

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

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

Code: Select all

         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: Select all

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


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

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

Her Majesty
Posts: 191
Joined: Mon Oct 27, 2014 11:09 am

Re: OTA升级完成后跳转失败

Postby Her Majesty » Sat Sep 09, 2017 10:21 am

是不是原本的用法,在 system_upgrade_reboot 之后,应用程序还有别的操作,而系统就已经开始准备关机重启了。
而放到 定时器触发后,应用程序的操作都完成了,才开始重启?

xiaoleizii
Posts: 14
Joined: Fri Aug 12, 2016 11:30 am

Re: OTA升级完成后跳转失败

Postby xiaoleizii » Mon Sep 25, 2017 1:46 pm

Her Majesty wrote:是不是原本的用法,在 system_upgrade_reboot 之后,应用程序还有别的操作,而系统就已经开始准备关机重启了。
而放到 定时器触发后,应用程序的操作都完成了,才开始重启?


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

Who is online

Users browsing this forum: Bing [Bot] and 6 guests