当前位置: 首页 > news >正文

【单片机重启】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()动态申请内存空间,却没有相应的释放,结果内存消耗完毕,程序跑飞。

相关文章:

  • 【堆和栈的区别】堆heap 和栈stack有什么区别(代码区、常量区、静态区(全局区)、堆区、栈区)...
  • 【MODBUS】 协议
  • 【单机片调试】开发调试MSP430 遇到的问题总结
  • 【单片机程序和RAM】程序在RAM中调试的运行方式程序固化后运行方式
  • 【关于单片机的N多问题】关于单片机的N多问题
  • 【volatile关键字】 详解C中volatile关键字(IAR 优化等级问题)
  • 【下载进去无法运行】MSP430 程序能下载进去却无法运行
  • 【文章收藏】文章收藏
  • 【DATA16DATA20】MSP430中的DATA16和DATA20【Data model Large】
  • 【编程经验总结】编程经验总结
  • 【精确延时函数】IAR(MSP430)中的精确延时函数
  • 【Clng与Cint】clng与cint的区别及防溢出函数
  • 【寻址方式】直接寻址、位寻址、立即数寻址、寄存器寻址等
  • 【高效单片机语言结构】怎样最好地使用MSP430 编译器的建议
  • 【RS-485收发切换】使用RS-485要注意的一个问题
  • php的引用
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 08.Android之View事件问题
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • HTML5新特性总结
  • input实现文字超出省略号功能
  • React-Native - 收藏集 - 掘金
  • Spark RDD学习: aggregate函数
  • 力扣(LeetCode)21
  • 爬虫模拟登陆 SegmentFault
  • 前端路由实现-history
  • 前端面试总结(at, md)
  • 小李飞刀:SQL题目刷起来!
  • 用element的upload组件实现多图片上传和压缩
  • C# - 为值类型重定义相等性
  • Java数据解析之JSON
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​flutter 代码混淆
  • # 安徽锐锋科技IDMS系统简介
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (42)STM32——LCD显示屏实验笔记
  • (差分)胡桃爱原石
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (汇总)os模块以及shutil模块对文件的操作
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)大型网站架构演变和知识体系
  • .Mobi域名介绍
  • .NET 5种线程安全集合
  • .NET 8.0 中有哪些新的变化?
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core 版本不支持的问题
  • .net(C#)中String.Format如何使用
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • /etc/motd and /etc/issue
  • [ IO.File ] FileSystemWatcher
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images