理论
引入—什么是中断?
通俗的说:比如我正在写博客,老板突然给我一个任务,我暂停的写博客,转而把老板布置的任务完成之后,再继续写博客,这个过程就可以理解成中断。
百度引用:‘中断是指CPU在处理某一件事A时,发生了另一件事B,请求CPU迅速去处理(这个过程是“中断发生”);此时,CPU暂时停止当前的A事件(这个过程是“中断响应”),转去处理B事件(这个过程是“中断服务”);待CPU将B事件处理完毕后,再回到事件A被中断打断的地方继续处理事件A(这个过程是“中断返回”)。这一过程,称之为中断。’
深入理解_线程的概念
我认为要想理解中断的概念,作为一个工科生,还应该理解线程的概念
线程:程序运行流的最小单元,一个程序是有一个或多个线程组成。
你可以理解成线程就是单片机执行的一个任务,比如,流水灯、读取发送某一个传感器的数据。但是我们平时写的单片机程序一般就是单线程的,就是单片机一个
多线程编程:如果你还是个小白,可以简单的理解我们使用的简单的单片机就只能执行一个任务,但是后面通过系统的学习你还会知道,就算是单线程的话,单片机也可以分时“执行多个任务”,这里是借助了计算机实现多线程的编程方法(比如一边播放视频一边听音乐,它可以先执行听音乐的任务,当视频的下一帧到,它先把音乐的任务暂停,保存这个任务所有的变量,执行播放视频到任务,然后再把播放视频的任务暂停,执行播放音乐的任务,不断地循环下去,另外你还要知道单片机的执行速度是非常快滴,快到你根本分辨不出来中间有卡顿。所以就会认为任务同时做了两件事)
这里可能有很多人想,现在的很多电子设备都是几核几线程的(多核、线程、进程、多线程的理解这里就不多讲了),多个CPU实现了并行运行方式,属于真正的多线程,但是多个CPU的控制方案成本几乎成倍的增加,而且要是实现多个CPU之间的通讯花费的实践较长,并且干扰影响较大。
中断源、中断任务、中断返回:
总结起来,就是你需要知道中断就是单片机处理任务A时,发生了触发中断的条件停下来执行另一个任务B,触发中断的条件就属于中断源,任务B就是中断任务(中断服务函数)。当中断任务执行完成后中断返回,在回到任务A中断的地方继续处理任务A。
中断优先级
为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。百度百科
这里再举一个简单的例子:仍然是我正在写博客,老板给我发了一个任务A,但是同时老婆也给我一个任务B,两个任务同时到达,我该先执行哪一个呢?当然先执行老婆的任务B了,然后再执行老板的任务A,再完成之后在继续写我的博客。在这里执行老婆的任务B就比执行老板任务A的中断优先级级别高。但是我要是正在执行老婆B的任务,这个时候老板的任务A过来了,这个时候我会继续执行老婆的任务B,也是因为老板的任务A没有老婆B的任务优先级高,这里
老婆任务 > 老板任务 > 写博客任务
所以多级中断的处理原则:当多级中断同时发生时,CPU按照由高到低的顺序响应。高级中断可以打断低级中断处理程序的运行,转而执行高级中断处理程序。当同级中断同时到时,则按位响应。
STM32的抢占优先级、响应优先级、NVIC 的优先级组
这里转自部分 https://blog.csdn.net/qlexcel/article/details/78841296
STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。
抢占属性:是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。
响应属性:应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。
NVIC 的优先级组:在配置优先级的时候,还要注意一个很重要的问题,即中断种类的数量。NVIC 只可以配置16 种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4 位的数字来决定,把这个4 位数字的位数分配成抢占优先级部分和响应优先级部分。
定时器中断、外部中断、串行口发送或接受中断
这些中断事件主要根据中断源不同划分。
定时器中断是你需要定时的时间A ms到了,会产生定时器中断,执行A ms后的中断内容。主要执行定时完成的任务。属于片内中断。
外部中断是中断源来自单片机的外部,比如61单片机的P3.2引脚检测到了跳变沿,接着执行外部中断任务。主要执行由外部因素影响的任务。属于片外中断。
串行口发送或接受中断是在串行口有接收到数据执行的中断任务。主要接收串行口的数据。属于片内中断。
|