博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CORTEX-M3 异常/中断控制(使能和除能)
阅读量:5790 次
发布时间:2019-06-18

本文共 922 字,大约阅读时间需要 3 分钟。

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时则“许进不许出”——只允许新的优先级阈值比原来的那个在数值上更小
也就是说,只能一次次地扩大掩蔽范围,反之则不行。

 

转载地址:http://mxgyx.baihongyu.com/

你可能感兴趣的文章
手持式是既有内置天线的也有外置天线
查看>>
常用的串口调试命令
查看>>
循环结构 、 函数及中断控制 、 case语句
查看>>
H3C 路由器设置基本配置
查看>>
甄别数据和控制
查看>>
Hibernate 查询方式(HQL/QBC/QBE)汇总
查看>>
理解Docker技术
查看>>
jQuery给控件赋值
查看>>
/bin/rm: cannot remove `libtoolT': No such file or directory
查看>>
JSAPI-------微信公众号支付 java 之 第二篇
查看>>
《卓有成效的管理者》书摘
查看>>
Qos的简介
查看>>
Rsync+Inotify+LVS实现Discuz的负载均衡
查看>>
grep及正则表达式 (含断言)
查看>>
linux uptime命令详解
查看>>
maven 安装 出现 错误: 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launche...
查看>>
在linux使用rar压缩工具
查看>>
Apache的MaxClients参数及其对Tomcat执行Full GC的影响(四)
查看>>
云计算,SDN,虚拟化三者关系
查看>>
我的友情链接
查看>>