本篇博客不是针对某一门具体的技术,而是从概念去理解某些东西,当然会拿某些技术举例子但是不限于特定某一门。
中断的概念:中断的概念最开始接触是在stm32单片机中。为什么会出现中断的概念呢?这个概念是为了解决什么问题?比如我们有一个功能,按键按下,led等亮起。这个很好实现,主程序进入cpu然后一直while循环,去检测按键所在gpio口的状态,如果发生改变那个就去控制led灯的gpio口的状态。很简单的逻辑。那么我的功能要求在变一变,我等主程序执行一个算法,然后到有人按下按键,led灯亮。这当然可以和算法一起放到循环里面每次循环都去检测一遍按键的状态,但是现在出现了两个问题,第一个如果算法比较大,执行3s才能执行的完,我按键就在这三秒之间,并且只持续了1s。这样按键就检测不出来了。第二个问题是这明显不符合我们的常识。按照我们的常识,如果有人在做一件事,比如睡觉,但是又得去上课,于是他和他室友说2点半叫我起床,我就专心睡觉了。正常的逻辑是这样的,不可能是我睡一秒就看看到没到点,没到点继续睡,到点了去上课吧?所以中断可以那多线程去理解,主线程去干主逻辑,子线程去检测事件,事件发生了通知主线程,执行事件发生的代码。
定时器的概念:定时器我第一次见是在winform里面,里面有个叫timer的空间,干的就是定时器的活,后来在stm32里面也有定时器的概念。首先是定时器干嘛用的。比如有类功能,叫到点下课,时间到了就得下课,闹钟就是个定时器。有了前面的中断的概念定时器就很好理解了,中断是检测各种各样的触发条件,这个条件发生后去执行相应代码。那么定时器就是我只检测时间这个触发条件,时间到了就去执行相应代码。所以,定时器可以看作中断的具体实现。
事件的概念:上述中断和定时器在stm32中是依赖寄存器实现的。但是在高级开发语言中,恨不得指针都不会让你用,更何况寄存器了。在winform中有个脚button的控件,说白了就是个按钮,这个控件里面有个点击事件,就是当你点击按钮时会触发相应的代码执行。这和我们上述的中断等概念何其相似。那么在c#里面又是谁去监控的这个事件是否执行呢?在c#里面有个叫delegate的东西,叫做委托,相当于c++的函数指针吧。当用户点击按钮时,其实是执行的这个委托的代码,这个委托会找到与之对应的函数然后执行,没创建一个事件都会有一个委托去盯着。但是上述的实现是c#封装好的,其底层应该是和stm32是一套路子。
所以上述概念有如下几个重要的地方,触发条件,谁去监控,触发后执行代码。