[STM32F1] stm32进入HardFault_Handler函数,如何解决?

[复制链接]
9902|39
 楼主| andy93762 发表于 2015-5-14 16:03 来自手机 | 显示全部楼层 |阅读模式
我的程序总会在运行一段时间后(有时候半小时或者一小时),进入HardFault_Handler函数,然后就死机了。
在网上查找了下,其原因无非就是
1.内存溢出或者数组访问越界
2.堆栈溢出

通过调试 发现程序在运行下面程序后,进入了hardfault handler
u16 USART2_RX_STA=0;
u8   USART2_RX_BUF[1024];
u8* GSM_check_cmd(u8 *str) //字符串比较函数
{
        char *strx=0;
        if(USART2_RX_STA&0X8000)                //接收到一次数据了
        {
                USART2_RX_BUF[USART2_RX_STA&0X3FF]=0;//添加结束符
                strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
        }
        return (u8*)strx;
}

感觉这个函数是没有问题的啊,为啥会进入hardfault handler

mark0668 发表于 2015-5-14 16:08 | 显示全部楼层
进入 HardFault_Handler 可以查看M3,4,0 的内核寄存器看是哪里的问题
天四明 发表于 2015-5-14 16:15 | 显示全部楼层
把接收buffer改小一点试试
 楼主| andy93762 发表于 2015-5-14 16:27 来自手机 | 显示全部楼层
天四明 发表于 2015-5-14 16:15
把接收buffer改小一点试试

接收buffer大应该不影响的吧?
 楼主| andy93762 发表于 2015-5-14 16:28 来自手机 | 显示全部楼层
mark0668 发表于 2015-5-14 16:08
进入 HardFault_Handler 可以查看M3,4,0 的内核寄存器看是哪里的问题

是GSM-check函数有问题。
luofeng2g 发表于 2015-5-14 17:05 | 显示全部楼层
函数写的有问题,
 楼主| andy93762 发表于 2015-5-14 17:07 来自手机 | 显示全部楼层
天四明 发表于 2015-5-14 16:29
我遇到过这样的问题就是通过这样解决的。出现这样的问题一般都是哪里的buffer出了问题出现溢出 ...

我定义的buffer是全局变量,大一点没关系的
 楼主| andy93762 发表于 2015-5-14 17:07 来自手机 | 显示全部楼层
luofeng2g 发表于 2015-5-14 17:05
函数写的有问题,

请问哪里有问题呢?
luofeng2g 发表于 2015-5-14 17:09 | 显示全部楼层
本帖最后由 luofeng2g 于 2015-5-14 17:18 编辑

有没有试过注释掉strstr();?
mmuuss586 发表于 2015-5-14 18:50 | 显示全部楼层
[em:2:
那慢慢试验看哪句引起的,上面程序也没几句;
lkl0305 发表于 2015-5-14 19:55 来自手机 | 显示全部楼层
关注!
 楼主| andy93762 发表于 2015-5-14 20:00 来自手机 | 显示全部楼层
luofeng2g 发表于 2015-5-14 17:09
有没有试过注释掉strstr();?

因为我的程序比较大,很多函数都要调用这个函数,注释掉这个后,整体的功能会有问题,而且hardfault错误出现也很偶然的,可能会几个小时才会出现。
戈卫东 发表于 2015-5-14 20:51 | 显示全部楼层
检查str会不会是NULL
wangyao19920204 发表于 2015-5-14 21:45 | 显示全部楼层
估计内存访问溢出
amanda_s 发表于 2015-5-14 22:10 | 显示全部楼层
可以查看内核寄存器分析一下出错的原因。

Capture.PNG
Capture1.PNG
tangqiao123 发表于 2015-5-14 22:18 | 显示全部楼层
char *strx=0;

strx初始化没有定义指向的地址,所以访问 *strx就会 HardFault_Handler。

评论

人才  发表于 2015-5-15 10:12
huangxz 发表于 2015-5-14 22:26 | 显示全部楼层
万恶的hardfault
westmas 发表于 2015-5-14 23:13 | 显示全部楼层
  char *strx=0;
.....
     return (u8*)strx;
返回一个局部指针?
把strx定义为全局的或加static修饰。

评分

参与人数 1威望 +1 收起 理由
luofeng2g + 1 赞一个!,不过最好还是用malloc动态分配内.

查看全部评分

ticomi 发表于 2015-5-15 08:02 | 显示全部楼层
函数有问题,返回的是局部指针!
runningwzf 发表于 2015-5-15 08:55 | 显示全部楼层
本帖最后由 runningwzf 于 2015-5-15 08:57 编辑

非全局指针都是放在栈里面的,所以一旦返回这个指针就无效了  strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
楼主晒一下这个函数,看你这个函数返回的是怎样的指针
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

290

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部