在ARM Cortex-M处理器中,BASEPRI
、PRIMASK
和 FAULTMASK
是用于控制中断和异常处理的系统级寄存器。它们的主要区别在于作用范围和灵活性,以下是详细说明:
1. PRIMASK
• 功能:
禁用除以下情况的异常和所有中断(Maskable Interrupts,即IRQ):
• NMI(不可屏蔽中断)
• Hard Fault(硬件故障)
• 作用机制:
设置 PRIMASK
(通过 MSR PRIMASK, #1
)会把当前优先级提为0,来屏蔽除NMI和Hard Fault之外的所有异常和中断。即所有可更改优先级的异常和中断会被屏蔽。
• 典型用途:
快速进入临界区,保护关键代码段不被中断打断。 如RTOS任务切换或共享资源访问等应用。
• 特点:
• 简单易用,对系统实时性影响较大,长时间开启可能导致高优先级中断无法响应。
2. FAULTMASK
• 功能:
类似 PRIMASK
,但额外禁用Hard Fault(硬件故障),并允许更高优先级的异常(如NMI)继续运行。
• 作用机制:
设置 FAULTMASK
(通过 MSR FAULTMASK, #1
)会把当前优先级提升到 - 1,会禁用所有中断和大部分异常,仅允许NMI。
• 典型用途:
在异常处理程序中临时屏蔽可能引发嵌套故障的操作(如内存访问)。
• 特点:
• 比 PRIMASK
更严格,可能影响系统稳定性。
• 仅在特权模式(Privileged Mode)下可修改。
3. BASEPRI
• 功能:
基于优先级的动态中断屏蔽,仅屏蔽优先级低于阈值的中断。
• 作用机制:
设置 BASEPRI
(通过 MSR BASEPRI, #priority
)允许优先级高于阈值的中断继续执行,低于阈值的被屏蔽。例如,若 BASEPRI=0x40
,则优先级数值 ≥ 0x40
的中断不会被屏蔽。
• 典型用途:
灵活控制中断优先级,允许高优先级任务/中断优先执行,同时屏蔽低优先级中断。
• 特点:
• 更精细的控制,避免完全禁用所有中断。
• 需要合理设置优先级阈值,否则可能导致意外屏蔽。
对比总结
寄存器 | 屏蔽范围 | 影响异常 | 灵活性 | 典型场景 |
---|---|---|---|---|
PRIMASK | (除NMI和硬故障外)所有异常和中断 | 否 | 低 | 简单临界区保护 |
FAULTMASK | (除NMI外的)所有异常和中断 | 是 | 中 | 异常处理中的嵌套防护 |
BASEPRI | 按中断的优先级阈值屏蔽中断 | 否 | 高 | 动态调整中断优先级 |
使用建议
• 优先使用 BASEPRI
:
在需要平衡实时性和中断响应时,通过设置合理的优先级阈值来屏蔽低优先级中断。
• 谨慎使用 PRIMASK
/FAULTMASK
:
仅在需要完全禁用中断时使用(如临界区保护),并尽快恢复以避免系统不稳定。
• 注意特权模式:
FAULTMASK
和 BASEPRI
的修改通常需在特权模式下进行(如通过 SVC
或系统服务调用)。
示例代码(CMSIS风格)
// 屏蔽所有IRQ(使用PRIMASK)
void DisableInterrupts(void) {
__set_PRIMASK(1);
}
// 恢复中断(使用PRIMASK)
void EnableInterrupts(void) {
__set_PRIMASK(0);
}
// 动态设置BASEPRI(屏蔽优先级<0x40的中断)
void SetPriorityThreshold(uint32_t threshold) {
__set_BASEPRI(threshold);
}
理解这三个寄存器的差异有助于优化实时系统的中断管理,避免因不当屏蔽导致的性能问题或系统故障。