单片机程序死机跑飞查错指南

原创 2013年12月04日 10:45:34

                          单片机程序死机,跑飞了可以从以下几个方面查找原因:

1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象;

2. 中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。

3. 地址溢出,常见错误为指针操作错误。我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。

4. 无条件的死循环;比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制;

5. 看门狗没有关闭。有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗;

6. 堆栈溢出。最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当你把以上几条都试过不能解决问题,试一试把你的被调用少函数直接内置到调用的地方并且把占用RAM大的局部变量改成全局变量,试一试说不定就可以了。

7.大牛们补充下...

详解C语言volatile关键字(禁止编译器优化-原地址读取)

volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储...
  • shaozhanyu
  • shaozhanyu
  • 2013年10月23日 16:44
  • 1679

单片机程序跑飞的原因

1.意外中断。 是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象。 2. 中断变量处理不妥。 若定义某些会在中断中修改的全局变量,这时要注意两个问题...
  • wacflp
  • wacflp
  • 2017年03月28日 15:30
  • 567

14 关于单片机死机的一些问题

博主在最近的一个项目中测试系统的高低温实验,结果意外的发现经过高低温实验后(80℃到-20摄氏度)单片机有些已经死机了,所以不得不着手研究一下这个问题,在网上查阅资料后,基本上可以归结于以下几个问题:...
  • baidu_25505611
  • baidu_25505611
  • 2017年04月22日 09:51
  • 438

单片机/ARM死机的常见原因及解决方案

前几天在写ARM时经常死机,莫名其妙,在这搜集了一些比较好的解答和方案,给大家参考。 可能原因: 一 振荡器停止振荡 又可以分为电源电压不稳,或者强干扰引起的振荡器停振。 ...
  • kelixier
  • kelixier
  • 2016年09月14日 09:24
  • 2150

STM32 BootLoader跳转APP跑飞 可能是因为找不到某些中断函数入口

在做嵌入式产品时,有时为方便更新设备程序(如远程更新或者只更新模块程序等原因),就要用到bootloader对设备进行必要的初始化,引导下载APP等。 STM官网下载的bootloader程序中并没...
  • HuiCMs
  • HuiCMs
  • 2018年01月07日 10:41
  • 69

我来说说单片机裸奔的架构

为什么要裸奔? 理由1:裸奔已经可以满足需求了,那么为什么还要OS? 理由2:os很高大上,但是能被hold住么? 以上两点差不多就OK了。 一般说,单片机,就是搞点简单的东西。简单不是编译,乔布斯总...
  • unsv29
  • unsv29
  • 2016年03月11日 15:55
  • 804

如何提高单片机程序执行效率?

首先什么是执行效率。我们平常所说的执行效率就是使用相同的算法在相同输入条件下完成相同计算所产生的系统开销,目前来说一般会更多关注执行时间方面的开销。所有语言编写的代码最终要运行,都要转化成机器码。在更...
  • u010980705
  • u010980705
  • 2016年09月29日 15:48
  • 994

51单片机多任务操作系统的原理与实现

出处:http://bbs.21ic.com/icview-551028-1-1.html 想了很久,要不要写这篇文章?最后觉得对操作系统感兴趣的人还是很多,写吧.我不一定能造出玉,但我可以抛出砖...
  • wuhenyouyuyouyu
  • wuhenyouyuyouyu
  • 2016年03月14日 09:25
  • 3025

stc15系列单片机 timer组件

/** * 文件名:timer.h */ #ifndef _TIMER_H #define _TIMER_H #define SYS_MCLK 11059200 //系统主时钟 #defin...
  • qq_21411985
  • qq_21411985
  • 2015年05月24日 17:35
  • 1148

Freescale 16位单片机的地址映射

转载自中电网-毛毛的博客,三篇文章重新编辑合为一篇,内容未作任何改动。   原文链接:freescale 16位单片机的地址映射--(1)前言 freescale 16位单片机的地址映射--(2)飞思...
  • alexdu89
  • alexdu89
  • 2014年01月22日 03:22
  • 1181
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单片机程序死机跑飞查错指南
举报原因:
原因补充:

(最多只允许输入30个字)