前言
接手的前任的工作,前任对4G芯片的驱动耗时长,采用的http协议,轮询请求,我接手的时候非常嫌弃,毫不犹豫的打算大刀阔斧的改~~~
这一改,就改了小半年,这其中的辛酸泪。。。
项目简介
基于ST32F103,操作系统 ucos-II,系统起了几个任务,联网任务,打印任务,工作流主任务,定时器,串口等,乍一眼很简单,我只需要更改联网任务就可以,莽夫就是冲~
Round 1
沿用任务内循环执行,修改了AT指令,取消了http的请求,增加了 mqtt 的 联网,订阅,并通过 指令获取联网状态,测试通过,服务器发送的消息能收到,设备能响应,小范围找设备测试,2个月左右,总有反馈说无法开机,需要断电在上电。。。
Round 2
反馈问题后,开始找问题,服务器端增加定时任务,5秒检测一次应开机设备是否正常运行,非正常情况下重复发送指令,直到设备开机成功或者3分钟后。。。
Round 3
重新修改设备联网任务,取消了task 执行,通过串口中断执行,4g芯片一旦应答了立马执行下一个at指令,快是真的快,之前联网要30秒现在只需要3秒。。。
Round 4
问题又来了,串口中断要快速退出,耗时业务尽量减少,避免ucos-II系统 因权重问题无法正常执行任务,再改~~~
采用任务轮训,串口只改变状态,貌似没问题了
Round 5
问题又又来了,反馈设备断电后无法正常联网,卧槽,一听就像是玄学问题,努力泡生产复现问题找bug,因前任的ucos-II任务配置不正确,主任务的延时只有1ms,如果主任务耗时长的话有可能导致其他task 没有时间执行,好嘛,联网task都不执行了,还能上网么= =# 接着改,又不敢大改,把联网逻辑丢主任务中去了~~~ 这下应该好了吧。。。
Round 6
不出所料,周末电话被打爆,又又又不能联网了,还需要断电上电,等于问题没有解决,继续泡生产,找问题。。。
一开始以为是mqtt服务自动订阅的配置冲突,导致设备无法订阅成功,取消了自动订阅,问题还在,排除了服务器配置问题,又继续在嵌入式项目中捉鬼。。。
又把4g芯片的文档读了一遍,发现了!!!
ZQMCON ,mqtt 链接的at指令,会主动上报 STAT,我的逻辑判断 如果是 联网状态,那我就自以为联网成功了。。。
项目中遇到的一些重点勾一勾
- 串口中断不要执行太耗时的任务
- 字符串查找 strstr 是个比较耗时的,容易导致串口丢包
- stm32的串口权重要认真配置
- 4G芯片AT指令 有的 OK结束,有的OK开头,还有 \r\n ,每个指令都要认真看文档,避免错误判断
- ucos-II 系统中,高优先级任务不要一直跑,用低优先级任务给高优先级任务发信号,让高优先级任务开始执行比较好
- 中断8位一接收,判断完整接收的逻辑要足够简单和高效
总结下
这项目陆陆续续的改了肯定比上面的描述得多,能力太差,估计前前后后 20多次调整,目前总算稳定了,挫败感十足,从来没有一个bug改这么久的~~~