AVR中斷優(yōu)先級(jí)
AVR單片機(jī)在同一個(gè)優(yōu)先級(jí)中,中斷向量入口地址越低,其優(yōu)先級(jí)越高。AVR單片機(jī)在響應(yīng)中斷以后,會(huì)禁止系統(tǒng)響應(yīng)其余中斷。如果程序需要在某個(gè)中斷服務(wù)程序中響應(yīng)其它中斷事件,可以在該中斷服務(wù)程序中用SEI指令或_SEI()(IAR)、 SEI()(ICCAVR)重新使能全局中斷即可。否則,AVR單片機(jī)只有在退出中斷進(jìn)程時(shí),才重新使能全局中斷。
AVR(至少是ATmega16)單片機(jī)采用固定的硬件優(yōu)先級(jí)方式,不支持通過(guò)軟件對(duì)中斷優(yōu)先級(jí)重新設(shè)定。
AVR有不同的中斷源。每個(gè)中斷和復(fù)位在程序空間都有獨(dú)立的中斷向量。所有的中斷事件都有自己的使能位。當(dāng)使能位置位,且狀態(tài)寄存器的全局中斷使能位I 也置位時(shí),中斷可以發(fā)生。根據(jù)程序計(jì)數(shù)器PC 的不同,在引導(dǎo)鎖定位BLB02 或BLB12 被編程的情況下,中斷可能被自動(dòng)禁止。這個(gè)特性提高了軟件的安全性。詳見(jiàn) P247“ 存儲(chǔ)器編程” 的描述。
程序存儲(chǔ)區(qū)的最低地址缺省為復(fù)位向量和中斷向量。完整的向量列表請(qǐng)參見(jiàn) P43“中斷”。列表也決定了不同中斷的優(yōu)先級(jí)。向量所在的地址越低,優(yōu)先級(jí)越高。RESET 具有最高的優(yōu)先級(jí),第二個(gè)為INT0 – 外部中斷請(qǐng)求0。通過(guò)置位MCU 控制寄存器 (MCUCR) 的IVSEL,中斷向量可以移至引導(dǎo)Flash的起始處。編程熔絲位BOOTRST也可以將復(fù)位向量移至引導(dǎo)Flash的起始處。具體參見(jiàn)P234“支持引導(dǎo)裝入程序 – 在寫(xiě)的同時(shí)可以讀(RWW,Read-While-Write) 的自我編程能力”。
任一中斷發(fā)生時(shí)全局中斷使能位I 被清零,從而禁止了所有其他的中斷。用戶(hù)軟件可以在中斷程序里置位I 來(lái)實(shí)現(xiàn)中斷嵌套。此時(shí)所有的中斷都可以中斷當(dāng)前的中斷服務(wù)程序。執(zhí)行RETI 指令后I 自動(dòng)置位。
從根本上說(shuō)有兩種類(lèi)型的中斷。第一種由事件觸發(fā)并置位中斷標(biāo)志。對(duì)于這些中斷,程序計(jì)數(shù)器跳轉(zhuǎn)到實(shí)際的中斷向量以執(zhí)行中斷處理程序,同時(shí)硬件將清除相應(yīng)的中斷標(biāo)志。中斷標(biāo)志也可以通過(guò)對(duì)其寫(xiě)”1” 的方式來(lái)清除。當(dāng)中斷發(fā)生后,如果相應(yīng)的中斷使能位為“0”,則中斷標(biāo)志位置位,并一直保持到中斷執(zhí)行,或者被軟件清除。類(lèi)似的,如果全局中斷標(biāo)志被清零,則所有已發(fā)生的中斷都不會(huì)被執(zhí)行,直到I 置位。然后掛起的各個(gè)中斷按中斷優(yōu)先級(jí)依次執(zhí)行。
第二種類(lèi)型的中斷則是只要中斷條件滿(mǎn)足,就會(huì)一直觸發(fā)。這些中斷不需要中斷標(biāo)志。若中斷條件在中斷使能之前就消失了,中斷不會(huì)被觸發(fā)。
AVR 退出中斷后總是回到主程序并至少執(zhí)行一條指令才可以去執(zhí)行其他被掛起的中斷。要注意的是,進(jìn)入中斷服務(wù)程序時(shí)狀態(tài)寄存器不會(huì)自動(dòng)保存,中斷返回時(shí)也不會(huì)自動(dòng)恢復(fù)。這些工作必須由用戶(hù)通過(guò)軟件來(lái)完成。
使用CLI 指令來(lái)禁止中斷時(shí),中斷禁止立即生效。沒(méi)有中斷可以在執(zhí)行CLI 指令后發(fā)生,即使它是在執(zhí)行CLI 指令的同時(shí)發(fā)生的。
擴(kuò)展閱讀:單片機(jī)中斷、定時(shí)器的使用