×
单片机 > 单片机程序设计 > 详情

【STM32】中断和中断优先级理解

发布时间:2020-08-24 发布时间:
|

  在嵌入式系统开发过程中,不可避免的会和“中断”打交道。很多初学者对中断的理解不深,往往是看到中断绕着走。其实不然,费点时间搞懂中断能解决不少问题。
  中断英文“Interrupt”,字面很好理解,就是打断的意思。在程序中“Interrupt”打断的自然也是程序。举个例子,有一个遥控的自动避障小车,小车在向前跑的过程中程序一直监测周围环境,实现避障功能,这个时候你想遥控小车停个三分钟,就要用到中断了,也就是打断原有的“监测环境——避障”程序流程。打断的目的就是执行“别跑啦,停下来歇歇”这个程序,我们称中断之后执行的程序为“中断服务函数”。一般情况下,中断服务函数执行完后(小车休息三分钟,或者干其他的事情完事后),会清理一下中断标志位,即告诉主程序中断完事儿了,你该干嘛干嘛。清理了中断标志位后,此时小车又开始呼呼的跑了……
  简而言之,中断就是由某个事件触发,打断原有的执行程序,去执行中断服务函数,执行完后再返回被打断的地方继续执行。就像你正在写作业,突然老妈喊你吃饭,你去吃完饭回来继续写作业。“吃饭”就是一个中断,打断了你写作业嘛。
  使用中断时必不可少的会牵扯到中断优先级。优先级有什么作用呢?主要是用在好多好多中断到来的时候,我该怎么处理这些中断,先处理哪些后处理哪些,有了中断优先级,程序就按照优先级顺序依次执行这些中断。
  中断优先级包括两部分:抢占优先级和响应优先级,可以分别理解为牛逼优先级和不是很牛逼的优先级,两者都有很多级别,比如抢占优先级0,1,2,3……响应优先级0,1,2,3……。有什么作用呢?前面内容我们提到中断会打断主程序,抢占优先级高的中断还可以打断抢占优先级低的中断服务函数。例如:
    设定事件1中断的抢占优先级2,响应优先级3;
    设定事件2中断的抢占优先级3,响应优先级2;
    设定事件3中断的抢占优先级2,响应优先级0.
  假设三个事件的中断同时到来,那么程序的执行顺序为:主程序——中断3——中断1——中断2——主程序.
  假设事件2中断先到,紧接着事件1中断到来,事件3中断未触发,程序执行顺序:主程序——中断2——中断1——中断2——主程序。也即高抢占优先级的中断会打破第抢占优先级的中断。
  假设事件1中断先到,紧接着事件3中断到来,事件2中断未触发,程序执行顺序:主程序——中断1——中断3——主程序。虽然中断3的响应优先级高于事件1的响应优先级,但是它不能打破后者,原因就是因为响应优先级不是很牛逼。但是当中断1和中断3同时触发时,程序是先执行中断3的,这就是响应优先级的作用。

  在STM32中,还有一个中断优先级组的概念。我们知道中断优先级有个16位的寄存器,寄存器的bit[7:4]这四位是分配给中断优先级的(包括抢占优先级和响应优先级),中断优先级组的作用是分配这四位前几位给抢占优先级用,后几位给响应优先级用。例如STM32F4分为0,1,2,3,4,5这五个组,见下表:

bit[7:4] 分配情况

结果

备注

0

4位全给响应优先级用

响应优先级0,1,2,……15.

共16个级别

1

前1位给抢占优先级用,后3位给响应优先级用

抢占优先级0,1;响应优先级0,1,2,……7.

共2*8=16个级别

2

前2位给抢占优先级用,后2位给响应优先级用

抢占优先级0,1,2,3;响应优先级0,1,2,3.

共4*4=16个级别

3

前3位给抢占优先级用,后1位给响应优先级用

抢占优先级0,1,2,……7;响应优先级0,1.

共8*2=16个级别

4

4位全给抢占优先级用

抢占优先级0,1,2,……15.

共16个级别

  有时候我们可能需要多一点抢占优先级,或者多一点响应优先级,这个时候只需要指定中断优先级组就可以了。但是需要说明的是:1,程序只能指定一次中断优先级组,也就是说,指定了中断优先级组别之后就不能更改了,指定组别之后,抢占优先级的个数和响应优先级的个数也就确定了。2,对于STM32F4,中断优先级最多只有16(2的4次方)个不同的级别,不同的中断可以设定为相同的优先级别(抢占优先级和响应优先级都相同),相同优先级别的中断按照触发时间顺序依次执行,同时触发时具体执行顺序看程序心情。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析