中断(Interrupt)
中断(Interrupt)是计算机的一个重要概念,现代计算机普遍采用中断技术.
什么是中断呢?
CPU执行时原本是按照程序指令一条一条向下执行的.但如果此时发生了某一件事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务),待CPU将事件B处理完毕后,再回到原来被中断的地方继续执行程序(中断返回),这一过程成为中断.
打个比方:加入你正在读书,这时电话响了你放下手中的书,去接电话.接娃完电话后,在继续回来读书,并从原来读的地方继续往下读.
当中断发生时,程序执行流程图示如下:
换句话讲呢:
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。相当于你在读书时听到了敲门声,即中断源向你发出了中断请求,你需要放下书本,先去开门,发现原来是外卖到了。你处理完之后,又回去继续读书,并从你刚才读到的地方继续往下读。如果你是一个机器人的话,你从听到敲门声到回来继续读书的过程,构成了整个的中断过程。写入你大脑中的程序即为软件处理程序,门就是中断装置。
备注:Arduino UNO 开发板的 2、3,可以输入外部中断信号。中断有四种触发模式:低电平触发、电平改变触发、上升沿触发、下降沿触发。
Arduino的定时器中断
使用定时器中断前,必须先安装MsTimer2库,并在程序中引用头文件 MsTimer2.h中。使用例程如下:
#include <MsTimer2.h> //定时器库的头文件
int tick = 0; //计数值
//中断服务程序
void onTimer()
{
Serial.print("timer ");
Serial.println(tick++);
}
void setup()
{
Serial.begin(9600); //初始化串口
MsTimer2::set(1000, onTimer); //设置中断,每1000ms进入一次中断服务程序 onTimer()
MsTimer2::start(); //开始计时_开启定时器中断
//MsTimer2::stop(); //关闭定时器中断
}
void loop()
{
}
程序运行效果:
每隔1000毫秒,产生一次时钟中断,并进入中断服务程序 onTimer(), 向串口打印一串文字。
在Arduino IDE中打开串口监视窗口,可见打印的文字
timer 0
timer 1
timer 2
...
Arduino的外部中断
在函数 Loop() 中,里面的 if() 条件需要我们不断检测循环里面的代码,如果存在很多的语句需要判断的话,处理器就有可能在处理别的事务,来不及处理你要的判断。对于这些情况,你就可以使用中断接收这些事件,当发生这种情况时,已设置的一个函数会运行程序,即使微控制器可能正在处理其他事务也会执行这个程序。这个过程叫做硬件中断。
Arduino开发板中,只有两个引脚为硬件中断。
Leonardo有4个中断引脚。
Mega2560有更多。
Due板,所有的引脚都可以作为硬件中断。
代码示例:
int ledPIN = 13;
void setup()
{
pinMode(ledPIN, OUTPUT);
attachInterrupt(0, stuffHappened, FALLING);
}
void loop()
{
}
void stuffHappened()
{
digitalWrite(ledPIN, HIGH);
}
上述代码(attachInterrupt()函数):
第一个参数0,是中断号(在Arduino UNO中,中断0是指D2引脚,中断1是指D3引脚。其他板子并不同)
第二个参数stuffHappened,是指Loop()后面的自写函数stuffHappened(),这个函数叫做中断服务程序,简称ISR。该函数没有任何参数也不返回任何值。
最后一个参数FALLING,常数,这里的意思是,只有当D2从高电平变为低电平(换句话说,它为“下降沿”)时,ISR才会被调用,这是在按下按钮时所要发生的事:D2从高电平变为低电平。
上述可见Loop()函数中没有代码。这个ISR本身只是将“L”灯点亮。
在测试时,当Arduino复位时,“L”LED应该熄灭。然后当你按下按钮时,“L”LED应立即点亮并保持。
现在将attachInterrupt的最后一个参数改为RISING,并下载修改后的程序。LED应该保持熄灯状态直到Arduino完全重新启动,这是因为中断引脚上一直都是高电平,没有出现低电平,然后“上升”到高电平的时候。
当按住按钮时,LED应保持熄灭状态直到你松开它放开它时触发中断,因为按下按钮时D2是低电平,而松开时才上升到高电平。
外部中断配置函数attachInterrupt( )
函数原型:attachInterrupt(interrupt, ISR, mode)
mode中断触发方式
- LOW: 低电平触发。
- CHANGE:管脚状态改变触发。
- RISING:上升沿触发。
- FALLING:下降沿触发。
官方参考文档: https://arduino-wiki.clz.me/?file=003-高级输入输出/003-外部中断
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)