标签:没有 异常 prim 大于等于 attribute 相关 除了 hand block
Cortex-M3 系列处理器是基于 ARMv7-M 架构的处理器,应用非常广泛,为了能够深入的分析在此平台上跑 RTOS 的各种细节,所以有必要写一篇关于 CM3 处理器的结构相关的文章(CM4 类似),在 OS 调度初始化、系统调用、进程调度等方面的细节均是和具体处理器息息相关,所以先让我们来看看 CM3 处理器的一些特征;
如下所示,CM3 处理器拥有 R0~R15 一共 16 个内部寄存器,其中:
R0~R12 称之为通用寄存器。在这 13 个寄存器中,根据指令集访问的特性,R0~R7 是所有指令都可以访问,而 R8~R12 只有很少的 16 位的 Thumb 指令可以访问,32 位的 Thumb-2 不受限制;
R13 默认情况下被用做堆栈指针;堆栈指针分为 MSP 和 PSP,后面会详细描述;
R14 默认情况作为 LR,也就是链接寄存器,当程序调用其他函数后,此寄存器保存了返回地址,使得子程序执行完毕后,得以返回;
R15 默认作为 PC 指针;
CM3 中,除了上述 16 个寄存器以外,还有几个特殊的寄存器组:
xPSR:状态寄存器;
PRIMASK:中断屏蔽寄存器;
FAULTMASK:中断屏蔽寄存器;
BASEPRI:中断屏蔽寄存器,按照优先级进行屏蔽;
CONTROL:处理器模式和堆栈选择;
他们的含义如下:
下面我们一个一个看
xPSR 是 Program Status Register 程序状态寄存器的意思,前面有个 x 代表他是由 3 个小的寄存器构成:
APSR:应用程序状态寄存器;
IPSR:中断程序状态寄存器;
EPSR:执行程序状态寄存器;
它们 3 个一起叫做程序状态寄存器,xPSR 的组成是 32 位的寄存器,在这 32 位中,APSR、IPSR、EPSR 各占一部分:
蓝色部分是 APSR,占领了高 27bit ~ 31bit
紫色部分是 EPSR,占领了高 9bit ~ 26bit
绿色部分是 IPSR,占领了低 0bit ~ 8bit
如果写汇编的话呢,APSR 的 N、Z、C、V、Q 这些标志会被使用到,详见指令集部分;
IPSR 中存储了当前服务的中断号;
这个是只有单一 bit 的寄存器。当它被置位 1 后,就关掉了所有可屏蔽的异常(中断),只剩下 NMI 和 HardFault 可以响应。缺省值是 0,表示没有屏蔽中断;
PRIMASK 也可以叫一级中断开关,这里值得注意的是,即便是通过 PRIMASK 写 1 屏蔽了中断,但是中断依然会在门外被 Pending 住,只不过得不到执行,如果在 PRIMASK 为 1 的情况下,有中断在外 Pending 了,此刻往 PRIMASK 写 0,那么立马会进入 ISR;也就是说,PRIMASK 只是屏蔽掉中断,而并不是不让中断源产生中断!
这个寄存器最多有 9 bit(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值;换言之,当这个寄存器被设置某个数值后,所有优先级号大于等于该值的中断都被关闭(优先级号越大,优先级越低);默认值是0,也就是不关闭任何中断;
这也是只有 1 bit 的寄存器,当设置为 1 的时候,只有 NMI 才能够响应,其他所有的异常,甚至是 HardFault 也不响应,默认值是 0,也就是都响应;
根据名字就知道,这是个控制寄存器,这个控制寄存器由两个 bit 构成,我们称之为 CONTROL[0] 和 CONTROL[1];
CONTROL[0] 用来指明运行的 CPU 的特权级别;
CONTROL[1] 用来指明使用的堆栈类型;
稍后会对堆栈指针和 CPU 特权级别以及线程模式/Handler 模式做说明;
上述的特殊寄存器组 xPSR、PRIMASK、FAULTMASK、BASEPRI 以及 CONTROL 都是 CM3 内核的寄存器,CM3 定义的访问他们的方式是只能通过 MRS 和 MSR 指令,比如:
MRS R0, BASEPRI ; 读取 BASEPRI 到 R0
MRS R0, FAULTMASK ; 读取 FAULTMASK 到 R0
MRS R0, PRIMASK ; 读取 PRIMASK 到 R0
MRS R0, CONTROL ; 读取 CONTROL 到 R0
MSR BASEPRI, R0 ; 将 R0 写入 BASEPRI
MSR FAULTMASK, R0 ; 将 R0 写入 FAULTMASK
MSR PRIMASK, R0 ; 将 R0 写入 PRIMASK
MSR CONTROL, R0 ; 将 R0 写入 CONTROL
其实,为了快速的开关中断,CM3 还专门定义了一条叫 CPS 的指令,有如下 4 种用法:
CPSID I ;PRIMASK=1, ;关中断
CPSIE I ;PRIMASK=0, ;开中断
CPSID F ;FAULTMASK=1 ;关异常
CPSIE F ;FAULTMASK=0 ;开异常
在 2.5、CONTROL 章节提到了工作模式和特权等级这里就需要说明一下 CM3 处理器的工作模式和特权等级做一下说明;
CM3 有两种运行等级:
1、特权等级;
2、用户等级;
标签:没有 异常 prim 大于等于 attribute 相关 除了 hand block
原文地址:https://www.cnblogs.com/god-of-death/p/14856578.html