CPU(MCU)的重要机制-中断

既然说到中断,那就提一下,为什么会有这东西产生,前面我们讲CPU的结构时候都会这么来说,任何事物的产生都有其由来。

       最初应该是只有轮询这么一种机制,这在CPU处理问题时候可以想到比如我按了一个按键,我就要CPU给我一个响应,很容易想到的是CPU不断的去查询,当查询到按键发生时候就会给出一个响应,只要查询时间足够快,总可以使这件事情及时响应。但随着CPU的发展,需要处理的不单单是按键一个事,还有定时阿,各种通讯接收阿,都需要CPU给出响应,若是再采用轮询的方法,很容易就会顾此失彼,一段时间只能服务一件事,而大多时间CPU则处于空闲,浪费了很多资源。于是人们就提出了中断的概念来解决这一问题,就是CPU你忙你的,我只有当按键按下时通知你,这时你才放下手头事情来处理这个按键对应的操作,处理完这个按键后,又返回到原来手头的事情接着做。这一过程分解开来,就分解了以下几个过程:

  1. 由硬件来判断是否发生外部事件并通知CPU(这点需要强调的是中断是有硬件来判断的,比如我们来设置中断时,往往针对相应的寄存器设置中断开关,是哪个中断源)
  2. 由中断服务程序来处理事件(这里需要强调的一点,比如遇到按键按下了,接下来该干什么,CPU会查中断向量表,该干什么在中断是叫中断服务程序,它与写在main函数里的大部分程序不同,它是由CPU来处理的,比如当某个中断发生时,CPU就会转去处理这个相应的函数,那么这又是如何进行的呢,这就用到了中断向量表这么一个东西,几乎每个MCU都有这个,中断向量表为CPU里一段连续的存储空间,每个中断在向量表中都有相应的表项,该表项可写中断服务程序的入口地址,也就是我们CPU转去处理那个程序的第一条指令的地址,换句话说,C程序中函数就代表了指向该段程序的第一条指令的地址的指针,前面讲到该函数只能由硬件处理,而且不能被主函数调用,所以其无返回值也无参数。

前面讲了中断执行完要返回到原来状态执行的,这时就需要将现场保存下来,也就是压栈,当处理完后又出栈,这么一种机制,但由于中断与程序不同,程序在编译时候,它又是顺序执行的,相当于每个时间点处理哪个都规定了下来,所用到的寄存器也提早确定了下来,所以其压栈出栈就容易许多,而中断由于是硬件来处理,其用到的寄存器根据不同中断又有所区别,而且通常比我们普通程序需要压栈的东西多(特别在涉及到中断嵌套时候,不过还好中断源毕竟有限,就限制了中断的数量,涉及到中断优先级容易发生嵌套,高的优先级打断低的)。还是回来说中断的压栈把,中断比较有意思,它的还原现场叫做保存地址和寄存器上下文(register context),如下图所示:

CPU(MCU)的重要机制-中断

解释一下上面的说明:

由于中断可能在任何时候,任何执行的位置打断主程序的执行,而主程序的执行是一条条机器指令对寄存器的改写,所以在中断时候需要对这些寄存器进行保存现场,那到底该保存哪些寄存器呢,如果保存所有不就可以了,这个想法是ok的,但实际考虑到CPU执行时间的效率(压栈的时间)和资源利用(栈的空间使用)的考虑,CPU只对一部分的寄存器进行了压栈(如ARM Cortex内核的MCU就只对R0,R1,R2,R3,R12,LR,PC,XPSR,这在datasheet中也有说明,若是操作中用到了其他寄存器则用户需自己压栈和出栈)

 

上一篇:《Tableau数据可视化实战》——1.12节合并不同数据源


下一篇:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证