如果要问开发者,什么情况最让其崩溃,估计异常重启能排到前三。模块稳定运行不重启,是所有开发者的梦想。然而总会有一些意外情况导致模块异常重启。本文将对一些常见的重启情况进行分析,同时探讨其对应策略,希望可以为模块的稳定运行提供一些帮助。
通常,重启是由硬件原因或者软件原因造成的。虽然病因不同,但是表象极为相似,咱们就使用“望闻问切”的方法,剖析病因,对症下药,直达病灶,快速起效(嘿,请认准了,Luat大法好!)。
“望”字诀——检查硬件环境:仔细排查接线,外围设备,供电等是否存在问题;
“闻”字诀——检查软件代码:查看模块输出的Trace。通常,我们可以通过分析重启前后的输出Trace判断错误所在;
“问”字诀——初步发现问题所在,尝试复现。当可以准确复现后,分析对应逻辑存在的问题(找到相关责任人,让他请客!)。
“切”字诀——根据问题去修改代码(打样),反复测试是否还会出现此问题,是否引入新问题,是否干扰到原有逻辑的运行。
重复上述步骤,直到模块可以稳定运行为止。
本文今天就先说一下“望”字诀。
Air系列模块对电源的要求较为严格,以Air202模块为例:
如图所示,根据硬件设计手册的要求,模块瞬时电流在1.6A时,VBAT电压不应跌落3.4V,否则必然出现异常(在频繁通信时,电流要求更高,最好可以满足2A)。
如果模块的PWRKEY未接地,VBAT电压低于3.4V时模块会自动关机;
如果模块的PWRKEY已接地,电压低于3.4V时模块会表现为先自动关机。后因电流减小,供电端恢复正常,VBAT电压升至3.4V以上,模块重新走上电开机流程。此种情况表现为异常重启,输出的Trace中poweron reason为0:
[2018-06-12 12:40:03,311.311]: host trace poweron reason: 0 Air800 A9321 1.1.1 1.1.0 Luat_V0014_8955
附poweron reason表:
POWERON 事件 |
POWERON 代码 |
解释 |
rtos. POWERON_KEY |
0 |
按键开机 |
rtos. POWERON_CHARGER |
1 |
充电开机 |
rtos. POWERON_ALARM |
2 |
闹钟开机 |
rtos. POWERON_RESTART |
3 |
软件重启开机 |
rtos. POWERON_EXCEPTION |
6 |
异常开机 |
rtos. POWERON_HOST |
7 |
HOST工具控制重启开机 |
rtos. POWERON_WATCHDOG |
8 |
其他原因 |
所以,如果模块重启前有频繁的通信操作,且没有固定的语句报错(无规律性),重启后上报的poweron reason为0,此时应该重点排查供电问题。
如果存在瞬间电压跌落,可能会导致模块出现异常。
下边,试举一例:
某客户使用开关电源将市电220V AC降压至12V DC,然后PCB使用DCDC将12V降到4V给模块VBAT供电。模块的PWRKEY已经接地,实现上电自动开机。
模块在频繁通信时工作正常,但是闲暇时发心跳包却无规律性重启。分析日志发现,重启后Trace输出的poweron reason是0,初步判断并非代码错误,而是供电问题导致的异常重启。
(请注意,任何情况下,poweron reason为0,都应首先检查VBAT端供电电压跌落问题)
首先,在全负荷情况下使用功率计测量,查看是否超过电源的额定输出值:
负载不到10w,远未达到12V 2A的上限要求;接下来测量电源输出情况:
(这是一个很考验耐心的事情,因为是无规律性重启,所以很可能一直盯着,一直没事儿;稍稍走神一下,它就重启了……还有一个需要注意的是,绝对不要用“万用表”,一定要用示波器,因为万用表不够灵敏,很容易导致误判)
如上图所示,经过长久的等待,终于抓到异常。某种特殊情况下,电源可能会瞬间跌落至0V,随后恢复正常输出;这一个瞬间的跌落,导致模块VBAT端电压直接跌破3.4V,最终异常重启。
和电源厂家沟通后了解到,这个问题并非过热、电流过大的自保护,而是电源动态响应速度跟不上,负载很小的时候,电源本身进入待机模式导致。更换新电源后问题得以解决,模块不再异常重启。
很多时候,并不能和电源厂商沟通,而供电不稳时有发生,只能“硬抗”这种波动怎么办呢?简单有效的方法就是使用电容、电池,让他们稳定输出电压。
如果无法改善供电(如风能、太阳能),也无法使用电池、电容,那么只能优化代码逻辑。例如,尽量减少通信频率和时常,减少通信包大小,使瞬时电流不超过阈值以至于引起压降。
所以说呢,只要保证任何情况下,模块VBAT的电压在《硬件设计手册》规定范围内,模块就不会因为供电问题出现异常啦!
43 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!