单片机中断为何漏边?优先级怎么排?
外部脉冲明明到了,计数却偶尔少一次,这类故障常被误判成传感器抖动。单片机中断链路如果把屏蔽窗口、标志位和优先级混在一起处理,真实边沿很容易在软件忙碌时消失。
中断屏蔽窗口首先决定事件能否及时进入处理路径。关中断保护共享变量是常见做法,但若把通信解析、数组复制或 Flash 操作也包在同一段临界区里,外部边沿就只能排队等待。很多片上外设只锁存一个待处理标志,连续两个边沿在服务前到来时,第二个边沿未必能被独立计数。于是系统在低频测试下正常,在高速编码器、流量计或窄脉冲捕获场景里开始少数。问题本质不是 CPU 算不过来,而是最长不可打断时间超过了事件最小间隔。
压缩屏蔽窗口比盲目提高主频更有效。共享状态能用原子位操作就不要整段关中断,能把数据先搬到环形缓冲就不要在中断里做完整协议判断。对必须临界保护的寄存器更新,也要让保护范围只覆盖真正不能被打断的几条指令。单片机项目里还应单独记录最长 ISR 执行时间和最长关中断时间,因为平均响应很漂亮并不能证明不会漏掉最短边沿。
边沿锁存和清标志顺序是另一条失效路径。某些外设要求先读状态再写一清零,某些要求先读数据寄存器才能释放标志;如果顺序反了,刚到的新边沿可能被旧标志的清除动作一起抹掉。更隐蔽的是,多个中断源共享同一个向量时,软件只处理了第一个源就退出,剩余源需要等下一轮触发才被发现。若此时优先级又被高频定时器抢占,低频但关键的边沿就会在时间线上被拖得很长。
优先级排序不能只按功能重要性,还要按事件不可丢失性和服务时限来排。高速捕获、过流保护和通信接收这类缓冲深度很浅的事件,应优先获得短而确定的服务;耗时计算、日志打印和协议重组则适合放到后台任务。若两个中断共享数据,优先级还要避免低优先级持有状态时被高优先级反复打断,造成清标志和读数据之间的竞态。输入捕获能交给硬件 FIFO 或 DMA 时,应优先让硬件先存证,再由后台慢慢消费。单片机中断设计的目标不是让所有事件都抢得更凶,而是让最容易丢的事件先被安全落袋里。
排查漏边时,最好在输入脚、ISR 入口、清标志前后和应用消费点同时打点。若输入边沿存在而 ISR 没进,问题多半在屏蔽或优先级;若 ISR 进了但计数没变,就要查标志位顺序和共享变量原子性。还要故意制造最高通信负载和最长临界区,让边沿落在最差时间点上,而不是只测空闲状态。输入端若有毛刺滤波,也要确认滤波宽度没有把合法窄脉冲一起吞掉,尤其要覆盖最小脉宽样本和最高边沿频率。用逻辑分析仪把这些点串起来,比单看代码更容易还原真实竞争窗口。
因此,中断可靠性不是响应越快越好,而是最坏路径不能越过事件间隔。把屏蔽窗口收窄,再把标志位处理顺序固定,边沿才不会在忙碌时被吃掉。





