【蜗牛黑板报】什么是中断
2020-11-01 本文已影响0人
技术是神奇的
举个现实中的例子——
“一个人一整个下午都在看电影, 但是中间突然有快递员给他打电话让他去取快递, 于是他就按下了电影的暂停键, 去完了快递, 回来接着看完了电影.”
背景
中断的发明是用来解决宏观上的并行需要.
为什么强调是宏观上的并行? 因为微观上的并行才是真正意义上的并行, 是指每时每刻多个事情都是同时进行的; 宏观是从整体来看, 宏观上是并行的不等于微观上的并行, 有时候宏观上是并行的, 微观上是串行的.
什么是中断
开头举的例子就是宏观上的并行和微观上的串行.
- 例子中一个人等同于SoC中的1个CPU(单核CPU), 这个CPU看电影就不能收快递,收快递就不能看电影(也就是说不能真正的并行). 单核CPU在微观角度是串行的, 但是因为CPU很快, 所以从宏观来看是并行的.
- 上例中大部分时间在看电影, 中间少量时间去收快递, 那么类比于CPU来说, 看电影就是CPU的常规任务, 而收快递则应该是中断例程. 就是说, CPU平时一直在进行看电影的任务, 等快递来了(中断发生了)快递员(类似于中断源)会打电话叫人收快递(中断源会触发中断通知CPU去处理中断), 人收到电话(CPU收到中断信号)后会去暂停电影(CPU保持常规任务的现场)跑去收快递(CPU去执行中断处理程序ISR处理中断),收完快递(执行完ISR)回来继续看电影(CPU恢复常规任务的现场, 继续执行常规任务).
为什么需要中断?
因为单核CPU实际无法并行的, 但是通过中断机制, 可以实现假并行(宏观上的并行, 微观上实际还是串行的).
Soc对中断的实现机制: 异常向量表!!
异常向量表是CPU中某些特定地址的特定定义.
- 在CPU设计时, 就事先定义了CPU中一些特定地址作为特定异常的入口地址.(比如定义0x0000 0000地址为复位异常向量地址, 则在发生复位异常时CPU会自动跳转到该地址0x0000 0000去执行程序员编写的处理复位异常的代码, 值得说明的是, 该跳转是硬件自动跳转的, 不需要程序员操心, 即CPU设计使然; 又比如外部中断对应的异常向量地址为0x3000 0000, 则在发生外部中断后, CPU会硬件自动跳转到0x3000 0000去执行指令)
简单来说, 异常向量表是硬件向软件提供的处理异常的支持, 在CPU硬件设计时就已经决定了发生什么异常, CPU就自动跳转到哪个地址去执行; 软件需要做的就是把处理这个异常的代码的首地址填入这个异常向量地址.
异常和中断的区别和联系
- 针对Soc来说, 发生复位、软中断、中断、快速中断、取指令异常、数据异常等, 我们都统一叫异常. 所以说, 中断其实是异常的一种.
- 异常的定义就是突发事件, 打断了CPU的正常常规业务, CPU不得不跳转到异常向量表中去执行异常处理程序; 中断是异常的一种, 一般特指Soc内的内部外设产生的打断Soc常规业务, 或者外部中断(Soc的GPIO引脚传回来的中断).