ARM Cortex-Mx 权威指南笔记

发布时间:2024年01月05日

用于中断或异常屏蔽特殊寄存器细节

1、PRIMASK

在许多应用中,可能都需要暂时禁止所有中断以执行一些时序关键的任务,此时可以使用PRIMASK寄存器。PRIMASK寄存器只能在特权状态访问。PRIMASK 用于禁止除NMI和 HardFault 外的所有异常它实际上是将当前优先级改为0(最高的可编程等级)。如用 C编程可以使用CMSIS-Core 提供的函数来设置和清除PRIMASK:

void enable irq(); //清除PRIMASK

void disable irq(); //设置PRIMASK

void set PRIMASK(uint32 tpriMask);//设置PRIMASK为特定值

uint32t get PRIMASK(void);//读取PRIMASK的数值

对于汇编编程可以利用CPS(修改处理器状态)指令修改PRIMASK寄存器的数值


CPSIEI;清除PRIMASK(使能中断)

CPSIDI;设置PRIMASK(禁止中断)

PRIMASK寄存器还可通过MRS和MSR指令访问。例如;

MOVSRO,#1
MSR PRIMASK,RO;1写人PRIMASK禁止所有中断

以及

MOVSRO,#0
MSR PRIMASK,RO;0写人PRIMASK以使能中断

当PRIMASK 置位时,所有的错误事件都会触发 HardFault 异常,而不论相应的可配置错误异常(如MemManage、总线错误和使用错误)是否使能。

2、FAULTMASK

从行为来说,FAULTMASK 和 PRIMASK 很类似,只是它实际上会将当前优先级修改为-1,这样甚至是 HardFault处理也会被屏蔽。当FAULTMASK 置位时,只有NMI异常处理才能执行。

从用法来说FAULTMASK 用于将配置的错误处理如MemManage 总线错误和使用错误)的优先级提升到-1,这样这些处理就可以使用 HardFault 的一些特殊特性。其中包括:

1、旁路MPU

2、忽略用于设备/存储器探测的数据总线错误将当前优先级提升到-1后,FAULTMASK 可在可配置的错误处理执行期间,止其他异常或中断处理的执行。

FAULTMASK寄存器只能在特权状态访问,不过不能在 NMI和HardFault处理中设置。若在C编程中使用符合 CMSIS 的设备驱动则可以使用下面的CMSIS-Core 函数来设置和清除FAULTMASK:

void enable fault irq(void);  //清除 FAULTMASK

void disable fault irq(void); //设置FAULTMASK 以禁止中断

void set FAULTMASK(uint32 t faultMask);

uint32 t_get FAULTMASK(void);

对于汇编语言用户,可以利用CPS 指令修改 FAULTMASK 的当前状态:

CPSIE F;清除 FAULTMASK
CPSID F;设置FAULTMASK

还可以利用MRS和MSR指令访问FAULTMASK寄存器

MOVS RO,#1
MSR FAULTMASK,RO;1写FAULTMASK禁止所有中断

以及:

MOVS RO,#0
MSR FAULTMASK,RO;0写FAULTMASK使能中断

FAULTMASK会在退出异常处理时被自动清除,从NMI处理中退出时除外。由于这个特点FAULTMASK 就有了一个很有趣的用法:若要在低优先级的异常处理中触发一个高优先级的异常(NMI 除外),但想在低优先级处理完成后再进行高优先级的处理,可以:
。设置FAULTMASK禁止所有中断和异常(NMI异常除外)
。设置高优先级中断或异常的挂起状态
。退出处理

由于在 FAULTMASK 置位时,挂起的高优先级异常处理无法执行,高优先级的异常就会在 FAULTMASK 被清除前继续保持挂起状态,低优先级处理完成后才会将其清除。因此,可以强制让高优先级处理在低优先级处理结束后开始执行。

3、使用示例

在main函数初始化外设和参数时,取消使能中断,保证不出错误。
在这里插入图片描述

文章来源:https://blog.csdn.net/m0_46152793/article/details/135394008
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。