乐鑫技术交流
直播中

宜家

9年用户 1209经验值
私信 关注
[问答]

OTA升级完成后,跳转到新的固件时启动失败是怎么回事?

OTA升级完成后,跳转到新的固件时启动失败,但是烧录进新的固件却可以正常启动。
重启代码如下:
      
wifi_save_bin_info();
debug_printf("wifi update verify block success!!Rebooting......rn");
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 :
401000e0:        fffe41                l32r        a4, 401000d8 <_DoubleExceptionVector+0x68>
401000e3:        0438              l32i.n        a3, a4, 0
401000e5:        07b327                bgeu        a3, a2, 401000f0
401000e8:        438c              beqz.n        a3, 401000f0
401000ea:        034d              mov.n        a4, a3
401000ec:        fffcc6                j        401000e3
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的定义:

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

回帖(1)

京五环以外

2024-7-11 16:17:23
根据您提供的信息,OTA升级完成后,跳转到新的固件时启动失败,但烧录进新的固件却可以正常启动。这可能是由于以下原因导致的:

1. **启动配置问题**:可能是新的固件在启动时配置不正确,导致无法正常启动。检查启动配置文件,确保新的固件使用的是正确的配置。

2. **固件不完整或损坏**:在OTA升级过程中,可能由于网络问题或其他原因导致固件文件不完整或损坏。请尝试重新进行OTA升级,确保固件文件完整无损。

3. **内存问题**:从您提供的log信息来看,出现了"Fatal exception (28)",这可能是由于内存访问错误导致的。检查新固件的内存使用情况,确保没有越界访问或其他内存问题。

4. **硬件问题**:如果烧录进新的固件可以正常启动,但OTA升级后无法启动,可能是硬件问题。检查硬件连接和配置,确保硬件没有问题。

5. **系统升级标志未正确设置**:从您的代码来看,您在升级完成后设置了`system_upgrade_flag_set(UPGRADE_FLAG_FINISH)`。请确保这个标志在新固件中被正确识别和处理。

6. **固件兼容性问题**:新的固件可能与当前硬件或系统不兼容。检查新固件的版本和硬件/系统要求,确保它们兼容。

为了解决这个问题,您可以尝试以下步骤:

1. 重新进行OTA升级,确保固件文件完整无损。
2. 检查启动配置文件,确保新的固件使用的是正确的配置。
3. 检查新固件的内存使用情况,确保没有越界访问或其他内存问题。
4. 检查硬件连接和配置,确保硬件没有问题。
5. 检查系统升级标志是否在新固件中被正确识别和处理。
6. 确保新固件与当前硬件和系统兼容。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助您。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分