CORTEX-M3 异常/中断控制(使能和除能)

PRIMASK, FAULTMASK 和BASEPRI

PRIMASK 当它置1 时,就关掉所有可屏蔽的异常,只剩下NMI和硬fault 可以响应。它的缺省值是0,表示没有关中断。

FAULTMASK 当它置1 时,只有NMI 才能响应,所有其它的异常,包括中断和fault,通通闭嘴。它的缺省值也是0,表示没有关异常。

BASEPRI 最多有9 位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。
当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。
但若被设成0,则不关闭任何中断,0 也是缺省值。

为了快速地开关中断,CM3 还专门设置了一条CPS 指令,有4 种用法

CPSID I ;PRIMASK=1, ;关中断
CPSIE I ;PRIMASK=0, ;开中断
CPSID F ;FAULTMASK=1, ;关异常
CPSIE F ;FAULTMASK=0 ;开异常

BASEPRI寄存器

在更精巧的设计中,需要对中断掩蔽进行更细腻的控制——
只掩蔽优先级低于某一阈值的中断——它们的优先级在数字上大于等于某个数
那么这个数存储在哪里?就存储在BASEPRI中。不过,如果往BASEPRI中写0,
则另当别论——BASEPRI将停止掩蔽任何中断。

例如,如果你需要掩蔽所有优先级不高于0x60的中断,则可以如下编程:

MOV R0, #0x60 ; pri >= 0x60 : masked
MSR BASEPRI, R0

如果需要取消BASEPRI 对中断的掩蔽,则示例代码如下:

MOV R0, #0
MSR BASEPRI, R0

另外,你还可以使用BASEPRI_MAX这个名字来访问BASEPRI寄存器,它俩其实是同一个寄存器。
但是当你使用这个名字时,会使用一个条件写操作。个中原因如下:
尽管它俩在硬件水平上是同一个寄存器,但是生成的机器码不一样,从而硬件的行为也不同:

使用BASEPRI时,可以任意设置新的优先级阈值;
但是使用BASEPRI_MAX时则“许进不许出”——只允许新的优先级阈值比原来的那个在数值上更小
也就是说,只能一次次地扩大掩蔽范围,反之则不行。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值