CONTROL寄存器:
M0中有两个栈指针,一个是由线程模式下。
第【1】位
handle模式总是置0.在线程中可以为0或者1.
复位以后MSP(主堆栈指针,估计用来指引中断向量表的)使用,在线程模式下(估计就是执行主函数)转换到PSP(进程指针),同时设置CONTROL第1为为1.
当处理器在HANDLE模式下(执行异常),第一位为0,所以MSP使用,CONTROL只可以在线程模式下设置,或者通过中断返回或者中断进入设置。
第【0】位
该位只可以通过MSR,MRS特权级下操作时才允许写该位。一旦进入用户级,唯一返回特权级的途径,就是出发一个中断,再由服务例程改写该位。
操作模式
的
异常的handle
主程序的代码都是线程模式。
当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面, handler模式总是特权级的。在复位后,处理器进入线程模式+特权级。 在线程模式+用户级下,对系统控制空间(SCS)的访问将被阻止——该空间包含了配置寄存器 以及调试组件的寄存器 。除此之外,还禁止使用 MSR 访问刚才讲到的特殊功能寄存器——除了 APSR 有例外。否则会出错。
在特权级下的代码可以通过置位 CONTROL[0]来进入用户级。而不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后将回到产生异常之前的特权级。用户级下的代码不能再试图修改CONTROL[0]来回到特权级。它必须通过一个异常handler由那个异常 handler 来修改 CONTROL[0],才能在返回到线程模式后拿到特权级。
fault伺候:越权访问。
control【0】=0(应该是中断嵌套模式)
control【0】=1正常的中断模式。
用户级程序如果想进入特权级,通常都是使用一条“系统服务调用指令”SVC来出发“SVC异常”,该异常的服务例程可以是具体情况而修改CONTROL【0】。
NMI
在多数情况下,NMI被连接到一个看门狗定时器,有事也会是电压监视功能块,以便在电压掉至危险级别后警告处理。NMI可以再任何时间呗激活,不可屏蔽中断。。
特殊功能寄存器:
程序状态寄存器(xPSRs)(一共三个):应用程序PSP,中断号PSR,执行PSP。
中断屏蔽寄存器(PRIMASK(ARMV6只有这个),ARMV7还有两个FAULTMASK、BASEPRI)
控制寄存器(CONTROL)
在 NVIC的中断控制及状态寄存器中,有一个 VECTACTIVE 位段;另外,还有一个特殊功能寄存器 IPSR。在它们二者的里面,都记录了当前正服务异常的编号。
请注意:这里所讲的中断号,都是指 NVIC 所使用的中断号。另一方面,芯片一些管脚的名字也可能被取为类似”IRQ #”的名字,请不要混淆这两者,它们没有必然联系。常见的情况是,编号最靠前的几个中断源被指定到片上外设,接下来的中断源才给外部中断引脚使用,因此还是要参阅芯片的数据手册来弄清楚。
如果一个发生的异常不能被即刻响应,就称它被“悬起”(pending)。不过,少数 fault异常是不允许被悬起的。一个异常被悬起的原因,可能是系统当前正在执行一个更高优先级异常的服务例程,或者因相关掩蔽位的设置导致该异常被除能。对于每个异常源,在被悬起的情况下,都会有一个对应的“悬起状态寄存器”保存其异常请求,直到该异常能够执行为止,这与传统的 ARM 是完全不同的。在以前,是由产生中断的设备保持住请求信号。
优先级
优先级数值越小,优先级越高。内核异常中有几个优先级是固定的。
复位优先级最高,NMI其次。其余都是可配置的,不可配置为负值。
前两位用来设置优先级,0-3.