FreeRtos里的几个中断屏蔽

本文介绍了primask、faultmask和basepri这三个寄存器在嵌入式系统中如何管理和控制中断,特别是FreeRTOS中如何通过调整这些寄存器来启用/禁用中断,以及设置中断优先级的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章已经生成可运行项目,

1、primask 寄存器

作用
  • 屏蔽所有可屏蔽中断:
    • 当 PRIMASK 设置为 1 时,所有优先级大于 0 的中断都会被屏蔽(禁止触发)。
    • 优先级为 0 的中断仍然可以触发。
    • 系统异常(如 NMI 和 HardFault)不会受到影响,仍然可以触发。
  • 允许所有中断:
    • 当 PRIMASK 设置为 0 时,所有中断按照优先级正常触发。

PRIMASK用于禁止除NMI和HardFalut外的所有异常和中断,使用方法:

cpsid i	; //设置primask (禁止中断)
cpsie i ;  //清除primask  (使能中断)

也可以

movs r0,#1
msr primask r0;   //将 1写入primask禁止所有中断


movs r0,#0
mar primask r0  //将0写入primask使能中断

2、faultmask寄存器

作用
  • 屏蔽所有中断和异常:
    • 当 FAULTMASK 设置为 1 时,除了 NMI,所有其他中断和异常都会被屏蔽(禁止触发)。
  • 允许所有中断和异常:
    • 当 FAULTMASK 设置为 0 时,所有中断和异常按照优先级正常触发。

faultmask寄存器连HardFault都可以屏蔽掉,使用方法和primask类似:

cpsid f	; //设置faultmask (禁止中断)
cpsie f ;  //清除faultmask  (使能中断)

或者:

movs r0,#1
msr faultmask r0;   //将 1写入fault mask禁止所有中断


movs r0,#0
mar faultmask r0  //将0写入faultmask使能中断

3、basepri寄存器

 basepri寄存器的做法更细腻,可以屏蔽优先级低于某个阈值的中断(中断优先级号越低代表的优先级越高),例如:要屏蔽优先级不高于0x60的中断:

mov r0,#0x60
msr basepri, r0

取消对中断的屏蔽,可以直接将basepri清零

mov r0,#0
mar basepri,r0

FreeRtos的开关中断就是通过basepri寄存器实现的

例如: portDISABLE_INTERRUPTS()

 在这个中断里面打了个断点,debug了一下,当前系统中configMAX_SYSCALL_INTERRUPT_PRIORITY是0x10

然后portENABLE_INTERRUPTS()开中断

debug了一下

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KiranWang

一起努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值