新聞中心

        ARM中斷處理的研究

        作者: 時間:2011-07-12 來源:網(wǎng)絡(luò) 收藏
        3 任務(wù)切換

        本文引用地址:http://www.104case.com/article/150484.htm

          有操作系統(tǒng)的嵌入式系統(tǒng)中,的發(fā)生要求保存全部寄存器的內(nèi)容到任務(wù)的棧中,它不是基于安全的考慮是因為可能會導(dǎo)致任務(wù)的切換。任務(wù)切換發(fā)生時所有任務(wù)的寄存器的值都要保存到該任務(wù)的棧中。下個任務(wù)的上下文將從該任務(wù)棧中得以恢復(fù)到器的寄存器中。下面就本問題作出分析并給出實現(xiàn)的程序代碼。從圖1寄存器的保存可知,中斷發(fā)生后任務(wù)的CPSR和PC兩寄存器的值在IRQ模式的SPSR和LR中,所以不能簡單地切換到任務(wù)運行的模式中,否則被中斷任務(wù)返回時的CPSR和PC將不可見(因為它們保存在IRQ模式的專用寄存器中,在其他模式中無法操作)。此時,可以考慮設(shè)置一些變量區(qū)作為媒介,將其予以轉(zhuǎn)存到任務(wù)運行模式的棧中去。

          下面假設(shè)任務(wù)切換是在SVC模式中運行的。結(jié)合上面的分析,可以有圖3所示的保存任務(wù)切換的示意圖(虛線是壓棧保存,實線是彈棧恢復(fù);LR_Frame和SPSR_Frame是變量區(qū))。

          

        保存任務(wù)切換的示意圖

          結(jié)合圖3任務(wù)切換中斷中的步驟,可以用匯編語言寫出相對應(yīng)的中斷處理程序:

          

        程序

          

        程序

          4 可重入性中斷

          如果希望在處理中斷時仍能響應(yīng)其他中斷請求以此來縮短中斷延時,就必須設(shè)計可重人性中斷。可重入性中斷是處理多個中斷的一種方法,但它也同時帶來新的問題。在IRQ中斷模式中,如果直接重新允許了IRQ中斷,此時因為執(zhí)行一條BL指令而將子程序返回的地址保存在LR_irq中,而在此間中斷發(fā)生了。新來的中斷會將其返回地址裝入LR_irq中,此時舊中斷子程序的返回地址必將被覆蓋從而導(dǎo)致系統(tǒng)紊亂。此種情形是無法通過將LR_irq壓棧來解決的,如程序語句:

          

        程序

          但是仍不能排除在保存LR之前中斷發(fā)生的可能性。要解決上述LR_irq被破壞的問題,就必須切換處理器的模式,常見的是切換到SVC處理模式。在SVC模式中,通過BL調(diào)用子程序時會將返回地址保存在LR_SVC之中。此時新中斷發(fā)生(因為它會將返回地址保存到LR_irq而不是LR_SVC),不會破壞舊中斷中子程序返回地址了。有了基于上述的原理分析再來編寫可重入性中斷的代碼就思路清晰了。但是為了保證處理的高效性,盡可能地及早允許中斷以縮短延時,在保存完LR_irq和SPSR_irq后,就馬上切換到SVC模式中并重新允許中斷,如圖4所示(虛線是壓棧保存,實線是彈棧恢復(fù))。

          

        可重入中斷處理上下文保存示意圖

          結(jié)合圖4中的處理步驟,可以比較清晰地寫出可重入中斷處理的匯編語言程序:

          

        程序

        上一頁 1 2 下一頁

        關(guān)鍵詞: 研究 處理 中斷 ARM

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 阿克苏市| 格尔木市| 岐山县| 祁东县| 武定县| 桦川县| 白山市| 淳安县| 阿鲁科尔沁旗| 昌邑市| 交城县| 洛川县| 同江市| 颍上县| 吴忠市| 兰西县| 梅州市| 大兴区| 万载县| 晋宁县| 焦作市| 昌宁县| 巩义市| 和静县| 顺义区| 蛟河市| 扎鲁特旗| 潢川县| 芦溪县| 信宜市| 甘孜县| 田阳县| 吉首市| 西林县| 新田县| 双鸭山市| 凤凰县| 龙江县| 晋州市| 开阳县| 吉安县|