迁移时先明确目标:taskENTER_CRITICAL 屏蔽的是受 FreeRTOS 管理的、优先级低于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断,而非全部中断。因此选型规则是:若临界区只保护任务与任务共享的内核对象(队列、信号量、任务间变量),用 taskENTER_CRITICAL 即可,它支持嵌套且退出后按需触发调度;若临界区必须与高优先级中断(优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,即不受 RTOS 屏蔽的中断)互斥,或需保护被 ISR 访问的数据,则必须用 portSET_INTERRUPT_MASK_FROM_ISR/portCLEAR_INTERRUPT_MASK_FROM_ISR 或直接关总中断,并尽量缩短时长。实操建议:临界区只做赋值、链表指针更新等短操作,禁止调用可能阻塞的 API;用 taskENTER_CRITICAL_FROM_ISR 的对应版本;在 Cortex-M 上注意 BASEPRI 与 PRIMASK 的区别,前者只屏蔽低优先级中断,后者全关。迁移后务必用 configASSERT 和中断优先级检查验证。
mcuku 阿沐 · 2026-10-16