采集器项目简单描述如下:
主要器件STM32F103RC+ESP8266,该采集器项目也比较简单即通过f103采集IO口的状态(此处光耦隔离),然后通过eps8266(与F103的USART2通信)将数据采用MQTT协议传递给服务器,同时为防止意外设置了看门狗,喂狗在idle线程里面进行。我这边对f103使用了RTT,MQTT、8266设置、底层驱动等都是采用RTT自带的配置。
问题描述::
首先该问题发生之前程序已经在其他企业做了几个月几十台的测试,未发生异常。然而最近的一个企业测试使用时,几个小时到三天内随机会出现“死机”(多台测试结果都一样,是共性问题)。我所谓的“死机”现象是我在Main函数添加的定时闪灯不执行了,指示灯变成了一个固定的状态(灯灭或者灯亮),但我奇怪的是为什么我的看门狗复位(idle线程中喂狗,而且正常状态下看门狗是生效的,这部分配置没有问题)。
现有信息列出:1、采集器设备24V开关电源供电,作为配件在是工控自动化设备使用,该设备内部有伺服驱动器等EMC相对比较大的潜在干扰源;2、我现有设计的硬件在EMC抗干扰方面比较忽略,所以也严重怀疑是这方面的原因引起的,现已经采购金升阳的EMC抗干扰器件准备接入测试(需要等后续测试结果);3、我在会“死机”的采集器设备统一电源下同时接入了两台测试采集器(不采用RTT操作系统,裸机程序只在MAIN中for循环定时闪灯),实际运行中RTT的采集器死机了,测试设备这两天还正常运行(目前只测试了一天,还在继续观察中)。
自己的求解点
疑点1:我想知道外界干扰下它确实大概率会让F103出现异常,但看门狗为什么不生效;
疑点2:会不会在外部的干扰下,我RTT的main(闪灯)线程出现异常,但是idle线程没有死它一直在喂狗,有怀疑这种假死情况,但是非常好奇如何发生这种情况,main线程中就是闪灯、IO口专题读取,以及paho_mqtt_publish 发送数据和rt_thread_mdelay。
疑点3:RTT本身会不会还有什么bug,这也是我在这个论坛发表疑惑的原因,但是网上描述的串口ORE的问题,感觉RTT已经处理了,自己本身RTT使用时间不长,所以有怀疑但又无从下手,唉。
我接下来计划要做的
1、在输入电源上加EMC滤波器件进行抗干扰处理;
2、因为触发时间点不确定,简单粗暴的带仿真器一直测试,抓到了分析,这个最清晰(之前一直疑点在纠结于EMC所以忘记处理这个事情了,这里体现了经验不足)。
3、把喂狗移到main线程里面,看看有么有复位。
之前一直是从硬件干扰角度出发,发帖的时候开始从软件角度考虑。实测和我的疑点2类似,确实发现程序不是真的死机,而且main线程不进入,idle一直在喂狗。初步问题是paho_mqtt_publish函数发布信息频率太快(譬如100ms)一段时间就会出现这个问题,具体原因还需要深入分析
其他线程能运行吗?如果只有idle在运行,其他线程都不运行了,可能是调度锁死或systick不中断了,此类情况使用syswatch可解决问题。如果只是main线程不运行了,那syswatch就没作用了。
你好,什么情况下会发生调度锁死呢?
@JQRR_7669 syswatch 如何进行操作?
去掉idle中的喂狗,加入syswatch软件包到工程就ok
https://club.rt-thread.org/ask/question/423409.html
https://club.rt-thread.org/ask/question/425112.html