【掌控】中断一下,小伙伴
老师,为什么要记笔记?因为好记性不如烂笔头。因为写了之后可以记忆更清楚。
好吧,我记笔记,中断。
我的学习总是很碎片化,而且总是找简单的学习。
所以越后面越难了。
学习让我快乐,也让我伤心。
如果我正在写作业,有电话来了,我要停下来手中的活去接电话,接完电话,回过头来再写作业。
这就是中断。
【小资料,来自网络】
中断 - 计算机术语
中断:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。
中断是计算机中的一个十分重要的概念,在现代计算机中毫无例外地都要采用中断技术。什么是中断呢?可以举一个日常生活中的例子来说明,假如你正在给朋友写信,电话铃响了。这时,你放下手中的笔,去接电话。通话完毕,再继续写信。这个例子就表现了中断及其处理过程:电话铃声使你暂时中止当前的工作,而去处理更为急需处理的事情(接电话),把急需处理的事情处理完毕之后,再回头来继续原来的事情。在这个例子中,电话铃声称为"中断请求",你暂停写信去接电话叫作"中断响应",接电话的过程就是"中断处理",相应地,在计算机执行程序的过程中,由于出现某个特殊情况(或称为"事件"),使得CPU中止现行程序,而转去执行处理该事件的处理程序(俗称中断处理或中断服务程序),待中断服务程序执行完毕,再返回断点继续执行原来的程序,这个过程称为中断。中断是为了使单片机具有对外或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部时间的能力。它也是学习单片机重要的功能之一。对于单片机来讲,中断是指CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。为什么要采用中断为了说明这个问题,再举一例子。假设你有一个朋友来拜访你,但是由于不知道何时到达,你只能在大门等待,于是什么事情也干不了。如果在门口装一个门铃,你就不必在门口等待而去干其它的工作,朋友来了按门铃通知你,你这时才中断你的工作去开门,这样就避免等待和浪费时间。计算机也是一样,例如打印输出,CPU传送数据的速度高,而打印机打印的速度低,如果不采用中断技术,CPU将经常处于等待状态,效率极低。而采用了中断方式,CPU可以进行其它的工作,只在打印机缓冲区中的当前内容打印完毕发出中断请求之后,才予以响应,暂时中断当前工作转去执行向缓冲区传送数据,传送完成后又返回执行原来的程序。这样就大大地提高了计算机系统的效率。中断的优先级我们仍然可以举例说明中断优先级的概念。在上面的例子中,如果在电话铃响的同时,门铃也响了,那么你将在"接电话"和"开门"这两个中断请求中选择,先响应哪一个请求。这就有一个谁优先的问题。如果"开门"比"接电话"重要(或者说"开门"比"接电话"的优先级高),那么就应该先开门,然后再接电话,接完电话后再回头来继续写信。这就是说,当同时有多个中断请求时,应该先响应优先级较高的中断请求。此外,如果在响应一个中断,执行中断处理的过程中,又有新的中断事件发生而发出了中断请求,应该如何处理也取决于中断事件的优先级。当新发生的中断事件的优先级高于正在处理的中断事件时,又将中止当前的中断处理程序,转去处理新发生的中断事件,处理完毕才返回原来的中断处理。在上面的例子中,我们假设"开门"比"接电话"的优先级高。在你写信时,电话铃响了,你去接电话,在通话的过程中,门铃又响了。因为"开门"的优先级高,你只能让通话的对方稍等,放下电话去开门。开门之后再回头继续接电话,通话完毕再回去继续写信。而如果"开门"比"接电话"的优先级低,那么在通话的过程中门铃响了也可以不予理睬,通话结束再去开门。当然,在日常生活中,谁也不会为"开门"和"接电话"规定一个优先级别的高低。但是在计算机中,各种中断事件很多,其优先级都有规定,否则就会乱套。在计算机中,中断事件的优先级是根据事件的实时性、重要性和软件处理的方便性来安排的。
好吧,读了以上资料后,感觉有点复杂,不过对中断有了一些简单认识。下面用掌控板举个例子,从简单开始,复杂的让高手来讲吧。这个例子是按键中断
来来来,看代码。
下面程序中,默认情况下,程序在循环内空等不执行任何指令。
当检测到a,b按键中断时,调用对应的函数。
按下按键 A 打开板载灯和蜂鸣器,按下按键 B 关闭板载灯和蜂鸣器。
from mpython import * #导入mpython模块
import music #导入music模块
def ledon(_): #先定义中断处理函数:开灯和蜂鸣器
rgb.fill((128,0,0)) #打开板载灯,全部设置为红色,半亮度
rgb.write() #将颜色输出到灯
music.pitch(1000) #打开蜂鸣器:1000赫兹
def ledoff(_): #先定义中断处理函数:关灯和蜂鸣器
rgb.fill((0,0,0)) #关闭全部板载灯
rgb.write() #将颜色输出到灯
music.pitch(0) #关闭蜂鸣器
button_a.irq(trigger=Pin.IRQ_FALLING, handler=ledon) #设置按键 A 中断,下降沿触发,开灯和蜂鸣器
button_b.irq(trigger=Pin.IRQ_FALLING, handler=ledoff) #设置按键 B 中断,下降沿触发,关灯和蜂鸣器
while True: #在没有中断时,程序执行在循环内
pass #空程序,什么也不执行
button_a.irq(trigger=Pin.IRQ_FALLING, handler=ledon) 是调用的中断处理程序对应的函数。
【小资料】
IRQ IRQ全称为Interrupt Request,即是"中断请求"的意思。
trigger 配置可以触发中断的事件,可能的值是:
Pin.IRQ_FALLING 下降沿中断;Pin.IRQ_RISING 上升沿中断;Pin.IRQ_LOW_LEVEL 低电平中断;Pin.IRQ_HIGH_LEVEL 高电平中断。
handler 是一个可选的函数,在中断触发时调用,返回一个回调对象。
【小提示】定义中断处理函数时,函数须包含任意一个参数,否则无法使用。ledon()、ledoff()函数中的参数为 _ 。
当按下按键时为低电平(0),否则高电平(1),在按键按下的过程中,从高电平(1)变为低电平(0)的那一瞬间叫作下降沿,从低电平(0)变为高电平(1)的那一瞬间叫作上升沿。https://mpython.readthedocs.io/zh/latest/_images/falling.png虽然笔记写完了,可还是有很多不懂。
慢慢消化吧。
{:5_153:}
页:
[1]