完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
有时我会观察到一个奇怪的致命异常。我无法始终如一地重现它,但如果发生这种情况,它会在 OTA 升级后重新启动时发生。
在系统启动时,我这样做: struct rst_info *rst_info = system_get_rst_info(); os_printf("reason=%d exccause=%d epc1=0x%X epc2=0x%X epc3=0x%X excvaddr=0x%X depc=0x%Xn", rst_info->reason, rst_info->exccause, rst_info->epc1, rst_info->epc2, rst_info->epc3, rst_info->excvaddr, rst_info->depc); 发生异常时我看到的两个示例: 原因=2 原因=0 EPC1=0x4021ED6C EPC2=0x0 EPC3=0x0 excvaddr=0x33 depc=0x0 原因=2 exccause=0 epc1=0x4029ED6C epc2=0x0 epc3=0x0 excvaddr=0x0 depc=0x0 根据映射文件,在这两种情况下,epc1 都system_get_os_print在新映像中(因此,当旧映像仍处于活动状态时,不会发生崩溃)。什么是system_get_os_print?它有什么作用?什么时候叫?我不使用这个功能。 我的 OTA 更新是在正确的地方使用spi_flash_erase_sector和spi_flash_write完成的。在那之后,我做到了 system_upgrade_flag_set(upgrade_flag_finish); system_upgrade_reboot(); 更新有效,即新映像完美运行(尽管有异常消息)。如果我在那之后重新启动模块,一切都很好(异常不会再次发生)。 |
|
相关推荐
1个回答
|
|
以下是一些建议和可能的原因:
1. **代码错误**:首先检查您的代码是否有任何错误。例如,您在打印时使用的格式化字符串可能不正确。您提供的代码片段中,`rst_info->reason` 应该是 `rst_info.reason`,因为 `reason` 是 `rst_info` 结构体的成员,而不是指针。 2. **异常处理**:您提到的异常可能是由于某种原因导致的。例如,如果 `reason` 为2,这可能表示系统是由于软件原因(如看门狗定时器)重启的。如果 `reason` 为0,这可能表示系统是由于电源问题或其他硬件原因重启的。检查这些原因可能有助于诊断问题。 3. **OTA升级问题**:如果问题仅在OTA升级后发生,可能是升级过程中出现了问题,或者新固件存在某些问题。确保OTA升级过程正确无误,并且新固件没有引入任何错误。 4. **内存问题**:如果在使用 `os_printf` 时发生异常,可能是因为内存访问错误。检查 `os_printf` 函数是否正确地处理了内存分配和访问。 5. **调试和日志**:增加更多的日志输出,以便在异常发生时捕获更多的上下文信息。这可以帮助您更好地理解问题发生的原因。 6. **硬件问题**:如果问题与硬件有关,检查硬件连接和电源供应是否稳定。 7. **固件和库更新**:确保您的设备固件和使用的库是最新版本,以避免已知的问题。 8. **环境因素**:检查是否有任何环境因素可能导致设备异常重启,例如电源波动或电磁干扰。 9. **重现问题**:由于您提到无法始终如一地重现问题,尝试在不同的条件下运行设备,以查看是否能够找到导致问题的具体条件。 |
|
|
|
只有小组成员才能发言,加入小组>>
528浏览 6评论
438浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
425浏览 5评论
422浏览 4评论
398浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 08:06 , Processed in 0.863240 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号