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

  在嵌入式系统开发过程中,不可避免的会和“中断”打交道。很多初学者对中断的理解不深,往往是看到中断绕着走。其实不然,费点时间搞懂中断能解决不少问题。
  中断英文“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次方)个不同的级别,不同的中断可以设定为相同的优先级别(抢占优先级和响应优先级都相同),相同优先级别的中断按照触发时间顺序依次执行,同时触发时具体执行顺序看程序心情。

  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值