024、过载帧插入条件与总线吞吐量下降一个让我熬夜到凌晨三点的现场前年做一套分布式采集系统,主站轮询八个节点,波特率设的五百千,线长不到四十米,终端电阻两端各一个,屏蔽层单点接地。按理说这种配置属于低速短距,闭着眼睛都能跑通。结果现场调试时出现一个极其诡异的规律:上电头两分钟通信正常,主站每秒能收两百多帧有效数据,之后帧率开始阶梯式下滑,五分钟内掉到每秒一百二十帧左右,再过一阵子直接掉到八十帧,但通信并没有完全断,偶尔还能看到数据刷新。更让人头疼的是,用上位机监控总线负载,发现总线上除了正常的数据帧,还夹杂着大量没有明确发送来源的帧,这些帧的标识符很特殊,不参与任何应用层逻辑,却在总线空闲时反复出现。当时第一反应是某个节点程序跑飞了乱发数据,于是逐个断电排查,结果发现只要总线上挂着的节点超过四个,这个现象就必然出现,少于四个节点时一切正常。那晚我对着示波器盯了两个小时,终于意识到问题不在节点软件,而在总线本身的流量控制机制上。这个机制就是过载帧。过载帧到底在什么条件下被插入教科书上通常只写一句话:接收方需要延迟下一帧接收时,可以发送过载帧。但实际工程里,这句话几乎没有任何指导意义,因为“需要延迟”这个条件太模糊了。真正会触发过载帧插入的,是接收节点内部的接收缓冲区处理不过来。具体来说,当一帧数据被正确接收,CRC校验通过,帧结束的第七个位结束时,接收节点本应已经把这一帧从移位寄存器搬运到了接收缓冲FIFO中,并准备好接收下一帧。但如果因为CPU中断响应延迟、FIFO快满、DMA搬运阻塞等原因,接收节点在帧间间隔内没有完成“释放接收缓冲”