- 函数执行到特定位置卡死,该位置只有内存和UART寄存器访问,单步无问题。
- 查找问题:
- 怀疑UART和SRAM ip有问题,芯片设计提供抓信号的版本
- 抓SRAM信号,发现有0地址访问。 0地址是DDR区域,还不可访问,程序中未访问0地址
- 定位:ARM的硬件,为了提高效率,对于配置成normal的内存区域,硬件在遇到一些分支指令时,会有prefetch,硬件根据自己的猜测到内存中进行speculative访问。 我们的程序,触发了ARM硬件的speculative访问0地址,导致A53卡死。
- 解决方法: 先把DDR的3G空间设置成非法(非normal),这样硬件就不会随机访问这些区域了。