微控制器中断资料中的 active,不能简单译成“此刻正在占用处理器运行”。Arm 的 CMSIS-Core 文档在解释 NVIC_GetActive 时,专门写到一个容易忽略的情形:某个中断服务程序被抢占,处理器转去执行另一个中断处理程序,前一个仍然被定义为 active。活动状态与当前执行位置,在这里不是完全相同的信息。
这份说明先交代活动标志的起止关系。每个外部中断有自己的活动状态位;处理器开始相应处理程序时,标志置为一,执行中断返回时清除。由此可见,active 保留了“已经开始服务、尚未完成返回”的含义,并没有把它限定为程序每一个瞬间都连续执行。
把原文的抢占情形展开理解,可以得到一个明确的假设例子:处理程序甲已经开始,随后被处理程序乙打断。此时处理器正在执行乙,但甲仍处于原文所定义的活动范围中。因此,如果一份技术说明同时写“甲 active”和“当前执行乙”,两句话不必被当作相互矛盾。本文只解释这种状态关系,没有在芯片上制造中断或观测实际执行轨迹。
同一文档对活动状态返回值的说明还包括另一层范围:返回一既可以表示 active,也可以表示 active and pending。后一个说法保留了活动与挂起同时存在的可能。因而,只有一个“活动”的信息,还不能替资料补出挂起状态究竟是什么;两个状态不是两个互相排斥、只能择一填写的日常形容词。
相邻的 pending 说明将它作为可单独查询的状态,而另一个注释明确说,中断可以挂起却不活动。结合前面的活动兼挂起情形,读者便能看出,pending 和 active 各自表达一项状态信息。本文没有据此编排处理顺序、设置优先级,或将状态名称换算成等待时间与实时响应能力。
这项解释也有明确的支持边界。所读 NVIC_GetActive 条目排除了 Cortex-M0、Cortex-M0+ 和 SC000,不能因为页面总名写着 Cortex-M,就将这项接口描述推广为所有内核都相同。采用页面位于 CMSIS 6 的 latest 文档入口,首次发布日期未确认,本文不把访问当天称为功能推出日期。
对整理嵌入式软件资料的人,最有用的是保留状态的定义跨度:active 说明处理已开始且尚未返回,当前执行哪个处理程序则是另一项信息。读清这层关系,可以避免把被抢占误写成已经处理完成;它并不提供调用代码、寄存器操作、调试诊断或控制系统安全保证。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。