54xa3ywtuut64010513747.gif
点击上方蓝色字体,关注我们
4
步骤 4: 定位并修复源代码
根据反汇编窗口中定位到的指令地址,结合 .map 文件或调试器的符号信息,找到对应的 C 源代码行。
分析原因:
空指针/野指针:检查 MMFAR 或 BFAR 指向的地址,或者出错指令访问的指针变量是否为 NULL 或指向了无效/已释放的内存区域。数组越界:检查数组索引是否超出了边界,导致访问了非法内存。堆栈溢出: 如果 stacked_sp 的值非常接近或超出了定义的堆栈区域的边界,或者 PC 指向了堆栈区域,则很可能是堆栈溢出。检查函数调用深度、局部变量大小、中断嵌套。可以尝试增大堆栈空间 (startup_stm32xxxx.s 文件中定义)。未对齐访问:检查代码中是否有对 uint16_t, uint32_t 等多字节类型的指针进行强制类型转换和解引用,而该指针的地址不是 2 或 4 的倍数。例如:uint32_t* p = (uint32_t*)0x20000001; val = *p;。可以修改数据结构或使用 memcpy 来避免。除零错误:检查代码中是否存在除数为零的情况。MPU 配置错误:如果使用了 MPU,检查 MPU 区域的配置是否正确,是否允许了必要的读/写/执行权限。访问无效外设地址:检查 BFAR 是否指向了一个未启用时钟或不存在的外设寄存器地址。中断/RTOS 问题:如果 HardFault 发生在中断处理或 RTOS 任务切换期间,问题可能更复杂,可能涉及中断优先级配置错误、临界区保护不足、任务堆栈太小等。检查 LR 的 EXC_RETURN 值有助于判断上下文。
根据分析出的原因修改代码,重新编译、下载并运行代码,确保HardFault 不再发生。
hwljzs55tts64010513847.jpg
0u2duswks0i64010513947.gif
点击阅读原文,更精彩~ |