5.4 一次中断丢失的排查实录


5.4 一次中断丢失的排查实录

本节摘要:机制讲完看实战——一台 9600 波特的串口设备偶发丢字节,本节按"信号、时序、现场"三条证据链完整复盘这次中断丢失事故,把前四节的所有概念用成一次真实的手艺。

本章前三站给出的是地图与规则,这一站给一次完整的远征。案例按"背景、操作、结果、解读、变式"展开——这条五步结构是接口排错的通用骨架,值得背下来。

丢的那次中断去哪了

背景。 某粮仓监测系统的下位机用串口向上位机回传数据,波特率 9600,中断驱动接收:每个字节到达都触发一次接收中断,服务程序把字节收进缓冲。测试阶段一切正常,装机三周后用户报障:上位机每天总有一两次校验错,重传后正常。日志显示丢的字节在下位机的接收缓冲里根本不存在——不是传丢了,是下位机压根没收到

操作。 排查按三条证据链并行展开。

第一条链:信号层。把示波器挂在串口接收线上等事发。抓到的波形显示,上位机发送的字节电平规整、波特率准确——物理层无嫌疑。这就排除了"发方没发"与"线路畸变",嫌疑收敛到下位机内部。

第二条链:时序层。逻辑分析仪同时挂四路信号:串口接收线、8259 的申请输出、CPU 的应答输入、读端口的控制信号。守了两天抓到一次事发瞬间:接收线上字节完整到达,申请线上脉冲准时出现,应答信号却没有来——请求举了,处理器没接。分析仪的时间轴上还显示,应答缺失的窗口里处理器正忙于一段连续的总线操作,前后持续约一点五毫秒。

第三链:现场层。给固件加一个"事发快照":接收中断服务程序的入口处,把串口状态寄存器与中断控制器的屏蔽寄存器、在服务寄存器一并抓进环形缓冲。又守两天,快照抓到了。状态寄存器的溢出错位是置位的——接收移位器里堆了新字节,旧字节没被及时取走。

三条链并起来,案情清楚:主程序里有一段约一点五毫秒的临界区,为了保护一处数据结构的一致性,整段用关中断包裹;其间字节到达,8259 挂起申请等处理器开门;可 9600 波特下一个字节的传输时间约一毫秒——临界区还没结束,第二个字节已经挤进移位器,第一个字节被顶掉,溢出错位随即置位。等中断终于被响应,收到的已经是残局。丢失的不是中断本身,是被延迟到失去意义的中断。

结果。 修复分三刀。第一刀把临界区拆小:原以为整个链表操作都需要保护,实际只有摘取节点的一瞬需要,关中断窗口从一点五毫秒压到二十微秒。第二刀在接收服务程序入口先读状态、有溢出错先清错再收字节——把 5.2 节"服务程序办两件事"的纪律落实到入口次序。第三刀给接收路径加了两字节的硬件缓冲并调整服务程序先读缓冲再处理——从"每字节必响应"退半步到"偶尔欠一拍还能追上"。上线后连续观察一个月,校验错归零。

事发快照(环形缓冲导出,节选) 状态寄存器: 溢出错=1 接收就绪=1 屏蔽寄存器: 接收中断未屏蔽 在服务寄存器: 无挂起服务 临界区计时: 约 1.5 毫秒(超阈值告警) 结论: 请求被挂起期间发生接收溢出,字节在移位器被覆盖

解读。 这单案子的方法论价值在三处。其一,三条证据链各管一段:示波器管"物理上有没有",逻辑分析仪管"时序上接没接",寄存器快照管"机制内部记了什么账"——单链都有死角,并链才闭合。其二,中断丢失极少是控制器坏了,几乎都是服务时间与事件间隔的数学冲突:字节间隔一毫秒,处理延迟一点五毫秒,丢是必然,不丢是侥幸。其三,修法优先级是"缩临界区、再清错、后加缓冲"——缓冲是兜底不是主修,先把延迟的真凶解决掉,兜底才有意义。

变式。 若波特率提到 115200,字节间隔缩到八十七微秒,缩临界区也未必够——正确姿势是换传输方式:让串口控制器用 FIFO 攒一批再中断一次,或直接上 DMA(第 6 章的主役),把处理器从中断风暴里彻底赎出来。事件越密,机制的天花板越低,该换层时就换层。

图 5-2:中断丢失排查的三条证据链

图 5-2:中断丢失排查的三条证据链

证据链之外还有第四条线:协议日志。本案的上位机日志早就记录了"每天一两次校验错",若一开始就把下位机日志与上位机日志按时间轴对齐,丢失时刻的下位机状态能提前锁定范围——两端日志对时,是分布式排错里性价比最高的一步。顺手补一条经验:环形缓冲的大小按"最长处理延迟乘事件率"的两倍预留,本案若早有快照机制,两天就能缩到两小时。工具不是等事故来了再造,日常就备在固件里。

从排查到预防:一张设计期清单

排错的本事是被动的,更好的是把事故消灭在图纸上。给中断路径列一张设计期的自查清单:每个中断源的处理延迟都算过最坏值,与事件最小间隔做过比较;每个临界区的关中断时长都量过实测值,超过事件间隔的必须拆分;每个服务程序的入口次序都是"先状态、再数据",溢出错有明确的清理路径;每个服务的结尾都有销号,自动结束模式的使用经过论证;每条申请线的触发方式(边沿或电平)与外设行为匹配——边沿触发怕毛刺,电平触发怕挂在半路。清单过一遍,本节案例里的每一刀都已经在源头缝合。

高频追问两则

问:为什么不用示波器单脉冲触发抓现场,要守两天? 因为故障一天几次且不可预测,单次触发的捕获窗口有限。工程上对付低频偶发故障的标准姿势是"长记录加自动筛选":让仪器或固件持续记录,用条件筛选出可疑片段。耐心是仪器的一部分。

问:溢出之后补收数据不行吗? 不行。溢出的那一位在移位器被覆盖的瞬间就已不存在,事后读到的任何数据都是假的。串口协议里因此必须有帧校验与重传机制——硬件丢失无法挽回,协议层兜底才是完整答案。这也是为什么可靠传输的设计总是"硬件尽力、协议兜底"的双层结构。

本节要点回顾

  • 五步骨架通用:背景、操作、结果、解读、变式,任何接口排错都能套。
  • 三条证据链分工:信号、时序、现场,并链才能闭合案情。
  • 丢失的本质是数学:处理延迟超过事件间隔,丢是必然。
  • 修法有次序:缩延迟为先,清错次之,缓冲兜底。
  • 事件密度决定机制:中断扛不住的密度,交给 FIFO 或 DMA。

中断的战争打完了。下一章转向接口技术的正面阵地:端口编址与传输控制,以及两颗经典芯片的手感。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U