打印
[技术问答]

Keil中怎么查到程序出错行

[复制链接]
5098|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
报错如图所示

微信图片_20180802100218.png (60.89 KB )

微信图片_20180802100218.png
沙发
springvirus| | 2018-8-2 15:45 | 只看该作者
记得右键有个可以跳到出错行的选项,当时排查错误时,最后是对0做减法了,用过这个功能

使用特权

评论回复
板凳
734774645| | 2018-8-2 18:23 | 只看该作者
不是错误都有行标记吗

使用特权

评论回复
地板
jasontu| | 2018-8-3 09:59 | 只看该作者
看pc值,就知道是那一行代码,发生了hard fault

使用特权

评论回复
5
dongnanxibei| | 2018-8-4 21:00 | 只看该作者
这种错,不清楚,我记得错误不是都有哪一行错误,哪一行错误的吗

使用特权

评论回复
6
dongnanxibei| | 2018-8-4 21:00 | 只看该作者
这种错,不清楚,我记得错误不是都有哪一行错误,哪一行错误的吗

使用特权

评论回复
7
dongnanxibei| | 2018-8-4 21:00 | 只看该作者
这种错,不清楚,我记得错误不是都有哪一行错误,哪一行错误的吗

使用特权

评论回复
8
zhuomuniao110| | 2018-8-5 18:19 | 只看该作者
截图不全啊。看不明白。

使用特权

评论回复
9
zhuotuzi| | 2018-8-6 18:52 | 只看该作者
编译后的错误警告信息不是有定位?

使用特权

评论回复
10
yklstudent| | 2018-8-6 19:26 | 只看该作者
一个个就没理解楼主的问题就乱解答,我也是醉了

使用特权

评论回复
11
小灵通2018| | 2018-8-6 19:50 | 只看该作者
yklstudent 发表于 2018-8-6 19:26
一个个就没理解楼主的问题就乱解答,我也是醉了

你也是啊。哈哈。

使用特权

评论回复
12
小灵通2018| | 2018-8-6 19:51 | 只看该作者
STM32出现HardFault_Handler故障的原因主要有两个方面:

1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。

2、堆栈溢出。增加堆栈的大小。

使用特权

评论回复
13
小灵通2018| | 2018-8-6 19:51 | 只看该作者

出现问题时排查的方法:

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

注意:寄存器均是32位,且STM32是小端模式。(参考Cortex-M3权威)


使用特权

评论回复
14
小灵通2018| | 2018-8-6 19:52 | 只看该作者

编写问题代码如下:

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、LR、PC、XPRS, 例如R0(10 27 00 00),  显然堆栈后第21个字节到24字节即为LR,该地址0x08001FFD即为异常前PC将要执行的下一条指令地址(即StackFlow()后面的语句处 RCC->CR &= (uint32_t)0xFFFBFFFF)


另一种方法:

默认的HardFault_Handler处理方法不是B .这样的死循环么?楼主将它改成BX LR直接返回的形式。然后在这条语句打个断点,一旦在断点中停下来,说明出错了,然后再返回,就可以返回到出错的位置的下一条语句那儿

__asm void wait()
{
      BX lr
}


void HardFault_Handler(void)
{
    /* Go to infinite loop when Hard Fault exception occurs */
       wait();
}


使用特权

评论回复
15
小灵通2018| | 2018-8-6 19:52 | 只看该作者
以上内容网上找的,应该跟楼主的问题一致了。

使用特权

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

本版积分规则

4

主题

8

帖子

0

粉丝