不同芯片处理差别
事件 | cortex M3/M4 | cortex A7 |
---|---|---|
保存/恢复现场 | 硬件实现 | 软件实现 |
处理异常 | 向量表上放置的是函数地址 | 向量表上放置的是跳转指令 |
cortex M3/M4
M3/M4的向量表中,放置的是具体异常/中断的处理函数的地址。
发生异常/中断时,硬件上实现了这些事情:
- 保存现场:把被中断瞬间的寄存器的值保存进栈里
- 根据异常/中断号,从向量表中得到函数地址,跳转过去执行
- 函数执行完后,从栈中恢复现场
我们只需要在向量表中,把处理函数的地址填进去就可以了。
cortex A7
A7的向量表中,放置的是某类异常的跳转指令。
发生异常/中断时,硬件上实现了这些事情:
-
CPU切换到对应的异常模式,比如IRQ模式、未定义模式、SVC模式(根据向量表中的跳转指令)
-
保存被中断时的CPSR到SPSR
- CPSR:current program status register,当前程序状态寄存器
- SRSR:saved program status register,保存的程序状态寄存器
-
跳到这个异常的入口地址去,执行指令,这通常是一条跳转指令,跳转到对应软件开始执行
软件要做的事情就比较多了:
- 保存现场
- 分辨具体是模式中的哪种异常/中断
- 调用对应的处理函数
- 恢复现场
保存现场
由于不同芯片寄存器分布的不同,保存现场的操作也有所不同。
cortex M3/M4
执行函数A时,异常->执行函数B
那么A将自己去保存R0-R3,R12,LR,PSR;B如果不用剩下的寄存器,那B就不管了,如果可能调用到,B会提前保存R4-R11
M3/M4在调用异常处理函数前,把LR设置为一个特殊的值,转给特殊的值被称为EXC_RETURN。
当PC寄存器的值等于EXC_RETURN时,会触发异常返回机制,简单地说:会从栈里恢复R0-R3,R12,LR,PC,PSR等寄存器。
M3/M4有两个操作模式:
- 处理模式:执行中断服务程序等异常处理时,处于处理模式
- 线程模式:执行普通应用程序代码时,处于线程模式
cortex A7
A7有九个操作模式:User、Sys、FIQ、IRQ、ABT、SVC、UND、MON、HYP。
各个操作模式都有自己的SP寄存器,即有自己的栈,还有自己的SPSR寄存器。(User和Sys共用一套如上图的寄存器)
硬件执行模式跳转指令后,我们要自己给对应模式设置栈等寄存器的初始化。
软件保存现场:将R0-R3、R12、LR保存到对应模式的SP寄存器(栈)中。
举例:快中断模式下(FIQ),FIQ有很多自己的寄存器供处理异常使用,所以很多寄存器不用保存现场,省事
中断特性(后期补充)
- Linux将中断分为硬件中断(如按键中断)和软件中断(如定时器中断),一般优先级先硬后软。
- 中断不能嵌套,中断中再来中断再来中断 no ,套不了几个娃栈就爆炸了
- 中断期间程序运行不了,咋办捏,要么给中断处理函数整简洁点,要么就少占用一会中断(展开讲讲这个)
少占用一会中断这个方案,通过拆分处理函数实现,上半部执行紧急事件,剩下的不太急的下半部执行时,别的中断就能打断了。