打印
[STM32F1]

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

[复制链接]
8432|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我的程序总会在运行一段时间后(有时候半小时或者一小时),进入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大应该不影响的吧?

使用特权

评论回复
5
andy93762|  楼主 | 2015-5-14 16:28 | 只看该作者
mark0668 发表于 2015-5-14 16:08
进入 HardFault_Handler 可以查看M3,4,0 的内核寄存器看是哪里的问题

是GSM-check函数有问题。

使用特权

评论回复
6
luofeng2g| | 2015-5-14 17:05 | 只看该作者
函数写的有问题,

使用特权

评论回复
7
andy93762|  楼主 | 2015-5-14 17:07 | 只看该作者
天四明 发表于 2015-5-14 16:29
我遇到过这样的问题就是通过这样解决的。出现这样的问题一般都是哪里的buffer出了问题出现溢出 ...

我定义的buffer是全局变量,大一点没关系的

使用特权

评论回复
8
andy93762|  楼主 | 2015-5-14 17:07 | 只看该作者
luofeng2g 发表于 2015-5-14 17:05
函数写的有问题,

请问哪里有问题呢?

使用特权

评论回复
9
luofeng2g| | 2015-5-14 17:09 | 只看该作者
本帖最后由 luofeng2g 于 2015-5-14 17:18 编辑

有没有试过注释掉strstr();?

使用特权

评论回复
10
mmuuss586| | 2015-5-14 18:50 | 只看该作者
[em:2:
那慢慢试验看哪句引起的,上面程序也没几句;

使用特权

评论回复
11
lkl0305| | 2015-5-14 19:55 | 只看该作者
关注!

使用特权

评论回复
12
andy93762|  楼主 | 2015-5-14 20:00 | 只看该作者
luofeng2g 发表于 2015-5-14 17:09
有没有试过注释掉strstr();?

因为我的程序比较大,很多函数都要调用这个函数,注释掉这个后,整体的功能会有问题,而且hardfault错误出现也很偶然的,可能会几个小时才会出现。

使用特权

评论回复
13
戈卫东| | 2015-5-14 20:51 | 只看该作者
检查str会不会是NULL

使用特权

评论回复
14
wangyao19920204| | 2015-5-14 21:45 | 只看该作者
估计内存访问溢出

使用特权

评论回复
15
amanda_s| | 2015-5-14 22:10 | 只看该作者
可以查看内核寄存器分析一下出错的原因。

Capture.PNG (68.06 KB )

Capture.PNG

Capture1.PNG (73.84 KB )

Capture1.PNG

使用特权

评论回复
16
tangqiao123| | 2015-5-14 22:18 | 只看该作者
char *strx=0;

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

使用特权

评论回复
评论
liguang02 2015-5-15 10:12 回复TA
人才 
17
huangxz| | 2015-5-14 22:26 | 只看该作者
万恶的hardfault

使用特权

评论回复
18
westmas| | 2015-5-14 23:13 | 只看该作者
  char *strx=0;
.....
     return (u8*)strx;
返回一个局部指针?
把strx定义为全局的或加static修饰。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
luofeng2g + 1 赞一个!,不过最好还是用malloc动态分配内.
19
ticomi| | 2015-5-15 08:02 | 只看该作者
函数有问题,返回的是局部指针!

使用特权

评论回复
20
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

粉丝