打印

HardFault_Handler

[复制链接]
2650|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyboy|  楼主 | 2012-6-19 11:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zyboy 于 2012-6-19 12:00 编辑

发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、Return address、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址。


编写问题代码如下:
void StackFlow(void)
{
int a[3],i;

for(i=0; i<10000; i++)
{
  a=1;
}
}

void SystemInit(void)
{
  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;


  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;
  /* Reset PLLCFGR register */
  RCC->;PLLCFGR = 0x24003010;

StackFlow();
  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;
。。。。。。。。。。。。。。
}
DEBUG如下图
SP值为0x20008560,查看堆栈里面的值依次为R0~R3、R12、Return address、PSR、LR, 例如R0(10 27 00 00),  显然堆栈后第21个字节到24字节即为Return address,该地址0x08001FFD即为异常前PC将要执行的下一条指令地址(即StackFlow()后面的语句处 RCC->CR &= (uint32_t)0xFFFBFFFF)
沙发
ff8zgs| | 2012-6-19 13:21 | 只看该作者
这个是说什么?问问题,我只知道发生这种中断,多半都是数组,指针之类的访问溢出。往这方面检查吧。

使用特权

评论回复
板凳
ilovezeno| | 2012-6-19 13:53 | 只看该作者
这个说明了是从哪个指令跳到Hardfault的
还是自己写个嵌入式汇编小程序,在服务例程里把返回地址直接pop到寄存器,看着比较方便吧

使用特权

评论回复
地板
McuPlayer| | 2012-6-19 14:35 | 只看该作者
MDK可以反查堆栈,很容易找到哪个函数导致的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:学海无涯,回头是岸!

101

主题

356

帖子

0

粉丝