异常
异常简介
异常是指控制器未按照预期流程执行,本文所提异常特指单片机跑飞,复位的状况
异常可以看成是单片机的一种自我保护机制,当发送非预期情况时,控制器主动进入一个实际上无任何逻辑的无限循环子函数,从而防止进一步发生错误,通常如下操作可能进入空循环。
异常的发生
A.非法操作内存
1.操作没有实际指向的空指针。
指针变量在定义后,需要将指针指向一个合法的地址,如果指针变量没有指向地址,则默认为null,对null操作会导致异常;如果指针变量指向的地址不合法,按照指针类型操作此地址可能会导致异常。
2.数组越界
对数组进行遍历操作时,通常使用索引,如果索引值大于数组实际大小,此时再通过索引操作数组,可能会意外修改其他内存区域,从而引发异常。
3.栈溢出
单片机RAM空间有限,通常栈空间比较小,在一个函数内部定义较大的数组时,有可能会发送栈移除,从而导致异常。另外一种特殊情况是:递归函数没有结束条件,无限调用导致栈空间耗尽。
B.功能未定义
1通常发生与中断相关:当使能了某个中断,但没有实现具体功能,发生中断时,控制器使用默认的空函数接管中断,防止继续运行发生更严重的错误。
C看门狗复位
如果系统复位且找不到原因,在排除以上错误后,需要检查是否使能了看门狗,通常看门狗复位是由于流程卡死导致主循环不能及时喂狗,而流程卡死多发生在等待某个寄存器状态位,这种情况就需要设置一个合理的超时时间,不能使用while。