乐鑫技术交流
直播中

听风说梦

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

FOTA版本在启动后导致FatalException(0)的原因?

我有一个非FOTA代码,可以在ESP8266上编译并正常工作。
但是,如果我为 OTA 构建编译完全相同的代码,使用相同的编译器和链接器选项并链接相同的库,引导加载程序会跳转 @01000 以运行 user1,但紧接着抛出致命异常,甚至没有执行我在 user_rf_cal_sector_set() 中输入的第一行(一个简单的调试 printf):

第二次启动版本:1.7(5d6f877)
SPI速度:40MHz
SPI模式:DIO
SPI Flash Size & Map: 16Mbit(512KB+512KB)
跳转运行 user1 @ 1000

致命异常 (0):epc1=0x401000c1、epc2=0x00000000、epc3=0x00000000、excvaddr=0x00000000、depc=0x0J000000
致命异常 (0):epc1=0x401000c1、epc2=0x00000000、epc3=0x00000000、excvaddr=0x00000000、depc=0x0J000000
...
但是,如果我使用相同的 makefile 在 OTA 模式下编译其他示例代码(即我只更改正在编译的 .c 源代码),并在地址0x01000刷新它,它运行良好。

我没有编译器或链接器错误或警告。

有什么线索为什么我会得到这个致命的异常吗?如何解决?

注意:作者非FOTA,我的意思是在地址 0x10000 处闪现的软件带有 booloader eagle.flash.bin
By FOTA,我的意思是软件用户 1 或用户 2(乐鑫称它们为)用户 1 在引导加载程序 boot_v1.7.bin 0x01000闪烁。
我使用esptool.py elf2image 版本=2将 ELF 转换为 FOTA 的二进制文件。
我在 WROOM-02 板上使用带有 2MB 闪存的ESP8266,并使用 ESP-open_sdk 工具链 NONOS SDK 2.2 进行编译
                                                                                                                                                            

回帖(1)

贾小龙

2024-7-10 17:50:15
FOTA(Firmware Over The Air)是一种通过无线网络更新设备固件的方法。在您的情况下,当您尝试在ESP8266上使用FOTA时,设备在启动后遇到了FatalException(0)。要解决这个问题,我们需要分析可能的原因并找到解决方案。以下是一些可能的原因和相应的解决方案:

1. **固件大小超出限制**:ESP8266的闪存空间有限,如果FOTA固件超过了可用空间,可能会导致异常。请检查您的固件大小,并确保它在ESP8266的闪存容量范围内。

2. **固件损坏**:在传输过程中,固件可能已损坏。这可能是由于网络问题或其他原因。请尝试重新下载或生成固件,并确保在传输过程中没有错误。

3. **不正确的固件烧录地址**:在FOTA过程中,固件可能被烧录到错误的地址。请检查烧录过程中的烧录地址,并确保它与预期的地址匹配。

4. **引导加载程序问题**:引导加载程序可能无法正确识别或执行FOTA固件。请检查引导加载程序的版本和配置,确保它与您的设备和固件兼容。

5. **内存分配问题**:FOTA固件可能在内存分配方面存在问题,导致设备无法正确执行。请检查您的代码,确保内存分配正确,并避免内存泄漏。

6. **代码问题**:虽然您的非FOTA代码可以在ESP8266上正常工作,但在FOTA版本中可能存在某些代码问题。请仔细检查您的代码,特别是与FOTA相关的部分,以确保没有错误或不一致。

7. **硬件问题**:在某些情况下,硬件问题可能导致设备无法正确执行FOTA固件。请检查您的ESP8266模块,确保它没有损坏或存在其他问题。

8. **调试信息不足**:根据您提供的错误信息,可能无法准确确定问题所在。请尝试使用更详细的调试信息,以便更好地了解问题所在。

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

1. 确保固件大小在ESP8266的闪存容量范围内。
2. 重新下载或生成固件,并确保在传输过程中没有错误。
3. 检查烧录过程中的烧录地址,确保它与预期的地址匹配。
4. 检查引导加载程序的版本和配置,确保它与您的设备和固件兼容。
5. 检查代码中的内存分配和潜在问题。
6. 使用更详细的调试信息,以便更好地了解问题所在。

通过这些步骤,您应该能够找到导致FatalException(0)的原因,并采取相应的措施解决问题。
举报

更多回帖

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