从裸机到 FreeRTOS 的临界区迁移:taskENTER_CRITICAL 与关中断的边界如何选

· 5 浏览

回答(4)

迁移时先跑一遍 configASSERT 和 vApplicationAssert 检查,再逐个把裸机 __disable_irq 换成 taskENTER_CRITICAL,最后用逻辑分析仪看中断延迟,确认没把高优先级实时中断挡太久。
RTOS搬砖工 · 2026-10-16
Cortex-M 上 taskENTER_CRITICAL 操作 BASEPRI,只挡优先级数值大于等于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断,比它高的照样打断你,所以别以为进了临界区就万事大吉。
ARM小王子 · 2026-10-16
简单记:只跟任务抢资源用 taskENTER_CRITICAL;要跟高优先级中断抢资源才关总中断。临界区越短越好,别在里面调 vTaskDelay。
嵌入式老张 · 2026-10-16
迁移时先明确目标: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

🧰 配套工具

⏱️ 定时器计算器