在Cortex-M内核上,使用BASEPRI寄存器是实现临界区保护且不阻塞高优先级中断的关键。设计时,应定义一个全局变量保存当前临界区嵌套深度,并通过`__disable_irq`或内联汇编操作BASEPRI。具体做法:进入临界区时,读取当前BASEPRI值,若为0则设置BASEPRI为某个阈值(如`configMAX_SYSCALL_INTERRUPT_PRIORITY`),该阈值对应允许的最高中断优先级(数值越小优先级越高)。这样,只有优先级数值大于阈值的低优先级中断被屏蔽,而高优先级中断(数值小于阈值)仍可响应。退出时,恢复原BASEPRI值。需注意:临界区代码必须短小,避免在临界区内调用可能阻塞的API;同时,嵌套临界区需用计数器管理,确保只有最外层退出时才恢复BASEPRI。实操建议:在FreeRTOS中,`portENTER_CRITICAL`和`portEXIT_CRITICAL`已封装此机制,但自定义时需确保阈值与NVIC中断优先级分组一致,并验证中断服务函数中不访问共享资源。
mcuku 阿沐 · 2026-08-27