成都b2c網(wǎng)站服裝營銷方式和手段
一、中斷執(zhí)行的流程
soc中斷的執(zhí)行流程
1、中斷源發(fā)生中斷請求
2、CPU檢查該中斷是否被屏蔽,以及總中斷是否被屏蔽
3、考察中斷優(yōu)先級
4、保護現(xiàn)場
5、執(zhí)行中斷服務(wù)函數(shù)
6、恢復(fù)現(xiàn)場
二、中斷初始化
1、設(shè)置中斷模式(INTMOD)寄存器(設(shè)置中斷處于那種狀態(tài))
此寄存器由32位組成,其每一位都都涉及一個中斷源。如果某個指定為被設(shè)置為1,則在FIQ(快中斷)模式 中處理相應(yīng)中斷。否則則在IRQ模式中處理。
2、設(shè)置中斷屏蔽(INTMSK)寄存器(打開中斷源)
此寄存器由32位組成,其每一位都都涉及一個中斷源。如果某個指定為被設(shè)置為1,則CPU不會去服務(wù)來自 相應(yīng)中斷源(請注意即使在這種情況中,SRCPND寄存器的相應(yīng)位也設(shè)置為1)的中斷請求。如果屏蔽位為0,則 可以服務(wù)中斷請求。
3、設(shè)置對應(yīng)的中斷源的觸發(fā)方式以及工作方式
GPG等寄存器,使其工作在中斷模式下
EXTINTn(外部中斷控制寄存器n)設(shè)置中斷觸發(fā)方式
8個外部中斷可以由多種信號觸發(fā)方式所請求。EXTINT寄存器為外部中斷配制信號觸發(fā)方式為電平觸發(fā)或邊 沿觸發(fā),同時還配制信號觸發(fā)極性。
4、將內(nèi)部的具體的中斷屏蔽位進行置位EINTMASK(外部中斷屏蔽寄存器)
0 = 使能中斷 1 = 禁止中斷
三、中斷執(zhí)行
1、執(zhí)行中斷服務(wù)程序完之后恢復(fù)
EINTPEND(外部中斷掛起寄存器),記錄了有沒有該中斷源發(fā)生中斷,所以一旦中斷進行響應(yīng),我們需要立刻將其置1清零此位(具體哪一位中斷進行響應(yīng))
中斷掛起(INTPND)寄存器 中斷掛起寄存器中32位的每一位都表明了是否相應(yīng)未屏蔽并且正在等待中斷服務(wù)的中斷請求具有最高的優(yōu)先 級。當(dāng)INTPND寄存器在優(yōu)先級邏輯后被定位了,只有1位可以設(shè)置為1并且產(chǎn)生中斷請求IRQ給CPU。IRQ的 中斷服務(wù)程序中可以讀取此寄存器來決定服務(wù)32個中斷源的哪個源。
SRCPND寄存器由32位組成,其每一位都涉及一個中斷源。如果中斷源產(chǎn)生了中斷則相應(yīng)的位被設(shè)置為1并 且等待中斷服務(wù)。因此此寄存器指示出是哪個中斷源正在等待請求服務(wù)。注意SRCPND寄存器的每一位都是由中 斷源自動置位,其不顧INTMASK寄存器中的屏蔽位。另外SRCPND寄存器不受中斷控制器的優(yōu)先級邏輯的影響。 在指定中斷源的中斷服務(wù)程序中,必須通過清除SRCPND寄存器的相應(yīng)位來正確的獲得來自相同源的中斷請 求。如果從ISR中返回并且未清除相應(yīng)位,則中斷控制器的操作就好像其它中斷請求已經(jīng)從同一個源進入了。換句 話說,如果SRCPND寄存器的指定位被設(shè)置為1,其通常被認(rèn)作一個有效中斷請求正在等待服務(wù)。 清除相應(yīng)位的時間依賴于用戶的需要。如果希望收到來自相同冤源的其它有效請求,則應(yīng)該首先清除相應(yīng)位, 并且接著使能中斷。 可以通過寫入一個數(shù)據(jù)到此寄存器來清除SRCPND寄存器的指定位。其只清除那些數(shù)據(jù)中被設(shè)置為1的相應(yīng) 位置的SRCPND位。那些數(shù)據(jù)中被設(shè)置為0的相應(yīng)位置的位保持不變。
注意
要先進行清SRCPND,否則會一直進行中斷響應(yīng)
中斷偏移(INTOFFSET)寄存器 中斷偏移寄存器中的值表明了是哪個IRQ模式的中斷請求在INTPND寄存器中。此位可以通過清楚SRCPND 和INTPND自動清除。(通過查改位置可以判斷是那個中斷進行響應(yīng))
四、例子
//初始化
void init_key(void)
{unsigned int t;INTMOD &= ~(1 << 5); INTMSK &= ~(1 << 5);t = GPGCON;t &= ~((3 << 0)|(3 << 3) | (3 << 5));t |= (2 << 0) | (2 << 6) | (2 << 10);GPGCON = t;t = EXTINT1;t &= ~((0x0F << 0)| (0x0F << 8) | (0x0F << 16));t |= (1 << 3) | (1 << 11) | (1 << 13);t |= (2 << 0) | (2 << 12) | (2 << 20);EXTINT1 = t;EINTMASK &= ~((1 << 8)| (1 << 11) | (1 << 13));}
//函數(shù)的執(zhí)行
void irq_handler(void)
{if(INTOFFSET == 5){if((EINTPEND & (1 << 8)) != 0){led_on(4);}else if((EINTPEND & (1 << 11)) != 0){beep_on();}else if((EINTPEND & (1 << 13)) != 0){beep_off();}EINTPEND = EINTPEND;}SRCPND = SRCPND ;INTPND = INTPND;
}