NVIC 的 Pending 与 Active 有什么区别?ISR 执行期间再次触发会怎样?
Pending 表示异常请求已等待处理,Active 表示处理器正在执行该异常。ISR 期间同一来源再次触发可再次置 Pending,退出后可能立即重入;是否丢失多次事件取决于外设状态位是计数、锁存还是合并。
Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
Pending 表示异常请求已等待处理,Active 表示处理器正在执行该异常。ISR 期间同一来源再次触发可再次置 Pending,退出后可能立即重入;是否丢失多次事件取决于外设状态位是计数、锁存还是合并。
SysTick 通常是 24 位向下计数器,可选时钟源也依内核和芯片实现,单次周期受重装值上限限制。长时间应由软件累计或低功耗定时器承担,还要考虑时钟动态变化和睡眠停钟。
WFI 等待可唤醒处理器的中断条件;WFE 观察事件寄存器,若事件已置位会先清零并立即返回,否则等待事件;SEV 可向处理器发送事件。它们是提示指令,实际低功耗深度还取决于系统控制和芯片电源配置。
FromISR API 在解除更高优先级任务阻塞时会把该标志置为 pdTRUE;ISR 结束前应通过端口宏请求上下文切换,让更高优先级任务立即运行。标志应先初始化为 pdFALSE,并可被多个 API 累积置真。
进入操作时记录绝对截止时间,每个子步骤只等待“截止时间减当前时间”的剩余预算;若每步都重新等待完整 timeout,总耗时可变成步骤数倍。计算还要使用可回绕的单调时钟方法。
优先级继承只在高优先级任务阻塞于互斥锁时临时提升持锁者,缩短特定反转;它不能修复循环等待、长时间关中断、信号量误用,也可能在嵌套锁和多个等待者下产生复杂的继承链。
普通队列保存每个事件,消费者落后时会积压过期样本;若业务只关心最新状态,可使用长度为 1 的覆盖队列、受保护快照或双缓冲,并单独计数被覆盖次数。事件和状态不能混用。
外设中断一旦启用就可能立刻触发,因此它依赖的队列、任务句柄和缓冲必须先有效;调度器启动前可调用的 RTOS API 又受内核规定限制。常见顺序是建资源与任务、清 pending、配置优先级、最后启用源。