ARM Cortex-M用于控制中断和异常处理的寄存器:BASEPRI、PRIMASK 和 FAULTMASK

发布于:2025-04-08 ⋅ 阅读:(40) ⋅ 点赞:(0)

在ARM Cortex-M处理器中,BASEPRIPRIMASKFAULTMASK 是用于控制中断和异常处理的系统级寄存器。它们的主要区别在于作用范围和灵活性,以下是详细说明:


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
仅在需要完全禁用中断时使用(如临界区保护),并尽快恢复以避免系统不稳定。
注意特权模式
FAULTMASKBASEPRI 的修改通常需在特权模式下进行(如通过 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);
}

理解这三个寄存器的差异有助于优化实时系统的中断管理,避免因不当屏蔽导致的性能问题或系统故障。


网站公告

今日签到

点亮在社区的每一天
去签到