中断让处理器在事件到来时改变执行流。分析实时性要区分三个时刻:外部事件发生、ISR 开始执行、业务处理完成。ISR 很短不代表端到端延迟小,中断被屏蔽、较高优先级处理占用和后续任务排队都可能成为主要延迟。
优先级怎样影响响应
在 Cortex-M NVIC 中,较小的优先级数值通常代表更高的紧急程度。实际实现的优先级位数由芯片决定,优先级分组还可能把位分给抢占优先级与子优先级。子优先级主要影响同时挂起时的选择,不能据此认为一定能抢占。
FreeRTOS 任务优先级的方向不同:数值越大,任务优先级越高。把任务优先级和 NVIC 数字直接比较没有意义。调用 RTOS 的 ISR 还必须使用允许的 FromISR API,并满足端口规定的中断优先级边界;过高紧急程度的 ISR 不能任意调用内核。
可以先做保守预算:响应时间包含最长相关屏蔽区、可能抢占的 ISR、异常进入/退出和业务处理。若目标期限为 100 μs,而某处关中断 200 μs,优化一条乘法指令无法解决期限问题。
ISR 留什么,任务做什么
ISR 适合读取并确认事件来源、保存最少现场、移动少量数据或通知任务。耗时解析、网络、文件写入和长时间等待放到任务。清标志的方法以外设手册为准,读状态后读数据、写 1 清除和写 0 清除不能互换。
DMA 把一部分数据搬运交给硬件,CPU 仍要负责配置、缓冲区所有权和完成通知。双缓冲采集可让 DMA 写 A 时任务处理 B,交换时要明确哪块可读、哪块可写、何时算过期。带数据缓存的芯片还需使用正确的可缓存内存区域与清理/失效操作;volatile 不能让缓存自动一致。
一个离散抢占模型
下载 中断排队实验,运行 python interrupts.py。模型每个时间单位推进一次:普通采集在 t=0 到达但被屏蔽到 t=2,紧急事件 t=4 到达后抢占,通信事件最后完成。它检查屏蔽延迟、紧急事件优先执行和剩余工作不丢失。
模型忽略指令、总线、异常进入和尾链开销,不能把输出时间单位解释为某颗芯片的微秒。本地运行可确认调度规则;实物响应要用输入事件和 ISR 首条可测动作之间的时间差验证。
实物可在 ISR 入口和出口切换独立 GPIO,通过示波器或逻辑分析仪同时观察触发源。先核对 GPIO 写入开销,再增加通信负载、临界区和 DMA 流量,记录最大值及分布。软件时间戳只有在计时器分辨率与读取开销足够时才有解释力。
练习与面试自查
把模型屏蔽区延长到 t=6,观察紧急事件也无法立即执行;再给采集任务设置期限,输出超时数量。把 DMA 的缓冲区只保留一份,画出生产者覆盖消费者未读数据的时间线,再设计双缓冲或环形队列。
自查:关调度与关中断有何区别?为什么 ISR 里不能等待普通互斥锁?NVIC 挂起标志与外设事件标志有什么关系?平均延迟合格为何仍可能丢采样?