打印
[STM32F1]

如何查找STM32试图切入ARM状态造成的用法Fault的原因

[复制链接]
5295|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序运行过程如下

PC出栈后PC为0

再往下运行进入HardFault_Handler(void);
查找手册,试图切入ARM状态下时进入fault,PC指针入栈的值被手工改坏造成的,可是什么时候改动PC的值呢?


沙发
aozima| | 2014-7-9 12:09 | 只看该作者
你如何确定是因为要试图进入ARM模式呢?而不是其它的原因?如写穿?
为何不用socket接口?

下面两个贴子可以看下
https://bbs.21ic.com/icview-398835-1-1.html
http://www.rt-thread.org/phpBB3/topic2300.html

使用特权

评论回复
板凳
pattywu| | 2014-7-9 12:25 | 只看该作者
产生hardfault的原因,大部分是下面2种情况:
1> 程序中有野指针,导致堆栈破坏;
2> Cortex-M3处理器中,线程模式代码访问了NVIC的相关内容。

使用特权

评论回复
地板
_Hanking|  楼主 | 2014-7-9 12:30 | 只看该作者
进入中断后我查看了那几个fault状态寄存器

UFSR寄存器中INVSTATE为1,为试图切入ARM状态

使用特权

评论回复
5
_Hanking|  楼主 | 2014-7-9 12:58 | 只看该作者
aozima 发表于 2014-7-9 12:09
你如何确定是因为要试图进入ARM模式呢?而不是其它的原因?如写穿?
为何不用socket接口?

进入中断后,UFSR寄存器中INVSTATE为1,为试图切入ARM状态

使用特权

评论回复
6
_Hanking|  楼主 | 2014-7-9 15:27 | 只看该作者
没人了顶顶

使用特权

评论回复
7
_Hanking|  楼主 | 2014-7-10 11:42 | 只看该作者
原因找到是一个数组引起的
void diy_send_data_to_server(void)
{
        static char buf[256]={0};
        u8 i,j;
        float data=0;
        u8 ti[6]={0};
        diy_get_os_time_6(ti);
        for(i=0;i<MAX_METER_COUNT;i++)
        {
                    for(j=0;j<MAX_FUNC_COUNT;j++)
                {
                        if(0!=diy_get_port_data(i,j,&data))
                                continue;
                         sprintf(buf,"20%2d-%2d-%2d %2d:%2d:%2d |%4d|%4d|%f",ti[0],ti[1],ti[2],ti[3],ti[4],ti[5],i,j,data);
                        diy_udp_send(udpserversend,(void *) buf,strlen(buf),diy_get_server_ip(),diy_get_server_port());
                }
               
        }
        return;
}
buf数组不加static就会出错,加上static就没问题,这是什么原因?

使用特权

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

本版积分规则

7

主题

37

帖子

2

粉丝