当前位置: 首页 > news >正文

STM32通过rt_hw_hard_fault_exception中的LR寄存器追溯程序问题​

1. 问题现象

程序运行导致rt_hw_hard_fault_exception

如图
在这里插入图片描述
显示错误相关代码

struct exception_stack_frame
{uint32_t r0;uint32_t r1;uint32_t r2;uint32_t r3;uint32_t r12;	uint32_t lr;	 // 链接寄存器 (LR)uint32_t pc;	// 程序计数器 (PC)uint32_t psr;	// 程序状态寄存器 (PSR)
};void rt_hw_hard_fault_exception(struct exception_stack_frame *contex)
{Fm24cl64bInit();
//	static struct exception_stack_frame test;static CoreRegister_Type s_error_save;
//	test = *contex;   s_error_save.r0 = contex->r0;s_error_save.r1 = contex->r1;s_error_save.r2 = contex->r2;s_error_save.r3 = contex->r3;s_error_save.r12 = contex->r12;s_error_save.lr = contex->lr;s_error_save.pc = contex->pc;s_error_save.psr = contex->psr;uint8_t save_res = WriteCoreRegisterToEeprom(&s_error_save);lcd_Init();lcd_Init_PowerOn();lcd_Init_BackLight(1);lcd_BufferClear();lcd_BufferPrint(0, 0, 16, "R0:0x%08X  R1:0x%08X", s_error_save.r0, s_error_save.r1);lcd_BufferPrint(0, 2, 16, "R2:0x%08X  R3:0x%08X", s_error_save.r2, s_error_save.r3);lcd_BufferPrint(0, 4, 16, "R12:0x%08X LR:0x%08X", s_error_save.r12, s_error_save.lr);lcd_BufferPrint(0, 6, 16, "PC:0x%08X PSR:0x%08X", s_error_save.pc, s_error_save.psr);lcd_BufferPrint(0, 8, 16, "save_res:%d", save_res);lcd_BufferPrint(0, 10, 16, "Dst:%d 1st:%d 2st:%d", msg.MsgDstId, msg.FirstSubId, msg.SecondSubId);lcd_ScreenRefresh();while(1);
}

2. 问题分析

在ARM Cortex-M架构中,LR (Link Register, R14) 的值在HardFault或其他异常发生时,对追溯问题根源非常关键。
LR—保存函数返回地址

3. 问题追溯

1. 定位触发HardFault的代码位置

通过 LR:0x08009B47 找到对应的代码位置
使用调试器(如ST-Link + IDE)直接跳转到该地址。在这里插入图片描述
​​

2. 分析LR地址附近的代码

常见触发HardFault的操作:

  • 访问非法地址(野指针、数组越界)。
  • 未对齐的内存访问(如对非4字节对齐地址执行LDR)。
  • 堆栈溢出(检查线程栈大小是否足够)。
  • 错误的函数指针调用(如跳转到无效地址)

在这里插入图片描述
这里的LPTIM1_IRQ_callback是个空指针,最终导致硬件错误。

相关文章:

  • Python中的变量、赋值及函数的参数传递概要
  • 副本(Replica)在Elasticsearch中扮演什么角色?
  • 会议室钥匙总丢失?换预约功能的智能门锁更安全
  • PostgreSQL部署
  • 【OpenSearch】高性能 OpenSearch 数据导入
  • MSVC支持但是Clang会报错的C++行为
  • Armv7l或树莓派32位RPI 4B编译faiss
  • 【多线程初阶】线程状态 线程安全
  • AI书签管理工具开发全记录(六):前端管理基础框框搭建 Vue3+Element Plus
  • 跳动的爱心
  • PowerDesigner通过SQL反向生成类图
  • 【面试】喜茶Java面试题目
  • Axure疑难杂症:中继器图片替换功能优化(支持修改已有记录-玩转中继器)
  • C++ 游戏开发详细流程
  • 当 Python 遇上 Go:Sponge 如何成为替代 Django/Flask 的理想选择
  • JVM——回顾:JVM的起源、特性与系统构成
  • 无人机多旋翼倾转动力测试系统-适用于(eVTOL开发、缩比模型测试、科研教育)
  • 处理知识库文件_编写powershell脚本文件_批量转换其他格式文件到pdf文件---人工智能工作笔记0249
  • PHP 垃圾回收高级特性
  • dockers搭建mysql环境
  • 临汾推广型网站建设/网站目录结构
  • 网站建设网络推广首选公司/深圳做网站的公司
  • 网站定制哪家比较好/seo简单优化
  • 杭州下城网站建设/江苏做网站的公司有哪些
  • 受欢迎的广州做网站/网址之家
  • 杭州设计院/关键词seo教程