单片机程序死机,跑飞了能够从以下几个方面查找原因:
1. 意外中止。是否翻开了某个中止,可是没有响应和铲除中端标志,导致程序一向进入中止,形成死机假象
2. 中止变量处理不当。若界说某些会在中止中修正的大局变量,这时要注意两个问题:首要为了避免编译器优化中止变量,要在这些变量界说时前加volatile,其次在主循环中读取中止变量前应该首要封闭大局中止,避免读到一半被中止给修正了,读完之后再翻开大局中止;不然呈现形成数据凌乱。
3. 地址溢出,常见过错为指针操作过错。我要侧重说的是数组下标运用循环函数中循环变量,假如循环变量没操控好则会呈现数组下标越界,意外修正体系的寄存器形成死机,这种情况下假如死机阐明命运好,不然后边不知道产生什么头疼的事。
4. 无条件的死循环;比方运用while(x);等候电平改变,正常情况下x都会变成0,就怕如果,因而最好加上时刻约束;
5. 看门狗没有封闭。有的单片机即便没运用看门狗开机时也有或许意外主动敞开了最小周期的看门狗,导致软件不断复位,形成死机,这个要看芯片手册,最好在程序复位后首要应该显式铲除看门狗再封闭看门狗;
6. 仓库溢出。最难查找的问题,关于容量小的单片机,尽量削减函数调用层级,削减局部变量,然后削减压栈的时分所需的空间。当你把以上几条都试过不能解决问题,试一试把你的被调用少函数直接内置到调用的当地而且把占用RAM大的局部变量改成大局变量,试一试说不定就能够了。