【单片机重启】MSP430重启/频繁重启/跑飞原因分析

来源:本站
导读:目前正在解读《【单片机重启】MSP430重启/频繁重启/跑飞原因分析》的相关信息,《【单片机重启】MSP430重启/频繁重启/跑飞原因分析》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《【单片机重启】MSP430重启/频繁重启/跑飞原因分析》的详细说明。
简介:经验帖:总结MSP430重启/频繁重启/跑飞原因分析。

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重启/频繁重启/跑飞原因分析》最后刷新时间 2024-03-14 01:08:56,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《【单片机重启】MSP430重启/频繁重启/跑飞原因分析》该内容的真实性请自行鉴别。