找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3514|回复: 0
收起左侧

AVR单片机中的中断嵌套

[复制链接]
ID:104287 发表于 2016-1-31 20:22 | 显示全部楼层 |阅读模式
AVR响应中断后,由硬件自动清零全局中断标志位,此时任何中断都无法响应。直到中断响应程序执行完毕后,全局中断自动打开。因此,若不作特别处理,AVR单片机是无法实现中断嵌套的。

但,如果在中断服务程序中开放全局中断,一旦有中断(包括中断级别较低的,或者是自己本身)申请,AVR将立即响应中断,打断当前正在执行的任何程序(包括正在执行中断服务程序),进入新的中断服务程序,从而实现中断嵌套。此时如有多个中断申请同时存在,MCU响应高优先权的中断。
可见,AVR单片机中,若软件合理设计,即可实现中断嵌套。
和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单片机中,进入中断处理程序适时开放全局中断,不仅可以使用中断嵌套,而且高级别中断中可响应任何级别(包括更低级别的)的中断。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表