历史上的今天
今天是:2024年12月25日(星期三)
2019年12月25日 | 单片机程序死机跑飞查找原因
2019-12-25 来源:eefocus
单片机程序死机,跑飞了可以从以下几个方面查找原因:
1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象
2. 中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。
3. 地址溢出,常见错误为指针操作错误。我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。
4. 无条件的死循环;比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制;
5. 看门狗没有关闭。有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗;
6. 堆栈溢出。最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当你把以上几条都试过不能解决问题,试一
试把你的被调用少函数直接内置到调用的地方并且把占用RAM大的局部变量改成全局变量,试一试说不定就可以了。
今天在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象、原因及解决方法。
一、数组越界(数组溢出)
现象:单片机程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞。
原因:数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句ucDataBuff[10]=0x1a,这个语句是给数组的第11个元素赋值,:由于定义的数组只有10个元素,从而导致赋值语句中不知道把0x1a放到什么地方,从而导致程序跑飞。
解决方法:如果在调试程序时,发现程序总是在函数执行完毕时跑飞,多数情况是发生了数组越界(数组溢出)的错误,仔细检查函数中调用的数组是否存在越界(溢出)的情况。
二、中断服务程序缺失
现象:程序运行过程中总是跑飞。
原因:程序中打开了某个中断,但是却没有相应的中断服务程序,从而导致在中断发生后,找不到中断服务程序入口,从而导致程序跑飞。
解决方法:检查程序中是否存在打开了某个中断,但是没有相对应的中断服务程序。
三:看门狗复位
现象:在执行一段较为好费时间的程序时,程序跑飞,并且总是跳到复位位置处。
原因:程序中使用了看门狗,但是没有及时“喂狗”,从而导致看门狗复位,使程序直接跳到复位位置。
解决方法:根据程序运行时间,尤其是一定要计算清楚最耗时的那段程序的运行时间,然后准确设置看门狗的复位时长,定时“喂狗”,尤其是如果有死循环的情况,一定要在死
循环中记得“喂狗”。
四:启用了中断,就一定要设置中断函数,并要关闭中断标志。
五:乱用指针也可能造成这种
下一篇:单片机防干扰的设计经验
史海拾趣
|
我发的贴,如下 http://topic.eeworld.net/u/20100528/13/fc32eafe-a232-45de-aff6-eaa81c5d2bc5.html?97042… 查看全部问答> |
|
有谁可以帮我讲解一下AD598各引脚的作用,以及怎样设计AD598的外围元件,急!!!!!!!!! 我的QQ:283970042 多谢各位大师啊… 查看全部问答> |
|
LED被称为第四代照明光源或绿色光源,具有节能、环保、寿命长、体积小等特点,可以广泛应用于各种指示、显示、装饰、背光源、普通照明和城市夜景等领域。近年来,世界上一些经济发达国家围绕LED的研制展开了激烈的技术竞赛。 出光率决定LED ...… 查看全部问答> |
|
`timescale 100ns/10ns 说时间精度 syntax error unexpected “base”,expecting“class”请问是怎么回事啊 急问啊??????… 查看全部问答> |
|
武汉某位于光谷电子公司,发展前景颇大,目前公司规模约90人,诚恳招纳有意在武汉工作的贤才志士。请有意者将个人最新简历发至terrac@126.com注:因公司政策及行业性质,且薪资范围已明确,不便透露公司名称。感兴趣者我可私信或邮件告知公司相关情 ...… 查看全部问答> |
|
谁有郭黎利版的 《扩频通信系统的fpga设计》 一书里的代码? 这本书应该来说是还可以的,特别是里面原理的讲解比较好,但是里面的代码错的有点多,应该都是在排版的时候把代码改动了,好多低级的错误,有点没法忍。。。不知 ...… 查看全部问答> |
|
【STM32F7英雄联盟大赛】多功能串口侦测工具---界面设计 在应用STemWin设计GUI时,可以先用GUIBuilder.exe软件设计界面,其使用非常简单,完全后PC中的VB等软件的使用很类似,点击控件添加在窗体上,可以对窗体的一些属性进行设置,不过,不能对控件的全部属性进行 ...… 查看全部问答> |




