目录

单片机 msp430程序跑飞原因和解决方式积累

MSP430 数组填充越界引起的栈溢出 导致程序跑飞

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


单片机 msp430程序跑飞原因和解决方式积累

1.中断或主函数中有死循环,现象是程序停在某处。
2.堆栈溢出。现象是程序跑飞。
**************************************************************************************************

3、是否开了中断但是没有用。如:

开了中断:

TA0CCTL0 = CCIE;                          // CCR0 interrupt enabled
  TA0CCTL1 = CCIE;                          // CCR1 interrupt enabled//时间周期1使能
  TA0CCTL2 = CCIE;                          // CCR2 interrupt enabled//时间周期2使能
  TA0CCTL3= CCIE;                          // CCR3 interrupt enabled//时间周期3使能

但是:

定时器中:

case 4: (  TA0CCTL2 = CCIE;  )和 case 6: (  TA0CCTL3= CCIE;  )内没有处理的程序。

……
  case 2:
    TA0CCR1 +=1024;                // Add Offset to CCR2
    SecondReach=1;
    CountToMunite++;
    Rquestinterval++;
    SecondTimecount++;
    break;                         // CCR4 not used
  case 4: 
     break;
  case 6:
    break;
  case 8:
    break;                         // CCR3 not used
……

4、数组越界。定义的数组只有50个单元,但是程序运行的过程中,却给他赋给50+个单元。

解决办法:
A.看中断有没有用 _EINT(),引起中断嵌套. 
B.Project--Options--General Options---Stack/Heap 将Stack size设置大一些。     (堆栈溢出)
3.中断耗时太长,刚出中断又进去了.这时的现象是程序一直在中断中执行,回不到主函数。 (中断嵌套)
4.检查CPU的电源是不是稳定,msp430在要保证程序正常运行,需保证Vcc大于1.8V。当电压低至0.8V时,程序仍有可能执行。这时的现象是PC指针乱飞,有复位,死机,停在中断,时钟频率发生变化等现象。
5.程序编译没问题,下载程序后上电不断复位,该问题是由于WDT造成的(RAM的初始化时间大于WDT默认的32MS时间,因此MSP复位)根本原因是初始化的时间过长,超过了看门狗的时间,初始化完成以后才能进入main函数,这时关狗已经来不及了。
解决的办法:
A 对你的数组用 __no init_定义,上电编译器不产生特殊的附加函数去初始化RAM.
B 在Project--Options--Linker--Config中选择 Override default programe,并将Entry lib 设置成 __program_start这时要修改Cstartup.S43(记得把它加入复制到工程而不是修改系统的),在第一条指令前加入关狗的指令,在main函数里再开(如果需要的话)。 
如果用汇编,则没有这个问题

http://topic.csdn.net/u/20100730/09/45f212a1-0354-4b73-ad62-335b5955c0f2.html

**************************************************************************************************

6、把无用的中断允许关掉。

MSP430 数组填充越界引起的栈溢出 导致程序跑飞

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

//main.cpp 
int a = 0; 全局初始化区 
char *p1; 全局未初始化区 
main() 

int b; 栈 
char s[] = "abc"; 栈 
char *p2; 栈 
char *p3 = "123456"; 123456\0在常量区,p3在栈上。 
static int c =0; 全局(静态)初始化区 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
分配得来得10和20字节的区域就在堆区。 
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 
}

二、堆和栈的理论知识 
2.1申请方式 
stack: 
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 
heap: 
需要程序员自己申请,并指明大小,在c中malloc函数 
如p1 = (char *)malloc(10); 
在C++中用new运算符 
如p2 = (char *)malloc(10); 但是注意p1、p2本身是在栈中的。

堆栈,堆栈,堆和栈的区别 - 任我行 - C++博客

12月3日  MSP430 堆栈溢出 解决

MSP430程序在运行的过程中,出现死机的现象,通过IAR编译器观察,死机的原因是栈溢出。

因为定义的局部变量是在栈内的,所以分析可能是局部变量导致栈溢出,最有可能导致编译器不能事先判断

使用了多少栈的(超出设定值会报警),就是程序中产生新的占用栈的变量,由之前的经验推测是数组越界,因为如果程序不顾数组的边界,越界不断的往里填东西,越界的部分就会被当成局部变量,占用栈的内存。

因为栈是从RAM的底部网上长(存数据)的,而其他程序运行的数据是从顶部往下的,所以当栈越存越多,越积越高的时候,栈就会和程序运行时的数据碰头,二者占满整个RAM内存,此时栈再继续消耗,栈再向上长,直接覆盖掉程序运行时所需的变量,程序就要跑飞了。

