2.异常退出
当异常服务程序最后一条指令将进入异常时的 LR 的值加载到 PC 中。该操作指示中断服务结束,在 从异常返回时处理器将执行下列操作之一:
如果激活异常的优先级比所有被压栈(等待处理)的异常的优先级都高,则处理器会末尾连锁到一 个激活异常。
如果没有激活异常,或者如果被压栈的异常的最高优先级比激活异常的最高优先级要高,则处理器 返回到上一个被压栈的中断服务程序。
如果没有激活的中断或被压栈的异常,则处理器返回线程模式。 在启动了中断返回序列后,下述的处理就将进行: 出栈:先前压入栈中的寄存器在这里恢复。内部的出栈顺序与入栈时的相对应,堆栈指针的值也改
回先前的值。
更新NVIC寄存器:伴随着异常的返回,它的活动位也被硬件清除。对于外部中断,倘若中断输入再 次被置为有效,悬起位也将再次置位,新一次的中断响应序列也可随之再次开始。
异常返回值:异常返回值存放在LR中。这是一个高28位全为1的值,只有[3:0]的值有特殊含义,如 表2.10所示。当异常服务例程把这个值送往PC时,就会启动处理器的中断返回序列。因为LR的值是由 Cortex-M3自动设置的,所以只要没有特殊需求,就不要改动它。
表 2.10 EXC_RETURN 各位含义
因此,上述表格中EXC_RETURN的值有三种情况: 0xFFFF_FFF1:返回处理器模式;
0xFFFF_FFF9:返回线程模式,并使用主堆栈;
0xFFFF_FFFD:返回线程模式,并使用线程堆栈。 例如系统中使用了PendSV异常,服务程序结束时由处理模式返回到线程模式前使用进程堆栈,如 程序清单L2.3所示。
程序清单 L2.3 异常返回类型实例
OSPendSV
LDR LR,=0Xfffffffd BX LR
;异常服务程序
;返回到线程模式进程堆栈