ZHDU116G January 2018 – June 2024 CC1312PSIP , CC1312R , CC1352P , CC1352R , CC2642R , CC2642R-Q1 , CC2652P , CC2652PSIP , CC2652R , CC2652RB , CC2652RSIP , CC2662R-Q1
当存在具有足够优先级的挂起异常,且处理器处于线程模式或新异常的优先级高于正在处理的异常时,就会发生异常进入。在后一种情况下,新异常会抢占原异常。
当一个异常抢占另一个异常时,就会形成异常嵌套。
足够优先级意味着该异常的优先级高于屏蔽寄存器所设定的任何限制(请参阅优先级屏蔽寄存器 PRIMASK、故障屏蔽寄存器 FAULTMASK 和基址优先级寄存器 BASEPRI)。优先级低于此限制的异常将保持挂起状态,不会被处理器处理。
当处理器接受一个异常时,除非该异常是尾链异常或延迟到达异常,否则处理器会将信息压入当前栈(请参阅图 6-2)。该操作称为压栈,而八个数据字的结构称为栈帧。
图 6-2 异常栈帧压栈后,栈指针立即指向栈帧中的最低地址。
栈帧中包含返回地址,即被中断程序中下一条指令的地址。该值在异常返回时会恢复到 PC 中,以便被中断程序恢复执行。
执行压栈操作的同时,处理器会执行向量获取,从向量表中读取异常处理程序的起始地址。压栈完成后,处理器开始执行异常处理程序。同时,处理器会将一个 EXC_RETURN 值写入 LR,指示哪个栈指针对应于该栈帧,以及进入异常前处理器处于哪种工作模式。
如果在异常进入期间没有发生更高优先级的异常,则处理器开始执行异常处理程序,并自动将相应挂起中断更改为活动状态。
如果在异常进入期间发生了另一个更高优先级的异常(称为延迟到达异常),则处理器开始执行该异常的异常处理程序,且不会更改前一个异常的挂起状态。