STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(3):Cortex-M3处理器异常模型

这一部分描述异常模型。

       每一个异常都存在一个状态:

       闲置       这个异常没有活跃,没有暂停

       待进行    异常等待被处理器服务。一个外设或软件中断请求可以改变相应中断的状态到即将发生状态。

       ·活跃      一个异常正在被处理器服务但还没有完成。一个异常可以打断另一个异常的执行,在这种情况下,两个异常都在活跃状态。

       活跃和待进行       异常正在被服务,同时还有一个来于同一源的待进行异常

       异常类型:

       复位       复位被上电或热重启呼唤。异常模型对待复位作为异常的特殊形式。当复位被声称,处理器的操作停止,可能在一条指令的任何点。但重启被去声称,从向量表的复位入口地址执行复位。执行复位作为在线程模式特权执行。

       不可屏蔽中断 不可屏蔽中断可以被外设或者软件触发标记。这个是除了复位最高优先级的异常。它永久的被使能而且有一个固定优先级-2。NMIs不能被其他异常屏蔽或阻止活跃,不能被除了复位的其它异常抢先占有

       硬件错误       一个硬件错误是一个异常,它出现因为在异常处理中的一个错误,或者因为异常不能被其它异常机制管理。硬件错误有一个固定优先级-1,意味着它们优先级高于其它可配置优先级的异常。

       内存管理错误       内存保护错误是一个异常,它出现因为内存保护相关错误。固定的内存保护限制决定错误,因为指令或数据处理。这个错误用于取消指令访问XN内存区域。

       总线错误       总线错误是一个异常,它出现因为内存相关的错误因为指令或数据内存处理。它可能是来自在内存系统中一个总线上检测到的错误。

       使用错误       一个使用错误是一个异常,它出现因为指令执行相关的错误。包括:未定的指令;不合法未对齐的访问;指令执行的无效状态;指令返回的错误。对字和半字进行内存访问时不对齐地址、除以0会在内核配置汇报它们时产生一个使用错误。

       管理程序调用       管理程序调用是一个异常,它被SVC指令所触发。在一个操作系统环境中,应用程序使用SVC指令访问操作系统内核函数和设备驱动。

       PendSV  PendSV是一个中断驱动的系统级服务请求。在一个操作系统环境中,当没有其它异常活跃时使用PendSV切换上下文。

       系统滴答       系统滴答异常,当系统定时器到0时产生。软件同样可以产生滴答异常。在一个操作系统环境中,进程可以使用这个异常作为系统滴答。

       中断服务例程一个中断或者IRQ是一个被外设标记或者软件请求产生的异常。所有中断是异步于指令执行。在系统中,外设可以利用中断和处理器通信。

STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(3):Cortex-M3处理器异常模型

STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(3):Cortex-M3处理器异常模型

       为了简化软件层,CMSIS只使用了IRQ标号,因此对不是中断的异常使用负值。

       对于除了复位的异步异常,处理器可以在异常被触发和处理器进入异常处理之间执行另外一条指令。

       特权程序可以失能表中具有可配置优先级的异常。

       处理器处理异常使用:

       中断服务例程       中断IRQ0到IRQ67是被中断服务例程处理的异常。

错误处理       硬件错误,内存管理错误,使用错误,总线错误是被硬件处理处理的错误异常。

系统处理       不可屏蔽中断,PendSV,管理程序调用,系统滴答,错误异常,都是由系统处理处理的系统异常。

向量表包含了栈指针的复位值,以及所有异常处理的起始地址。每一个向量的最低有效位必须为1,指明异常处理是Thumb代码。

STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(3):Cortex-M3处理器异常模型

系统复位,向量表固定在地址0x00000000.特权程序可以写向量表偏移寄存器重新安置向量表起始地址到一个不同的内存位置,在范围0x00000080到0x3FFFFF80。

所有异常有一个关联的优先级:一个低的优先级值表明一个高的优先级;除了复位、硬件错误、不可屏蔽中断这些异常外,所有异常均可配置优先级。

如果软件没有配置任何优先级,则所有可配置优先级异常的优先级都为0。配置优先级的范围为0-15.这意味着复位、硬件错误、不可屏蔽中断都有负优先级值,永远有着高于其它异常的高优先级。

假设:分配一个高优先级值为IRQ[0],分配一个低优先级值为IRQ[1],这意味着IRQ[1]优先级高于IRQ[0]。如果IRQ[1]和IRQ[0]被声称,IRQ[1]将会先被执行。

如果多个待解决异常有同样的优先级,则待解决异常中有着最低异常编码的优先发生。例如,IRQ[0]和IRQ[1]待解决并且具有相同的优先级,则IRQ[0]比IRQ[1]优先执行。

当处理器正在执行一个异常处理,如果出现一个高优先级的异常处理则它抢先占有。如果一个具有同样优先级的异常出现,则不抢先占有,不管异常编号。然而,新异常的状态改为待解决。

为了系统利用中断增加优先级控制,嵌套向量中断控制器支持优先级组。它分一个中断优先级寄存器为2个域:一个上面的域定义组优先级;一个下边的域定义组内的子优先级。只有组优先级决定中断异常抢占。当处理器正在执行中断异常处理时,另一个具有同样组优先级的中断不会抢先占有。如果多个待解决的中断具有同样的组优先级,组内子优先级决定它们执行的顺序。如果多个待解决的中断有同样的组优先级和组内子优先级,则中断编码号最小的先执行。

异常进入:异常进入出现在有一个足够优先级的待解决异常且处理器在线程模式或者新异常的优先级高于正在被处理的异常(在这种情况下,新异常抢占原始异常)。当一个异常抢占另一个,异常为嵌套的。充分优先级意味着异常有高于被屏蔽寄存器设置的优先级。一个低于屏蔽的优先级异常将会被处理器暂定而不会被处理。除非异常是一个平衡链或晚到异常,当处理器取走一个异常,处理器压入信息到当前栈。操作被称为压栈,8字数据的结构称为栈帧。栈帧包含的信息有:R0-R3,R12,返回地址,进程栈指针,链接指针。在快速堆栈后,栈指针指向栈帧的最低地址。除非栈对齐被失能,否则栈帧是对齐双字地址。栈帧包含返回地址,这是被中断程序中下条指令的地址,这个值被恢复在异常返回的程序计数器中为了恢复被中断的程序。在堆栈操作的同时,处理器执行向量获取,从向量表中读取异常处理的开始地址。当堆栈完成后,处理器开始执行异常处理。同时,处理器写一个EXC_RETURN值到链接寄存器中,这表明栈帧和在进入入口前处理器这个在操作模式相应于的哪一个栈指针。如果在异常进入中没有高优先级异常出现,处理器开始执行异常处理并且自动改变相应暂定中断的状态到活跃。如果在异常进入中另一个高优先级异常出现,处理器为这个异常处理执行异常而不需要改变前一个异常的暂停状态,这是晚到示例。

异常返回:异常返回出现在处理器正在处理模式并且执行了一个装载EXC_RETURN到程序计数器指令。EXC_RETURN是在异常进入装载进链接寄存器的值,异常机制依赖这个值检什么时候处理器完成了异常处理。这个字最低4位表明了返回栈和处理器模式。处理器设定位[31:4]为0xFFFFFFF,当这个值装载进程序计时器时,表明处理器异常完成,处理器开始初始化异常返回顺序。

STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(3):Cortex-M3处理器异常模型