(iar430中定义的变量是从ram的起始地址向上(由小到大),而堆栈是从ram的终止地址向下(由大到小)。
以msp430F5438为例,它是16KB的ram,起始地址为0x1C00h,终止地址为005BFFh(data sheet 15页),所以它的变量是从0x1C00h开始,向0x005BFFh方向存放,而堆栈是从0x005BFFh开始,向0x1C00h方向压栈。当变量存储空间和堆栈最大占用空间在中间相遇时,就发生了堆栈溢出。)

下面就详细介绍如何查看ram使用情况:

1   当然是烧程序到目标板里呀
2   选择view/memory,打开memory窗口

3   从ram的起始地址0x1C00h开始,输入0x3fff(16KB),再回车

4  选中0x1C00h~0x005BFFh区域,右键选择memory fill……

5  在memory fill中的start写入:0x1C00h,length写:0x3fff,value填入FF(也可填入其他值),被选中的区域全填充FF

6  运行程序,跑一遍设计的所有功能,再停止cspy,看看memory窗口

7  如果再填充的区域内已经没有FF存在,就说明已经发生堆栈溢出或是会有溢出的危险(ram刚好够用)。最好保留一定余量的ram不被改变,以防发生溢出

验证:定义一个UART0_RX_HEX_BUF[400];

在程序中加入这个代码。

unsigned int i;

for(i=0;i<17000;i++)

UART0_RX_HEX_BUF[i]=0xFA;

因为MSP430的RAM只有16KB,所以填17000次(char)足以保证栈全部占满RAM,覆盖掉所以运行程序的变量,导致跑飞。

程序运行结果是,程序跑飞。产看栈STACK,栈溢出。假设应该是正确的。

因而分析导致栈溢出的程序段应该是这里:

红色部分当时是为了避免中断程序过长跟不上中断,使得数据收不全而去掉的,现在分析if(UART0_RX_HEX_Len >= UART0_RX_HEX_MAXLen)

UART0_RX_HEX_Len = 0;

这两句子不能去掉,因为,在没有接收到协议数据(配置数据,FE……FA)之前,UART0_RX_HEX_BUF和UART0_RX_BUF一样在接收返回的AT指令返回,数组在不断的填装,UART0_RX_BUF每隔一段时间就会被读取一次,并清空,因而不会出现溢出。但是在没有收到配置数据之前,UART0_RX_HEX_BUF不会清空,且在配置完之后,只要服务站不发协议数据,也不会清空,因而UART0_RX_HEX_BUF基本处于只填装不清空的状态,最后远远越界,最终导致开头分析的结果。

加了清零语句:

if(UART0_RX_HEX_Len >= UART0_RX_HEX_MAXLen)

UART0_RX_HEX_Len = 0;

后,死机在12小时内在没有出现,其他比对机器全部死机,初步证明分析应该是正确的。

#pragma vector=USCI_A0_VECTOR

__interrupt void USCI_A0_ISR()

{

UCA3TXBUF=UCA0RXBUF;//把接收的数据发到U3便于观察(LCX注)

//接收字符数据时

UART0_RX_BUF[UART0_RX_Len] = UCA0RXBUF;

UART0_RX_Len++;

ReadUART0_new=Read_Cycle;

//接收协议数据时(16进制)

UART0_RX_HEX_BUF[UART0_RX_HEX_Len] = UCA0RXBUF;

if((UART0_RX_HEX_BUF[UART0_RX_HEX_Len]==0xFF)&&(UART0_RX_HEX_BUF[UART0_RX_HEX_Len-1]==0xFE))

{

UART0_RX_HEX_BUF[0]=UART0_RX_HEX_BUF[UART0_RX_HEX_Len-1];

UART0_RX_HEX_BUF[1]=UART0_RX_HEX_BUF[UART0_RX_HEX_Len];

UART0_RX_HEX_Len=1;

}

else if((UART0_RX_HEX_BUF[UART0_RX_HEX_Len]==0xFA)&&(UART0_RX_HEX_BUF[UART0_RX_HEX_Len-1]==0xFF))

{

ReadUART0_Permit=1;

UCA0IE &= ~ UCRXIE;

}

UART0_RX_HEX_Len++;

if(UART0_RX_HEX_Len >= UART0_RX_HEX_MAXLen)

UART0_RX_HEX_Len = 0;

}

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

