但,如果在中止服务程序中敞开大局中止,一旦有中止(包含中止等级较低的,或者是自己自身)请求,AVR将当即呼应中止,打断当时正在履行的任何程序(包含正在履行中止服务程序),进入新的中止服务程序,然后完成中止嵌套。此刻如有多个中止请求一起存在,MCU呼应高优先权的中止。
和MCS51特别不同的是,AVR中止嵌套不只可处理优先级更高的中止,也能够处理同优先级乃至优先级较低的中止。这能满意一些特别的规划,可是也简单引起紊乱。在软件规划过程中,这一点规划者需特别留意。
interrupt [iv_INT1] void USB_Link_Int(void)
{
//显现提示信息,提示进入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单片机中,进入中止处理程序当令敞开大局中止,不只能够运用中止嵌套,并且高等级中止中可呼应任何等级(包含更低等级的)的中止。