这篇主要记录下我对中断的了解,能够从这篇中窥见计算机系统有趣的地方。
中断这个概念能够说是所有微机的根底,甚至能够说微机就是一条条执行指令+中断。
可是为什么要用中断呢,一条条执行下来不就好了吗?这个主要是由于微机必需要处理突发状况。假设突发状况标志为变量A,假如不用中断,处理的方法是不断检测A,也就是在一条条指令中加上一条检测A的指令。
诶,这不就攻克了吗?的确,假如突发状况不多而且不紧要的话,这样来一点问题都没有。但是,我们假设突发状况很紧要,必需在10条指令执行时长内初始处理,那就是说必需每执行10条指令就加一条检测指令。这样一下子执行速度就慢了10%,由于大部分时长这条检测指令都是白执行的。可想而知,假如要应对的突发状况多了,执行速度会被拖得多慢。
文章相对比较长,字数比较多,大家可以先打开头像关注我,之后慢慢看,///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像左下角黑色字体加我也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///
兴许你想到一个好方法:我们能够将多个突发状况标志位单独做个门电路,让他们共有触发一个标志,指令线上只检测一个标志,多余的处理跳转过去再看。这的确是个不错的想法,不过却有一个致命的漏洞:只有有一个特别紧要的突发状况要处理,整个突发状况的检测就必需按最紧要的来。假设有一个状况必需在一条指令时长内初始处理,那即便这个状况非常罕见,指令线也必需每执行一条就检测下标志。所以,指令线中检测突发状况的上限是50%的速度下降。
芯片商当然不会放过这个50%的速度优化空间,他们想出的方法就是中断。从老思维来了解,中断其实就是每执行一条指令就检测下标志:不过不是在指令线中,而是在更低一层上“截胡”。
大家知道,指令线并不是凭空而来说要指令跑指令就跑,而是用寄存器+门电路搭起来的。而且,为了用尽量少的硬件完成没穷的指令执行,芯片用到了晶振之类的节拍器,每执行完一条指令后就回头复用之前的硬件(现代CPU为了更高的效率,执行一条指令分为好几个阶段,每个阶段执行完后就初始复用硬件,称为指令流水线)。这个的益处是低老本满足了大部分应用:假如对时长要求不太苛刻的话跟着节拍一条条来执行就好了。不过,某些应用对时长要求太严格了,这个时候就直接用门电路搭(假如FPGA),左边给输写,右边就给结果,光速完成指令(这个的害处当然是只能执行这一条指令…)。
中断就能够了解为门电路做的“光速指令”。在指令线上每条指令执行完毕时,节拍器翻开“光速指令”,中断标志会马上触发一个标志,导致正常指令线高低一条指令没法进入执行局部,被中断“截胡”,微机进入中断处理程序的入口。这样整个架构就达成这样的一个效果:指令线上每执行一条指令就执行一条检测突发状况的指令!同时一点都不影响指令线的效率!
由此可见,中断的构思是相当精巧的。当然,这个只是了解中断的核心概念,没论是硬件的设计还是在中断之上开展出来的操作系统都远远比这个复杂,更深层的进修了解还是要看计算机的几门核心课程。
中断的概念: 中断是当单片机的CPU在执行程序时,外部或内部发生了一个随机事件,导致CPU暂时中断正在执行的程序,转去执行一段特殊的服务程序也就是中断服务子程序或中断处理程序。当处理完服务程序后,返回到被中断的程序继续执行,这样的一个过程就被称为中断,引发这个中断的事件被称为中断源。中断在stm32中还被分为相应的优先级,低优先级的中断会被高优先级中断所中断,即为中断的嵌套。在Crotex-M3内核中支持256个中断,其中包含16个内核中断以及240个外部中断。STM32F10X芯片中只用了其中的84个中断通道,包含16个内核中断和68个可屏蔽中断。
中断的优先级: STM32的每个中断通道都有一个中断优先级控制字节(8位二进制数据,可设置为0~255,数值越小,优先级越高。在STM32F103中只用其中高4位数据),其用于表达优先级的高4位又被分为抢占式优先级和响应式优先级。在抢占式优先级相同情况下,高响应优先级的中断优先被响应。优先级相同时,按照中断响应的顺序执行服务程序,越靠前的先执行。中断的相关功能需要通过NVIC(嵌套向量中断器)来配置。
中断的配置: 首先使能某个外设中断;然后设置中断优先级分组,初始化NVIC_InitTypeDef结构体,设置抢占优先级和响应优先级,使能中断请求;最后编写中断服务函数。
对单片机感兴趣的朋友可以找我,我录制了一些关于单片机的入门教程,有需要的童鞋找我拿就像,免费的,私信我“林老师”就可以拿~点击打开我的头像就能领取