2012-04-13 21:49:03

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程序跑飞原因和解决方式积累相关推荐

  1. c语言 执行free函数程序被卡住,FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法...

    FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法 时间:2019-08-10 14:39:47  来源:  作者:  所属栏目:其他服务端 这里将告诉您FreeRT ...

  2. xp系统运行php,window_Xp系统安装或运行软件时提示“EXE不是有效Win32应用程序”的故障原因及解决方法,部分Xp系统用户在双击安装某 - phpStudy...

    Xp系统安装或运行软件时提示"EXE不是有效Win32应用程序"的故障原因及解决方法 部分Xp系统用户在双击安装某个软件时,会遇到"EXE不是有效Win32应用程序&qu ...

  3. 单片机程序跑飞死机的几种原因

    在使用单片机过程中,经常会出现程序运行一段时间后,不能够正常相应的情况.一般分为软件原因和硬件原因,其中硬件原因比较容易查,软件原因就较为复杂. 软件导致单片机死机的原因 1.指针异常 指针未初始化或 ...

  4. MSP430程序跑飞原因

    MSP430单片机的程序有时候容易出现跑飞的情况,导致运行不正常.常见原因总结如下: 没有设置停止看门狗,也没有及时喂狗 没有定义中断函数,但又开启了对应的中断,发生中断时,找不到中断函数入口 供电电 ...

  5. 简述计算机日常死机故障维修方法,计算机常见故障及解决方法

    如今,无论在学习工作,还是生活娱乐方面,计算机已经成为我们日常生活中不可缺少的一部分.然而,在我们使用电脑的过程当中,或许由于操作不当或者质量等问题,总会出现这样或那样的故障.一般来说,计算机的常见故 ...

  6. amd显卡linux卡死,Radeon 520显卡使用amdgpu时的死机问题 [不用点进来看了,解决方法是换一台电脑]...

    硬件:Dell Inspiron 15-3576,Intel Core i5-8250U/UHD620+AMD Radeon 520(核心为Hainan,GCN1.0/Southern Island) ...

  7. java.exe应用程序出错_EXPLORER.EXE应用程序错误的原因和解决办法

    在使用电脑到时候经常会碰到EXPLORER.EXE应用程序错误,很多人找不到具体原因就乱杀毒和重装系统,这样既浪费时间又麻烦,有时还不一定能解决问题,下面我爱电脑网小编收集导致EXPLORER.EXE ...

  8. 计算机主机不启动的原因,电脑开不了机怎么办 电脑不能开机的原因与解决办法 (全文)...

    电脑开不了机怎么办?电脑开机的原因很多,有硬件问题和软件问题.硬件可能是主板.硬盘引起的,软件可能是有BIOS程序.操作系统引起的.本文小编总结归纳了一些常见.典型的开机故障解决技巧,这些都是经过长期 ...

  9. 跨域产生的原因和解决方法_板式家具开料机加工过程产生崩边原因及解决方法...

    家具厂数控开料机加工材料的时候会遇到材料崩边的问题,下面我们系统的分析下产生的原因以及解决的办法 产生崩边现象的原因? 其一是材料本身问题.目前除了实木家具,目前使用较多的就是 板式贴皮的材料,板材的 ...

最新文章

  1. B1007 素数对猜想
  2. Python中 __init__的通俗解释是什么?
  3. 张善友:自由之精神,中国之队长
  4. 软件工程导论 08章软件维护
  5. 信息检索 IR 中的评价指标
  6. Redis Zui佳实践:7个维度+43条使用规范,带你彻底玩转Redis
  7. Python爬取曾今的K歌
  8. 初学js---动态生成表格
  9. 死神来了~~~~~~~~
  10. LeetCode动画 | 218.天际线问题
  11. 推荐一好玩的苹果手机游戏应用
  12. 【云计算】私有云是什么?主要集中在哪些行业?与公有云有什么区别?
  13. Anaconda3 jupyter 警告:FutureWarning: reshape is deprecated and will raise in a subsequent release.
  14. LeetCode——1737. 满足三条件之一需改变的最少字符数(Change Minimum Characters to Satisfy One of Three...)——分析及代码(Java)
  15. Shell脚本工具xsync
  16. PSPad自定义语法高亮,notepad++自定义语言格式
  17. MarioGPT自动生成“超级玛丽”;周鸿祎:ChatGPT可能产生意识;国内版ChatGPT复旦首发,但“非常不成熟”...
  18. 把悲伤留给自己,仅仅只留给自己……
  19. js打印数组,js打印对象的方法(100遍)
  20. 在虚拟机VirtualBox7.0.6+openEuler20.03TSL上安装部署openGauss3.1.1数据库快速(一键)安装指导手册

热门文章

  1. DuDuTalk:地产行业如何用智能工牌和语音分析打造标准化接访流程,批量复制金牌置业顾问?
  2. ADS-B及其GPS数据异常分析
  3. select去重 sqlserver_sqlserver查询去掉重复数据的实现
  4. 论文阅读之A Challenge Dataset and Effective Models for Aspect-Based Sentiment Analysis(2019)
  5. 西门子PORTAL精简屏下载程序后很多参数无数据,显示####
  6. C++中的this关键字
  7. MySQL表空间碎片整理
  8. Java 操作Windows10+ 共享文件 SMBJ库的基本使用
  9. python点阵显示数字_led点阵——字母显示(可拓展,python脚本)
  10. 企企通SRM:如何做好供应商管理?这些步骤不可少