深入理解中断

深入理解中断

想全面了解一个事物:首先问几个问题:
1.本质是什么?
2.第一原则是什么?
3.结构是什么?

要解决上面的问题,需要从3W开始做起:
What? How? Why?

what?

维基百科给的一句话定义:在计算机科学中,中断是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。

举个很简单的例子:假如你是CPU,你正在执行的任务是——坐在沙发上看电影,但同时你叫了外卖(可以看成一个外设启动),那么你肯定需要在某个时刻,暂停电影去取外卖(执行的操作)。这时,你有两种选择:
1.从叫外卖的时刻起,就暂停电影,一直在门口等着,直到外卖送过来。
2.送餐员给你打电话后,你才暂停电影,去取外卖。
作为一个正常人,我们肯定会选择后者。但对于CPU来讲他却没那么智能,前者就是所谓的轮询方式(polling),后者就是所谓中断方式(interrupt)。

再通过wiki百科的解释加深一下印象:
引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只需要付出一些很小的切换所引发的时间代价。(这段话读起来和并行的系统调度有点像)

对于【中断】,是一个比较大的范畴,想要研究它,需要按照不同的特性进行【分类】
从中断的【产生方式】分类:
硬件中断:由电路/外围设备产生的中断
软件中断:也成为软中断,是一条CPU指令,经过这个中断后,会被切换到一个子例程中,实现【系统调用】(system call)

硬件中断又根据【必要性】分为:
可屏蔽中断
非可屏蔽中断

how?

中断触发方式:
状态触发方式:
在依状态触发的中断系统中,一个等待响应的中断会在中断请求线路上以特定 的电位标示,如高电位(1)或低电位(0)。
边沿触发方式
中断设备向中断线路发送一个脉冲作为中断信号,可以是通过上升沿还是下降 沿来选择。
混合模式
状态触发与边沿触发兼顾
消息信号
类似于边沿触发方式,是一种瞬间产生的中断请求,不过这是通过计算机总线, 发送一串比特码来实现中断请求。

在stm32进行开发时,有一个文件:stm32xx_it.c存放中断服务函数,例如:
USART中断服务函数
在这里面,会调用HAL库函数进行中断处理,而HAL_PPP_IRQHandler(&huart1);最中会调用用户自定义的CallBack回调函数,从而完成特定的事件。那么,程序是如何进入中断服务函数PPP_IRQHandler的呢?
按照对C语言的理解,在main函数中,理应会存在一个入口,用以进入某个函数,但实际上却没能发现这个入口。
经过查阅可知,程序进入中断服务函数的方法,是通过某种触发(大部分是硬件触发)
程序找到他的方式是怎样的?
以串口中断为例,在启动文件startup_stm32f10x_md.s中有这样三句与串口中断相关的代码

 DCD     USART1_IRQHandler 
 EXPORT  USART1_IRQHandler                 [WEAK]  
 USART1_IRQHandler 

汇编指令:DCD USART1_IRQHandler

DCD 是一条数据定义的【伪指令】,用于分配一篇连续的【字】存储单元,并用指定的数据初始化。
例如:

DataTest DCD 45 ;分配一片连续的字存储单元并初始化。

汇编指令:EXPORT USART1_IRQHandler
EXPORT ,表示本程序里面用到的变量提供给其他模块调用的
也就是说声明了一个USART1_IRQHandler标签供外部引用
可能是用来供stm32f4xx_it.c文件中进行引用的。

由此一来,
当配置好USART1的控制寄存器中断使能时,当发生中断(异常)时,该异常被Cortex-M3内核接受,对应的异常Handler就会执行。而这个响应过程都是硬件来完成的,当然为了决定Handler的入口地址,Cortex-M3使用了“向量表查表机制”。通过启动文件查询到其地址。
所以在异常发生后,CPU进入异常模式,同时程序计数器PC自动指向异常入口地址,也就是USART1_IRQHandler,进而执行中断服务函数中的应用。

总结一下,就是说,
1.中断是由某个事件触发的,可以将正在进行的程序打断。
2.stm32中,中断服务函数一般是公共入口,进入中断服务函数后,需要查询是哪种中断,再进行相应的处理。
3.中断处理前,先清除中断标志。这样一方面保证中断不会被其他低级中断源打断,一方面保证中断在执行后不会重复执行

这里解释一下为什么放在最后,一般来讲,在软件清中断后,需要等待硬件执行,然而硬件可能有延迟,这样导致,虽然在程序里执行了清中断指令,但是硬件并没有清除中断,而软件已经跳出了中断,并且进行下一次中断的判断(此时硬件仍没有清中断),因此会再次进入该中断,导致中断重复。
当然,也可以在等待硬件清除中断成功后,再往下执行。

4.中断服务函数应该尽量简短,一般是做一些标识,不要在中断中做延时之类的
占用CPU很长时间的工作。----快进快出
5. 中断服务函数不会被任何一个函数调用,当中断条件满足后,NVIC控制把CPU拉到中断服务函数中执行。

why?

目前的理解,中断适用于管理多任务系统的一种方式(在这种情况下,中断和系统进程仍然是线性执行,而不是并行)中断所减少的是系统等待外部进程所用的时间,如下图所示:

请添加图片描述
可以看出,中断方式下只用了25s,而轮询方式下需要35s,中断方式在某种程度上可以提高系统的执行效率。

CubeMX进行中断配置

参考资料:
[1] STM32中中断服务函数的编写注意事项
[2]STM32是如何进入中断函数xxx_IRQHandler的
[3]wikipedia关于中断的介绍

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值