ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-24 13:35:33  阅读:227  来源: 互联网

标签:中断 寄存器 压栈 处理 按键 MCU CPU


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

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

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

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

解释一下上面的说明:

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

 

标签:中断,寄存器,压栈,处理,按键,MCU,CPU
来源: https://www.cnblogs.com/ideaWorks/p/15931309.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有