创建时间: | 2022/1/20 12:05 |
更新时间: | 2022/1/20 14:14 |
作者: | gi51wa2j |
标签: | ARM, bingo, 计算机原理, 正文 |
每执行完一条指令都会检查有无中断/异常产生
发现有中断/异常产生,开始处理:
保存现场
分辨异常/中断,调用对应的异常/中断处理函数
恢复现场
不同的芯片,不同的架构,在这方面的处理稍有差别:
CPU中止当前执行,跳转去执行处理异常的代码:也有差异
cortex M3/M4在向量表上放置的是函数地址
cortex A7在向量表上放置的是跳转指令
保存/恢复现场:cortex M3/M4是硬件实现的,cortex A7是软件实现的
提出问题:
CPU怎么跳去执行程序的
如何保存现场与恢复现场
参考资料:DDI0403E_B_armv7m_arm.pdf、ARM Cortex-M3与Cortex-M4权威指南.pdf、PM0056.pdf
要想理解这个处理流程,需要从向量表说起。 向量,在数学定义里是有方向的量,在程序里可以认为向量就是一个数组,里面有多个项。 在ARM架构里,对于异常/中断,它们的处理入口会整齐地排放在一起。
M3/M4的向量表中,放置的是具体异常/中断的处理函数的地址。 比如发生Reset异常时,CPU就会从向量表里找到第1项,得到Reset_Handler函数的地址,跳转去执行。(问题:CPU怎么知道调过来执行哪一个函数?由硬件确定,这时软件还没有运行) 比如发生EXTI Line 0中断时,CPU就会从向量表里找到第22项,得到EXTI0_IRQHandler函数的地址,跳转去执行。
跳转之前,硬件会保存现场
函数执行完毕,返回之后,硬件会恢复现场
发生异常/中断时,硬件上实现了这些事情:
保存现场:把被中断瞬间的寄存器的值保存进栈里
硬件分辨异常/中断,根据异常和中断号,从向量表中得到函数地址,跳转到向量表执行相应函数
函数执行完后,从栈中恢复现场(软件触发,硬件恢复)
保存现场、分辨异常/中断、跳转执行,都是硬件实现的。 我们只需要在向量表中,把处理函数的地址填进去就可以了。
硬件承包了大部分的工作。
M3/M4的向量表中,存放的是函数地址。
参考资料:ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf
实际上,以前的S3C2440属于ARM9处理器,它的异常/中断处理流程给cortex A7是一样的。
A7的向量表中,放置的是某类异常的跳转指令。 比如发生Reset异常时,CPU就会从向量表里找到第0项,得到b reset指令,执行后就跳转到reset函数。 比如发生任何的中断时,CPU就会从向量表里找到第6项,得到ldr pc, _irq指令,执行后就跳转到_irq函数。
跳转之前,硬件只会保存CPSR寄存器
跳转之后,软件要保存现场
函数执行完毕,返回之前,软件恢复现场
发生异常/中断时,硬件上实现了这些事情:
CPU切换到对应的异常模式,比如IRQ模式、未定义模式、SVC模式
保存被中断时的CPSR到SPSR
CPSR:current program status register,当前程序状态寄存器
SRSR:saved program status register,保存的程序状态寄存器
跳到这个异常的入口地址去,执行指令,这通常是一条跳转指令
软件要做的事情就比较多了:
保存现场
分辨异常/中断
调用对应的处理函数
恢复现场
A7的向量表中,存放的是跳转指令。