历史上的今天
今天是:2025年02月23日(星期日)
2021年02月23日 | MSP430重启/频繁重启/跑飞原因分析
2021-02-23 来源:eefocus
1、堆栈溢出导致频繁重启:
案例1:
concern_tower_num为从铁电内读取的数据,因为铁电没有初始化,所以concern_tower_num的值很大
下面的程序一直循环到铁电内concern_tower_num所在位置的值,所以超过了option内所设置的stack的最大容量导致堆栈溢出,重启。
for(int i=0;i
{
data[m]=crane_tower[i].crane_x;
m++;
data[m]=crane_tower[i].crane_y;
m++;
data[m]=crane_tower[i].front_arm_length;
m++;
}
2012.4.20 UESTC
2、数组越界:
定义了一个29字节长度的数组: char back_info[29]={0};
结果给其填充50个字节的内容 memcpy( back_info+19,send_back_data,data_len);,现象是堆栈没有溢出,机器重启。
2012.4.24 UESTC
问
MSP430F147程序总是莫名其妙的重新启动?
已经检查了堆栈没有溢出,WDT依然还是HOLD状态
哪位高手指点一下,还有哪种可能性?
答1:
先看IFG1.0位状态,看是什么原因导致复位
答2:
您测量一下复位脚上的波形,看是否是硬件复位。
答3:
你的工作环境??是不是干扰问题?
是不是指针弄飞了??
答4:
外部有看门狗吗?有的话要先关掉。
答5:
谢谢以上各位的回答:
我的具体情况是原来程序是用查询方式,已经通过测试,没有这个问题
而现在需要添加部分功能,为此把查询方式改为了中断方式(新功能还未添加),
现在已经检查过IFG1.0位0,不是内部看门狗导致复位
外部无看门狗,也无明显干扰源
硬件复位可能性也不大,不过这个可以再测一下!
有可能是指针弄飞等程序错误,但是这种内部程序错误会导致系统复位吗?
答6:
错误写FLASH也能复位,程序超出,复位向量错误等也可能导致复位。
答7:
可能是复位电路问题!
答8:
经测试,不是外部复位电路的问题!
现在问题应该在中断子程序对主函数造成了不确定的影响上,
但是目前仍无法定位问题在哪?
郁闷ing!!!
答9:
是无法进入中断吗还是其他的原因,能具体说的详细些吗。
答10:
呵呵,我的问题是430出现不确定的复位,有时运行几分钟就复位,有时能到几十分钟
而在这之前,我的程序是用的查询方式处理外部事务,一直运行正常,没有这个问题
现在改为中断来处理外部事务,就出现了莫名的复位问题
中断是能正常进入的!!
通过几天的排查,现在问题应该在中断子程序对主函数造成了不确定的影响,
从而导致了系统复位。但无法定位问题所在!
答11:
检查一下数据指针吧,是否超出内存范围,看现象可能是这方面的影响
答12:
程序发出来看看,不然干说也是查不出来
答13:
一个中断一个中断使能,一个一个排查。多试几次就是了。把问题分块一个一个来。看哪个出的问题
这个跟单片机支持的断点个数也是有关的。如果只支持一个断点,你设置了2个,然后复位的话就容易跑到Cstart而不是Main。另外要注意IAR run to Main的复选框你勾上没?
案例二:跑飞
void send_basic_data_to_dis_part()
{
char basic_data_buf[60]={0};
char frame_head[2]={0xFE,0xFB},frame_end[2]={0xFE,0xFA};
char frame_len[1]={0x45},frame_type[1]={0x40};
char bCRC[2]={0,0};
char tower_num[1]={0x08};
unsigned int addr=0;
addr=split_joint_hex_data( basic_data_buf,addr,frame_head,2);
addr=split_joint_hex_data( basic_data_buf,addr,frame_len,1);
addr=split_joint_hex_data( basic_data_buf,addr,frame_type,1);
addr=split_joint_hex_data( basic_data_buf,addr,tower_num,1);
for(uint8 i=0;i
{
addr=split_joint_hex_data( basic_data_buf,addr,(char*)(&crane_tower[i].lcd_x),2);
addr=split_joint_hex_data( basic_data_buf,addr,(char*)(&crane_tower[i].lcd_y),2);
addr=split_joint_hex_data( basic_data_buf,addr,(char*)(&crane_tower[i].dis_fore_r),2);
addr=split_joint_hex_data( basic_data_buf,addr,(char*)(&crane_tower[i].dis_back_r),2);
}
CRC16(bCRC,basic_data_buf+2, addr-2); //数据CRC校验
addr=split_joint_hex_data( basic_data_buf,addr,bCRC,2);
addr=split_joint_hex_data( basic_data_buf,addr,frame_end,2);
UART2_Send_Buf(basic_data_buf,addr);
}
//basic_data_buf[60]数组所开辟的长度为60,但是在下面从basic_data_buf首地址起填装数据的过程当中,填写的数据长度超过了60,数组越界,破坏了栈内保持的进入send_basic_data_to_dis_part()函数之前保存的现场数据,结果跳出该函数调用,要执行下步的时候,由于SP内的值已经被修改,导致程序跑飞。(这种情况症状往往表现为:进入某个函数内正常,在跳出的时候就跑飞,多为在函数内SP的指针被修改)
跑飞三:
程序中有 mallco()动态申请内存空间,却没有相应的释放,结果内存消耗完毕,程序跑飞。
下一篇:基于MSP430的湿度计及定标
史海拾趣
|
关于直插LED与SMDLED和大功率LED的投资分析 因近段时间有很多朋友问关于投资以上三类型的LED,个人仅发表一些看法: 1.直插LED投资发展最快的几年是在02年至05年(相信这时候开厂的已经赚的盆满钵满了);凡有钱的都做直插的LED了,并且现在有很 ...… 查看全部问答> |
|
windowsXP DDK 如何连接一个中断?(KInterrupt?) 我只找到了KInterrupt这个类:但是问题出现如下 KInterrupt::Initialize 两种 格式 FORM 2: (WDM) VOID Initialize( KIRQL irql, ULONG vector, KINTERRUPT_MODE Mode, ...… 查看全部问答> |
|
marvell的cpu智能机板子,要做一个自己的下载工具 email:killbug2004@gmail.com 另外麻烦讲一下基于usb下载的流程 中间有个VerifyImage不懂,文件下载id设置也不太清楚 谢谢达人… 查看全部问答> |
|
1。在仿真中,有些非端口信号,例如SIGNAL ,VARIABLE,在node finder的 all list中 还是没有,没法建立它们的仿真波形,该怎么办,而且有的SIGNAL可以看到,有的看不到,这是为什么?(QUARTUSII) 2。在PROCESS中,这个PROCESS是 TYPE state IS ...… 查看全部问答> |
|
我正要做一个项目,输入信号是±4V,显示范围是0---99999,要求输入信号变化时,显示数据的最后一个位的最小变化是一个字。 即00001-00002---00003向这样的趋势变化,请问我要选择几位的A/D芯片呢,是怎样计算出来的呢? 还请指教!!!… 查看全部问答> |
|
在网上有下了《51+sl811读写U盘的源程序+原理图》的原代码,但找不到原理图,请问哪位大哥有可以寄一份给我,或告知下载地址。谢谢! 我邮箱是: power_wjc@163.com… 查看全部问答> |
|
我用1394转接卡接一个摄像头,然后在屏幕上实时的显示摄像头拍得图像,但是在启动初始化的时候(大概10次中有1次),显示在屏幕上的图像错位了,图像的1/3跑到下面去了,而且一直保持这样,要让图像正常只能重启,有人说是同步问题,但我觉得不像, ...… 查看全部问答> |
|
我编译binutils到ARM上用,可是没有make过,请帮忙看一下!! 我先是 ./configure -target=arm-linux生成 Makefile 然后执行 make ,提示如下: // 我查了一下 regex.c中定义了个 char *malloc(); 在stdlib.h中void *malloc (size_t __size),我用的是gcc编译器,如果函数重载c++也可以通过 make[1]: Leav ...… 查看全部问答> |
|
STLINK 与STM8连接不成功。附图:硬件连接有问题吗?或者是STVP的配置有问题。 现在不是下载或者调试问题,而是STLINK识别不到有STM8S的存在:can not connect the device (当时的消息栏忘记抓图了) 初次使用STM8S(具体型号是STM8S103F3P ...… 查看全部问答> |




