i (五)stm32工程代码HardFault异常查错调试方法-嵌入式MCU技术-电子人社区 -

电子人社区

 找回密码
 立即注册
今日 : 0|主题 : 4177|排名 : 314 
打印 上一主题 下一主题

(五)stm32工程代码HardFault异常查错调试方法

发表于 2019-1-9 15:50:37 | 91620 只看该作者 回帖奖励 |倒序浏览 |阅读模式

[复制链接]
发表于 2019-1-9 15:50:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电子人社区网讯:   一、导致异常的原因很多,例如:直接使用未分配空间的指针、栈溢出等一场非法操作便会使程序进入HardFault异常状态。下面介绍怎么找出程序中的异常。
  本文引用地址: http://www.21ic.com/app/mcu/201812/782579.htm

  接下来在keil_MDK工程中,编译代码,并debug,之后全速运行,可以看到如下图所示程序进入HardFault异常。

  如下所示我们找到SP寄存器,0x200045B8即为栈地址,栈里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。如图我们看到划红线的地方,注意从右往左看。分别为0x0800427D和0x08004BFA。

  在show code at address中输入0x08004BFA,点击go to即找到出现异常的代码段附近下面要执行的程序。

  我们用同样的方法在show code at address中输入0x0800427D,找到如下代码段

  可以发现异常代码就在uart_send_noackdata这个函数里,这个函数里我们定义了一个指针,没有给他分配空间便开始使用了。由此我们掌握了第一种查找异常的方法。只要记录栈里面第21~24以及25到28字节的内容即可方便的找到异常代码。下面介绍使用.map文件查找异常。.map文件在keil工程里面随着程序的编译会自动生成。

  在.map文件里我们查找0x08004BFA,找到了0x08004bd8指示是uart_send_noackdata函数,到此我们找到了异常代码所在的位置。

  由此我们知道我们只要找到栈里面PC(Return address)、xPSR(CPSR或SPSR)寄存器里的内存地址便可以找到异常代码。
CPSR  当前程序状态寄存器(Current Program State Register)
SPSR  保存的程序状态寄存器(Saved Program State Register), 有6个,主要是在处理异常的时候使用.
  每一种处理器模式下都有一个专用的物理寄存器作为备份的程序状态寄存器SPSR , 当特定的异常发生时,这个物理寄存器负责保存CPSR当前程序状态寄存器的内容, 当异常处理程序返回时,再将内容恢复到当前程序状态器中,继续向下执行原来程序.
  PC
  程序计数器,是用来计数的,指示指令在存储器的存放位置,也就是个地址信息

  • STM32单片机中文官网
  • STM32单片机官方开发工具
  • STM32单片机参考设计

来源:网络转载

 

                                                   转载请注明:电子人社区

0条回复
跳转到指定楼层

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|电子人物联网  

Copyright 2013 最新最精彩-社区论坛 版权所有 All Rights Reserved.

QQ|电子人物联网  

GMT+8, 2024-5-2 03:55 , Processed in 0.110686 second(s), 41 queries.

快速回复 返回顶部 返回列表