引言 在嵌入式系統中常用的RISC處理器是ARM核,它具有體積小、功耗低、成本低、性?xún)r(jià)比高的特點(diǎn)。然而,不管是哪種型號的ARM處理器,也無(wú)論該嵌入式系統中是否有操作系統,中斷處理,特別是IRQ中斷,始終是必須的,而中斷處理的核心問(wèn)題是上下文的保存。能否安全而又高效地保存上下文,將影響一個(gè)嵌入式系統的性能與穩定。筆者對ARM處理器的普通中斷處理、任務(wù)切換中斷處理、可重人中斷處理和基于優(yōu)先級的可重人性中斷處理的上下文保存技術(shù)進(jìn)行分析與總結。為保證理論的正確性,核心的程序代碼都經(jīng)過(guò)了實(shí)驗的檢測。 1 系統中斷處理簡(jiǎn)介 ARM處理器的中斷主要有兩種:IRQ普通中斷和FIQ快速中斷?焖僦袛啾举|(zhì)上與普通中斷沒(méi)有太大的差別,它們在處理機制上有許多相同的地方。IRQ中斷是最頻繁的也是最為影響系統性能的,所以對它的研究與處理也就最有價(jià)值。 下面簡(jiǎn)要地介紹一下IRQ異常發(fā)生時(shí)ARM處理器的工作過(guò)程。在IRQ中斷發(fā)生時(shí),ARM處理器的硬件會(huì )自動(dòng)執行以下工作: ①將被中斷任務(wù)模式的CPSR值保存到IRQ模式中的SPSR寄存器中; ②將被中斷任務(wù)模式的PC值保存到IRQ模式中的LR寄存器中; ③將模式自動(dòng)切換到IRQ模式,并將CPSR中的bit7位置1禁止后繼IRQ中斷的發(fā)生; ④PC被賦予0xl8的地址值,程序將從0xl8片開(kāi)始執行。結合圖1,可以更好地理解ARM中斷處理機制的工作過(guò)程。 ![]() 2 普通中斷處理 有些ARM嵌入式系統可能對中斷的要求比較低,即發(fā)生中斷后首先查詢(xún)相應的中斷源,然后進(jìn)行中斷服務(wù),最后從中斷服務(wù)程序中返回到被中斷處繼續運行程序。如何在這種簡(jiǎn)單應用中保證安全又高效地處理中斷呢?“安全”就意味著(zhù)中斷發(fā)生時(shí)上下文被完好保存不被破壞,“高效”就是說(shuō)保存盡可能少的寄存器(當然是建立在安全的基礎上的)。由圖1可知,在普通中斷處理中,中斷服務(wù)就可以在IRQ模式中運行。根據ATPCS的調用規則,在子程序調用中ARM編譯器保存了 R4~R11寄存器,因此就沒(méi)有必要再次保存。那么剩下的寄存器就必須予以保存,防止從中斷服務(wù)程序返回后被破壞?梢杂脜R編語(yǔ)言和C語(yǔ)言書(shū)寫(xiě)處理代碼。 首先假設初始化代碼中已正確建立了IRQ堆棧。 ![]() <所有已使能中斷的查詢(xún)與服務(wù)> ;將同時(shí)發(fā)生的中斷全部服務(wù),以提高效率 LDMFD SP!,{R0-R3,R12,R14} ;恢復上下文 在上述保存上下文中沒(méi)有必要保存SPSR。因在非嵌套的中斷處理程序中,它不會(huì )被任何順序的中斷所破壞。 ①保存.ATPCS規定的被破壞的寄存器; ②保存其他中斷處理程序中用到的寄存器; ③同時(shí)將(LR-4)賦予程序計數器PC,實(shí)現中斷程序的返回并且恢復CPSR寄存器的內容。 普通中斷處理的C語(yǔ)言程序可以按如下格式編寫(xiě): ![]() 可見(jiàn),無(wú)論是用C語(yǔ)言還是匯編語(yǔ)言來(lái)編寫(xiě),它們的工作原理都是一樣的。圖2給出了普通中斷處理過(guò)程中,ARM寄存器的保存示意圖(虛線(xiàn)是壓棧保存,實(shí)線(xiàn)是彈;謴)。圖中與程序處理的步驟相對應,可以幫助理解處理器上下文的保存過(guò)程。 ![]() 3 任務(wù)切換 有操作系統的嵌入式系統中,中斷的發(fā)生要求保存全部寄存器的內容到任務(wù)的棧中,它不是基于安全的考慮是因為可能中斷會(huì )導致任務(wù)的切換。任務(wù)切換發(fā)生時(shí)所有任務(wù)的寄存器的值都要保存到該任務(wù)的棧中。下個(gè)任務(wù)的上下文將從該任務(wù)棧中得以恢復到處理器的寄存器中。下面就本問(wèn)題作出分析并給出實(shí)現的程序代碼。從圖 1中斷處理寄存器的保存可知,中斷發(fā)生后任務(wù)的CPSR和PC兩寄存器的值在IRQ模式的SPSR和LR中,所以不能簡(jiǎn)單地切換到任務(wù)運行的模式中,否則被中斷任務(wù)返回時(shí)的CPSR和PC將不可見(jiàn)(因為它們保存在IRQ模式的專(zhuān)用寄存器中,在其他模式中無(wú)法操作)。此時(shí),可以考慮設置一些變量區作為媒介,將其予以轉存到任務(wù)運行模式的棧中去。 ![]() 下面假設任務(wù)切換是在SVC模式中運行的。結合上面的分析,可以有圖3所示的保存任務(wù)切換的示意圖(虛線(xiàn)是壓棧保存,實(shí)線(xiàn)是彈;謴;LR_Frame和 SPSR_Frame是變量區)。 結合圖3任務(wù)切換中斷處理中的步驟,可以用匯編語(yǔ)言寫(xiě)出相對應的中斷處理程序: ![]() ![]() 4 可重入性中斷 如果希望在處理中斷時(shí)仍能響應其他中斷請求以此來(lái)縮短中斷延時(shí),就必須設計可重人性中斷?芍厝胄灾袛嗍翘幚矶鄠(gè)中斷的一種方法,但它也同時(shí)帶來(lái)新的問(wèn)題。在IRQ中斷模式中,如果直接重新允許了IRQ中斷,此時(shí)因為執行一條BL指令而將子程序返回的地址保存在LR_irq中,而在此間中斷發(fā)生了。新來(lái)的中斷會(huì )將其返回地址裝入LR_irq中,此時(shí)舊中斷子程序的返回地址必將被覆蓋從而導致系統紊亂。此種情形是無(wú)法通過(guò)將LR_irq壓棧來(lái)解決的,如程序語(yǔ)句: ![]() 但是仍不能排除在保存LR之前中斷發(fā)生的可能性。要解決上述LR_irq被破壞的問(wèn)題,就必須切換處理器的模式,常見(jiàn)的是切換到SVC處理模式。在SVC 模式中,通過(guò)BL調用子程序時(shí)會(huì )將返回地址保存在LR_SVC之中。此時(shí)新中斷發(fā)生(因為它會(huì )將返回地址保存到LR_irq而不是LR_SVC),不會(huì )破壞舊中斷中子程序返回地址了。有了基于上述的原理分析再來(lái)編寫(xiě)可重入性中斷的代碼就思路清晰了。但是為了保證處理的高效性,盡可能地及早允許中斷以縮短延時(shí),在保存完LR_irq和SPSR_irq后,就馬上切換到SVC模式中并重新允許中斷,如圖4所示(虛線(xiàn)是壓棧保存,實(shí)線(xiàn)是彈;謴)。 ![]() 結合圖4中的處理步驟,可以比較清晰地寫(xiě)出可重入中斷處理的匯編語(yǔ)言程序: ![]() 5 基于優(yōu)先級的可重入中斷 在上面的可重人中斷中可能發(fā)生這種情形,某高優(yōu)先級中斷在中斷服務(wù)程序中因為重新允許了中斷請求而被另一低優(yōu)先級中斷所打斷,于是高優(yōu)先級中斷不得不等到低優(yōu)先級中斷完畢后方可繼續運行。這樣一來(lái),高優(yōu)先級中斷服務(wù)的延遲將更加增大。 為了減少上述高優(yōu)先級中斷的延遲,特別引入了基于優(yōu)先級的可重人性中斷。它的原則是:在中斷服務(wù)程序中只允許高于本中斷的其他中斷源予以請求中斷,因此一個(gè)高優(yōu)先級的中斷將比一個(gè)低優(yōu)先級的中斷優(yōu)先得到服務(wù),這是大多數嵌入式系統中所必需的。采取的方法是,當某優(yōu)先級中斷發(fā)生時(shí),在其中斷處理程序中可以使用屏蔽位將低于或等于該優(yōu)先級的中斷予以屏蔽。特別需要注意的是,在退出本中斷時(shí)要恢復原中斷寄存器的值。在此假設有這樣幾個(gè)中斷寄存器(其實(shí)ARM的很多處理器都有此類(lèi)的中斷控制寄存器):IRQMask,中斷源屏蔽寄存器;IRQStatus,中斷標志寄存器;IRQClear,清除中斷標志寄存器。同時(shí)假設中斷的優(yōu)先級是從高位(bit31)到低位(bitO)遞減的,那么首先可以預定義如下的屏蔽變量值: ![]() ![]() 本程序的上下文保存與可重人中斷處理基本相同。增加的部分在于中斷屏蔽碼的查詢(xún)與設置,相應的處理步驟可以參考圖4。 結語(yǔ) 本文重點(diǎn)研究了ARM處理器在多種中斷處理中上下文保存的安全與高效性,結合處理器結構圖和程序代碼分析了各種中斷的處理方案。對ARM處理器具有通用價(jià)值而不受不同廠(chǎng)商硬件的局限。 文中涉及的程序源代碼都在A(yíng)DSl.2開(kāi)發(fā)環(huán)境和SEP4020開(kāi)發(fā)評估板上測試過(guò)。實(shí)驗證明此中斷處理技術(shù)是安全高效的。 參考文獻 1. Andrew N Sloss.Dominic Symes.Chris Wright.沈建華 ARM 嵌入式系統開(kāi)發(fā)--軟件設計與優(yōu)化 2005 2. ARM公司 ARM Developer Guide 3. 文全剛 匯編語(yǔ)言程序設計--基于A(yíng)RM體系結構 2007 4. Labrosse Jean J.邵貝貝 嵌入式實(shí)時(shí)操作系統μC/OS-II 2003 作者:湖南師范大學(xué) 蔣俊 錢(qián)光明 來(lái)源:單片機與嵌入式系統應用 2009(5) |