首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

中断的悬起与解悬(2)

中断的悬起与解悬(2)

8.4.2   活动状态每个外部中断都有一个活动状态位。在处理器执行了其 ISR的第一条指令后,它的活动位就被 置 1,并且直到 ISR返回时才硬件清零。由于支持嵌套,允许高优先级异常抢占某个 ISR。然而, 哪怕中断被抢占,其活动状态也依然为 1(请仔细琢磨前文讲到的“直到 ISR返回时才清零)。活动 状态寄存器的定义,与前面讲的使能/除能和悬起/解悬寄存器相同,只是不再成对出现。它们也能 按字/半字/字节访问,但他们是只读的,如表 8.4所示。
表 8.4     ACTIVE 寄存器族   0xE000_E300_0xE000_E31C(此表参考官方技术参考手册作了些改编——
译者注)
名称
类型
地址
复位值
描述
ACTIVE0
RO
0xE000_E300
0
中断0-31的活动状态寄存器,共32个状态

位[n],中断 #n活动状态(异常号16+n)
ACTIVE1
RO
0xE000_E304
0
中断 32-63 的活动状态寄存器,共 32 个状
态位






ACTIVE7  RO    0xE000_E31C  0      中断 224-239 的活动状态寄存器,共 16 个
状态位
8.4.3   特殊功能寄存器 PRIMASK与 FAULTMASKPRIMASK用于除能在 NMI和硬 fault之外的所有异常,它有效地把当前优先级改为 0(可编程 优先级中的最高优先级)。该寄存器可以通过 MRS和MSR以下例方式访问:
1.  关中断
MOV
R0,
#1
MSR
2.  开中断
MOV
PRIMASK,
R0,
R0
#0
MSR
PRIMASK,
R0
此外,还可以通过CPS指令快速完成上述功能:
CPSID  i      ;关中断
CPSIE  i      ;开中断
FAULTMASK更绝,它把当前优先级改为-1。这么一来,连硬fault都被掩蔽了。使用方案与
PRIMASK的相似。但要注意的是,FAULTMASK会在异常退出时自动清零。 掩蔽寄存器虽然能一手遮天,却都动不了NMI,因为NMI是用在最危急的情况下的。因此系统为
它开出单行道,无需挂号只是不要迟到。当NMI激活时,“谁都是省略号,唯独是你不得了,第一优 先谁比你重要”!试想,如果NMI被连接到系统的掉电报警线上,且系统是体外循环机的电源管理 器……如果因为中断被除能就视而不见,则会使体外循环机因断电而失能,体外循环序列可以被意 外终止,病人的生命也将丢失。
8.4.4   BASEPRI寄存器在更精巧的设计中,需要对中断掩蔽进行更细腻的控制——只掩蔽优先级低于某一阈值的中断
——它们的优先级在数字上大于等于某个数。那么这个数存储在哪里?就存储在BASEPRI中。不过, 如果往BASEPRI中写0,则另当别论——BASEPRI将停止掩蔽任何中断。例如,如果我们需要掩蔽所 有优先级不高于0x60的中断,则可以如下编程:
MOV    R0,       #0x60
MSR    BASEPRI,  R0
如果需要取消 BASEPRI对中断的掩蔽,则示例代码如下:
MOV    R0,       #0
MSR    BASEPRI,  R0
另外,我们还可以使用BASEPRI_MAX这个名字来访问BASEPRI寄存器,它俩其实是同一个寄存 器。但是当我们使用这个名字时,会使用一个条件写操作。个中原因如下:尽管它俩在硬件水平上 是同一个寄存器,但是生成的机器码不一样,从而硬件的行为也不同:使用BASEPRI时,可以任意 设置新的优先级阈值;但是使用BASEPRI_MAX时则“许进不许出”——只允许新的优先级阈值比原 来的那个在数值上更小,也就是说,只能一次次地扩大掩蔽范围,反之则不行。就好像绳子打了死 结,只会越拉越紧。举例来说,检视下面的程序片断:
MSR
BASEPRI_MAX,  R0
;本次设置被忽略,因为0xf0比0x60的优先级低
MOV MSR
R0,       #0x40
BASEPRI_MAX,  R0
;Ok。扩大掩蔽范围到优先级不高于0x40的中断
为了把掩蔽阈值降低,或者解除掩蔽,需要使用“BASEPRI”这个名字。上例中,把设置阈值
为0xf0的那条指令改用BASEPRI,则可以操作成功。显然,在用户级下是不得更改BASEPRI寄存器 的。与其它和优先级有关的寄存器一样,系统中表达优先级的位数,也同样影响BASEPRI中有意义 的位数。如果系统中只使用3个位来表达优先级,则BASEPRI有意义的值仅为0x00, 0x20, 0x40,
0x60, 0x80, 0xA0, 0xC0以及0xE0。
继承事业,薪火相传
返回列表