ARM中斷處理的研究
有操作系統(tǒng)的嵌入式系統(tǒng)中,中斷的發(fā)生要求保存全部寄存器的內(nèi)容到任務(wù)的棧中,它不是基于安全的考慮是因?yàn)榭赡?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/中斷">中斷會(huì)導(dǎo)致任務(wù)的切換。任務(wù)切換發(fā)生時(shí)所有任務(wù)的寄存器的值都要保存到該任務(wù)的棧中。下個(gè)任務(wù)的上下文將從該任務(wù)棧中得以恢復(fù)到處理器的寄存器中。下面就本問(wèn)題作出分析并給出實(shí)現(xiàn)的程序代碼。從圖1中斷處理寄存器的保存可知,中斷發(fā)生后任務(wù)的CPSR和PC兩寄存器的值在IRQ模式的SPSR和LR中,所以不能簡(jiǎn)單地切換到任務(wù)運(yùn)行的模式中,否則被中斷任務(wù)返回時(shí)的CPSR和PC將不可見(jiàn)(因?yàn)樗鼈儽4嬖贗RQ模式的專(zhuān)用寄存器中,在其他模式中無(wú)法操作)。此時(shí),可以考慮設(shè)置一些變量區(qū)作為媒介,將其予以轉(zhuǎn)存到任務(wù)運(yùn)行模式的棧中去。
下面假設(shè)任務(wù)切換是在SVC模式中運(yùn)行的。結(jié)合上面的分析,可以有圖3所示的保存任務(wù)切換的示意圖(虛線是壓棧保存,實(shí)線是彈?;謴?fù);LR_Frame和SPSR_Frame是變量區(qū))。
結(jié)合圖3任務(wù)切換中斷處理中的步驟,可以用匯編語(yǔ)言寫(xiě)出相對(duì)應(yīng)的中斷處理程序:
4 可重入性中斷
如果希望在處理中斷時(shí)仍能響應(yīng)其他中斷請(qǐng)求以此來(lái)縮短中斷延時(shí),就必須設(shè)計(jì)可重人性中斷。可重入性中斷是處理多個(gè)中斷的一種方法,但它也同時(shí)帶來(lái)新的問(wèn)題。在IRQ中斷模式中,如果直接重新允許了IRQ中斷,此時(shí)因?yàn)閳?zhí)行一條BL指令而將子程序返回的地址保存在LR_irq中,而在此間中斷發(fā)生了。新來(lái)的中斷會(huì)將其返回地址裝入LR_irq中,此時(shí)舊中斷子程序的返回地址必將被覆蓋從而導(dǎo)致系統(tǒng)紊亂。此種情形是無(wú)法通過(guò)將LR_irq壓棧來(lái)解決的,如程序語(yǔ)句:
但是仍不能排除在保存LR之前中斷發(fā)生的可能性。要解決上述LR_irq被破壞的問(wèn)題,就必須切換處理器的模式,常見(jiàn)的是切換到SVC處理模式。在SVC模式中,通過(guò)BL調(diào)用子程序時(shí)會(huì)將返回地址保存在LR_SVC之中。此時(shí)新中斷發(fā)生(因?yàn)樗鼤?huì)將返回地址保存到LR_irq而不是LR_SVC),不會(huì)破壞舊中斷中子程序返回地址了。有了基于上述的原理分析再來(lái)編寫(xiě)可重入性中斷的代碼就思路清晰了。但是為了保證處理的高效性,盡可能地及早允許中斷以縮短延時(shí),在保存完LR_irq和SPSR_irq后,就馬上切換到SVC模式中并重新允許中斷,如圖4所示(虛線是壓棧保存,實(shí)線是彈?;謴?fù))。
結(jié)合圖4中的處理步驟,可以比較清晰地寫(xiě)出可重入中斷處理的匯編語(yǔ)言程序:
評(píng)論