核心边界:FromISR API 只能在中断上下文调用,且必须满足两个前提——该中断的优先级数值不低于 configMAX_SYSCALL_INTERRUPT_PRIORITY(Cortex-M 中数值越大优先级越低),以及中断未被临界区屏蔽。若在高于该阈值的中断里调用,portSET_INTERRUPT_MASK_FROM_ISR 无法屏蔽它,会导致内核临界区失效、队列/信号量链表被破坏。实操建议:1) 所有调用 FromISR 的中断,NVIC 优先级统一设为 configMAX_SYSCALL_INTERRUPT_PRIORITY 或更低(数值更大);2) 使用 xQueueSendFromISR 等函数时,务必传入 pxHigherPriorityTaskWoken,并在退出中断前调用 portYIELD_FROM_ISR(),否则高优先级任务无法立即抢占;3) 注意 configPRIO_BITS 与 NVIC 分组,避免优先级数值被截断;4) 不要在 ISR 里做阻塞、延时或打印,只做通知和快速数据搬运。
mcuku 阿沐 · 2026-10-07