搜索

单片机程序总跑飞?小技巧帮你忙

[复制链接]
1243|6
 楼主 | 2020-3-26 17:56 | 显示全部楼层 |阅读模式
Hi,同学们熊猫老师来啦~
经常接触单片机的朋友
肯定遇到过单片机程序跑飞的问题
由于程序较为复杂
所以一旦出现跑飞的现象就比较难以查找错误出现的地方
网络上对错误的解释和解决方法也比较五花八门
并不方便查找
小编特意帮大家整理了关于单片机程序跑飞死机的原因
大家快来看看能不能在其中找到自己想要答案吧
668855e7c7c4fd5075.png

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


1、意外中断


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

2、中断变量处理不妥


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

3、地址溢出,常见错误为指针操作错误


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

4、无条件的死循环


比如使用while(x),等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制。

5、看门狗没有关闭

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

6、堆栈溢出

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

通过本篇文章,大家是否找到了自己想要的问题解决方法了呢?就算没有找到,本篇文章也能帮助大家在一定程度上预防跑飞现象的发生。

免责声明:整理本文出于传播相关技术知识,版权归原作者所有。

给我们的公众号来个关注呗~

以上内容来源于公众号「嵌入式ARM」
每天教你一个小知识
扫码关注更多


使用特权

评论回复

评论

grhr 2020-3-31 13:08 回复TA
@hobbye501 :对的 
微信小助手 2020-3-28 20:59 回复TA
@hobbye501 :学习了 (* ̄︶ ̄) 
hobbye501 2020-3-27 14:46 回复TA
还有编辑器优化等级 中断优先级 
| 2020-3-27 10:06 | 显示全部楼层
大工程经常跑飞,确实经常摸不着头脑。自己设置标志位,标志位逻辑判断是否有问题。

使用特权

评论回复
 楼主 | 2020-3-27 13:46 | 显示全部楼层
光轮TreeOS 发表于 2020-3-27 10:06
大工程经常跑飞,确实经常摸不着头脑。自己设置标志位,标志位逻辑判断是否有问题。 ...

跑飞时候过来看看是不是这几个原因

使用特权

评论回复
| 2020-3-27 23:55 | 显示全部楼层
难道电源会引起起?布线不会引起?

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

在线客服 快速回复 返回顶部 返回列表