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

[复制链接]
5933|6
 楼主| _Hanking 发表于 2014-7-9 10:54 | 显示全部楼层 |阅读模式
程序运行过程如下
QQ截图20140709104301.png
PC出栈后PC为0
QQ截图20140709104510.png
再往下运行进入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状态寄存器
QQ截图20140709122437.png
UFSR寄存器中INVSTATE为1,为试图切入ARM状态
 楼主| _Hanking 发表于 2014-7-9 12:58 | 显示全部楼层
aozima 发表于 2014-7-9 12:09
你如何确定是因为要试图进入ARM模式呢?而不是其它的原因?如写穿?
为何不用socket接口?

进入中断后,UFSR寄存器中INVSTATE为1,为试图切入ARM状态
 楼主| _Hanking 发表于 2014-7-9 15:27 | 显示全部楼层
没人了顶顶
 楼主| _Hanking 发表于 2014-7-10 11:42 | 显示全部楼层
原因找到是一个数组引起的
  1. void diy_send_data_to_server(void)
  2. {
  3.         static char buf[256]={0};
  4.         u8 i,j;
  5.         float data=0;
  6.         u8 ti[6]={0};
  7.         diy_get_os_time_6(ti);
  8.         for(i=0;i<MAX_METER_COUNT;i++)
  9.         {
  10.                     for(j=0;j<MAX_FUNC_COUNT;j++)
  11.                 {
  12.                         if(0!=diy_get_port_data(i,j,&data))
  13.                                 continue;
  14.                          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);
  15.                         diy_udp_send(udpserversend,(void *) buf,strlen(buf),diy_get_server_ip(),diy_get_server_port());
  16.                 }
  17.                
  18.         }
  19.         return;
  20. }
buf数组不加static就会出错,加上static就没问题,这是什么原因?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

37

帖子

2

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