ARM_Cortex-M3内核结构(14)
发布时间:2021-06-07
发布时间:2021-06-07
表 2.9 向量偏移量寄存器(0xE000ED08)
向量表中至少需要有 4 个值:栈顶地址;复位程序的位置;NMI 异常的位置;硬故障的异常的位置。
当中断使能时,不管向量表的位置在哪,它指向所有使能屏蔽的异常。并且如果使用 SVC 指令,还 需要指定 SVCCall ISR 的位置。
2.5.4 异常的进入与退出
1.异常进入
入栈:当处理器发生异常时,首先自动把 8 个寄存器(xPSR、PC、LR、R12、R3、R2、R1、R0)压 入栈,处理器自动完成,在自动入栈的过程中,把寄存器写入栈的时间顺序,并不是写入空间相对应的, 但机器会保证正确的寄存器被保存到正确的位置,如图 2.10 所示,假设入栈,栈地址为 N。
地址
数据
时间
2.10 内部入栈示意图
取向量:发生异常,紧接着内核将根据向量表找出正确的异常向量,然后在服务程序的入口处预取 指,处理器将取指与取数据分别能过总线控制,使入栈与取指这两项工作能同时进行,以便快速进入中 断。
更新寄存器:入栈和取向量操作完成之后,在执行服务程序之前,还必须更新一系列寄存器。 SP:在入栈后会把堆栈指针(PSP或MSP)更新到新的位置。在执行服务例程时,将由MSP负责对堆 栈的访问。
PSR:更新IPSR位段(地处PSR的最低部分)的值为新响应的异常编号。 PC:在取向量完成后,PC将指向服务例程的入口地址, LR:在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”,在异常进 入时由系统计算并赋给LR,并在异常返回时使用它。 以上是在响应异常时通用寄存器及特殊功能寄
存器的变化。另外在NVIC中,也会更新若干个相关寄 存器。