程序跑飞原因

程序跑死原因查找

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

2. 中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环

中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。

3. 地址溢出,常见错误为指针操作错误。我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机

,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。

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

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

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

今天在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现
象、原因及解决方法。

一、数组越界(数组溢出)

现象:单片机程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞。
原因:数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句ucDataBuff[10]=0x1a,这个语句是给数组的第11个元素赋值,:由于定义的数组只有10个元素,从而导致赋值语句中不知道把0x1a放到什么地方,从而导致程序跑飞。
解决方法:如果在调试程序时,发现程序总是在函数执行完毕时跑飞,多数情况是发生了数组越界(数组溢出)的错误,仔细检查函数中调用的数组是否存在越界(溢出)的情况。

二、中断服务程序缺失

现象:程序运行过程中总是跑飞。
原因:程序中打开了某个中断,但是却没有相应的中断服务程序,从而导致在中断发生后,找不到中断服务程序入口,从而导致程序跑飞。
解决方法:检查程序中是否存在打开了某个中断,但是没有相对应的中断服务程序。

三:看门狗复位

现象:在执行一段较为好费时间的程序时,程序跑飞,并且总是跳到复位位置处。
原因:程序中使用了看门狗,但是没有及时“喂狗”,从而导致看门狗复位,使程序直接跳到复位位置。
解决方法:根据程序运行时间,尤其是一定要计算清楚最耗时的那段程序的运行时间,然后准确设置看门狗的复位时长,定时“喂狗”,尤其是如果有死循环的情况,一定要在死
循环中记得“喂狗”。

四:启用了中断,就一定要设置中断函数,并要关闭中断标志。

五:乱用指针也可能造成这种

转载自网络

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在查找单片机程序原因时,通常可以尝试以下方法: 1. 调试:使用调试器对程序进行单步跟踪,可以帮助我们找出程序中的错误。 2. 日志:在程序中添加记录日志的代码,记录程序执行过程中的信息,有助于排查问题。 3. 内存检测:使用内存检测工具检测程序是否存在内存泄漏或越界访问的情况。 4. 单元测试:对程序中的独立功能进行测试,有助于发现程序中的问题。 5. 排除法:通过排除可能存在问题的部分,来确定真正的问题所在。 6. 在线问答:在线问答网站或技术论坛中寻求帮助,也可以获得有用的建议。 ### 回答2: 单片机程序原因可能有多种,以下是一些常见的方法来查出原因: 1. 代码调试:通过对程序进行逐行调试,可以找出程序运行到哪个位置出现错误。可以使用单步执行功能,观察变量的值和程序的流程,找出可能导致程序的问题。 2. 堆栈分析:单片机程序在运行过程中会使用堆栈来存储函数的返回地址、局部变量等信息。通过分析堆栈信息,可以找出程序位置。可以使用调试工具或者在代码中插入打印堆栈信息的代码来实现堆栈分析。 3. 查看日志信息:在程序中添加输出日志的功能,记录程序运行过程中的关键信息,可以追踪程序的执行流程。查看日志信息可以帮助定位程序的位置,找到问题所在。 4. 内存检查:程序可能是由于内存访问错误导致的,可以使用内存检查工具来查找内存操作错误。通过检查程序中的内存操作,比如指针越界、内存泄漏等问题,可以找到导致程序原因。 5. 硬件检测:单片机程序问题也可能与硬件有关,例如电源供应不稳定、电路连接错误等。因此,对硬件进行检测和测试,可以排除硬件问题对程序运行的干扰。 综上所述,通过代码调试、堆栈分析、查看日志信息、内存检查和硬件检测等方法,可以帮助我们查出单片机程序原因,从而解决问题并保证程序的正常运行。 ### 回答3: 查出单片机程序原因可以采取以下几种方法。 首先,可以通过调试工具来检测程序的运行情况。通过在程序中添加调试信息,可以实时监控程序的执行过程,并查看变量的值以及执行的代码路径。如果发现程序在某个地方出现异常或,可以通过打印相关信息或添加断点进行排查,定位问题所在。 其次,可以通过日志记录来排查问题。在程序中添加日志记录的功能,可以记录程序的运行状态和关键变量的取值,以便事后分析。当程序时,可以查看相关的日志信息,分析程序在哪个环节出现异常,从而找到问题的原因。 另外,可以通过逐步执行的方式找到问题所在。将程序分成若干个模块,并逐个模块地测试,确定每个模块的正确性。如果程序在某个模块出现异常,可以进一步细分该模块,对其中的具体语句进行测试和排查,最终找到问题所在。 此外,可以利用仿真工具对程序进行仿真分析。通过将程序加载到仿真环境中运行,可以模拟出程序的运行情况,并实时监测程序的执行过程,查看变量的取值情况。如果发现与预期的结果不一致或出现异常情况,可以通过回溯程序的执行路径,找到问题所在。 最后,可以采用硬件调试的方式来找出程序原因。通过硬件调试工具,可以观察程序的运行状态,查看内存的使用情况,以及查看特定寄存器或变量的值。如果发现程序在运行过程中出现异常或,可以通过硬件调试工具进行跟踪和分析,找到问题的根源。 综上所述,通过调试工具、日志记录、逐步执行、仿真分析和硬件调试等方法,可以有效地查找出单片机程序原因
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值