乐鑫技术交流
直播中

余温重顾

10年用户 972经验值
擅长:可编程逻辑 嵌入式技术 EMC/EMI设计
私信 关注
[问答]

system_get_os_print中的命令无效是怎么回事?

有时我会观察到一个奇怪的致命异常。我无法始终如一地重现它,但如果发生这种情况,它会在 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)

郝埃连

2024-7-11 16:22:25
以下是一些建议和可能的原因:

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. **重现问题**:由于您提到无法始终如一地重现问题,尝试在不同的条件下运行设备,以查看是否能够找到导致问题的具体条件。


举报

更多回帖

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