但,如果在中断服务程序中开放全局中断,一旦有中断(包括中断级别较低的,或者是自己本身)申请,AVR将立即响应中断,打断当前正在执行的任何程序(包括正在执行中断服务程序),进入新的中断服务程序,从而实现中断嵌套。此时如有多个中断申请同时存在,MCU响应高优先权的中断。
和MCS51特别不同的是,AVR中断嵌套不仅可处理优先级更高的中断,也可以处理同优先级甚至优先级较低的中断。这能满足一些特殊的设计,但是也容易引起混乱。在软件设计过程中,这一点设计者需特别注意。
interrupt [iv_INT1] void USB_Link_Int(void)
本文引用地址:
https://www.eepw.com.cn/article/201611/320956.htm{
//显示提示信息,提示进入INT1中断处理程序
DispScreen(scr_info_of_int1,true,null);
//延迟3秒,使得屏幕提示可以看清
//注意:延迟过程中产生iv_TIMER0_COMP中断,该中断的优先级低于iv_INT1
Timer0_Start(0,3); //注:此函数中使用sei()开放中断
while (Timer0_IsRun());
Timer0_Stop();
//允许INT3(ENTER)键按下产生中断
EIMSK &= 0xf7; //禁止INT3产生中断
EICRA |= 0x80;
EICRA &= 0xbf; //INT3中断方式:下降沿产生异步中断
EIFR |= 0x08;//清INT3中断标志
EIMSK |= 0x08;//允许INT3产生中断
//禁止INT1,防止重入,专等INT3
EIMSK &= ~( 1 << INT1 );//禁止INT1产生中断
//等待INT3中断
//注意:iv_INT3中断的优先级低于iv_INT1
while(true);
}
//按ENTER键后产生INT3中断
interrupt [iv_INT3] void EnterKey_Int(void)
{
//显示提示信息,提示进入INT3中断处理程序
DispScreen(scr_info_of_int3,true,null);
//延迟3秒,使得屏幕提示可以看清
//注意:延迟过程中产生iv_TIMER0_COMP中断,该中断的优先级低于iv_INT3
Timer0_Start(0,3); //注:此函数中使用sei()开放中断
while (Timer0_IsRun());
Timer0_Stop();
//启动看门狗,等待复位
watch_dog_reset_cpu();
}
实验结果:iv_TIMER0_COMP中断、iv_INT3中断如期发生。
由此可见,AVR单片机中,进入中断处理程序适时开放全局中断,不仅可以使用中断嵌套,而且高级别中断中可响应任何级别(包括更低级别的)的中断。
评论