两台新品共用同一系统,只是局部逻辑略有不同。在测试过程中,发现存在硬件或者软件复位情况。出现这种问题最为致命,因为需要排查的因素太多了。以下是我排查问题的思路:
1.数组越界。定义的数组只有50个单元,但是程序运行的过程中,却给他赋给50+个单元。
2.中断耗时太长,刚出中断又进去了.这时的现象是程序一直在中断中执行,回不到主函数。 (中断嵌套)
3.中断或主函数中有死循环。
4.堆栈溢出。可以用static来避免
5.保证Vcc大于1.8V。当电压低至0.8V时,程序仍有可能执行。这时的现象是PC指针乱飞,有复位,死机,停在中断,时钟频率发生变化等现象。
6.程序中使用malloc()函数没有释放。
7.开了中断却没有中断入口。
8.程序编译没问题,下载程序后上电不断复位,该问题是由于WDT造成的(RAM的初始化时间大于WDT默认的32MS时间,因此根本原因是初始化的时间过长,超过了看门狗的时间,初始化完成以后才能进入main函数,这时喂狗已经来不及了。
当这些问题我从头到尾一一都做了详细的检测后,仍然没找到问题。也不是以上问题所导致的,出现了我的知识盲区。我开始一行一行的排查就这样排查了四天,仍是没找到问题出现的原因。就在刚刚我试着把100us的定时中断换成了1ms,让蓝牙500ms发一帧数据,死机的情况在就没出现。我知道了问题出现的原因:
一边在处理定时器的中断,一边在处理蓝牙接收中断,导致在某一时间段,两个中断同时触发,程序跑飞。(两个属于不同优先级的中断,并没有嵌套从而导致混乱,系统重启)正常情况下很少会因为这样程序重启。