在做项目的时候,整个系统比较复杂,发现整个系统开机比较慢,整个系统,下层比较简单的,只要判断电池相关数据,就可以开机,但是为什么会慢,两三天,都没找到原因,一直以为其它地方影响。大概经历了一周,做了多次交叉实验和测试,后来发现,还是底层干扰,这个前没注意到,只是硬件稍微的不同,软件本身有bug,放大了这个现象,导致本次事故,另外当时出现问题时,查找网上,还没有类似问题,我这个可能算是第一例,第一个写这个问题的,吃一堑长一智吧。
本次因为是项目中的系统环境,只能大致描述下环境。
软件环境:运行在STM32F4xx芯片下,但是在整个系统中,系统还有其它设备。
表现现象是,在系统开机时,开机时间比以往要慢,这个用了很长一段时间,都没有出现问题,并且交叉实验,有的设备上行,有的设备不行。
后来使用逻辑分析仪抓几个串口波形,发现uart5,数据被拉长了,uart5是堵塞发送,或者说轮询发,波形如下。
这点其实很奇怪,我当时也是第一次看到这样的数据,后来屏蔽所有外围设备,单独使用uart5轮询发送,波形如下,这样数据才是我们认为正常数据。
后来又使用逻辑分析仪抓取uart1波形,uart1使用的是DMA发送,发现数据为也被拉长了,波形如下。
这其实很奇特,串口之间好像有了某种默契已于,都拉长了字节,这肯定是不对的,交叉实验,发现另一台uart1没有这样的问题。
因为使用嵌入式操作系统RTOS,以为是这部分影响,后来交叉实验,去掉外围设备,发现拿掉跟uart4通信的设备,问题没有了,当时以为是跟那个设备有关系,如下图,是抓取得逻辑分析仪波形。
以下为整个波形:
以下为其中细节
然后更换硬件,对比测试。
其中Rx应该是干净的。当时并没有用到Rx,只用Tx做DMA数据推送,不用有这样奇怪的波形。
后来查代码,发现在回调函数里虽然没用的Rx接收,但是初始化,并且没有删除阻塞发送,到这本次事故。
这里我拿之前文章里的代码举个例子:
软件STM32cubeIDE下使用STM32F4xx配置uart1和uart5数据互相透传-基础样例
就是透传实验的例子,如下,当时因为测试,想在主函数里发送,但是没成功,并且本身也是基础样例,就没深入调试。
并且在细节里也特意说明了。
在回调函数里,尽量不要做过多的操作,不然会造成意想不到错误。
这次就看出可以遭成所有线程变慢的现象。
(1)硬件不一致,导致软件放大现象。
代码其实运行了一段是时间了,在多个设备运行了,之前没有问题,本次正好硬件稍微不稳定一段时间,就导致如此现象,这很难查到,如下图,测试了其它设备波形,和本次,上电时对比图。
(2)硬件上电前,为不确定态。
根据硬件大佬描述,硬件起电时,就是不确定状态,除非加入一些特定三态门什么的。
吃一堑,长一智。