新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Realview MDK中編譯器對中斷處理的過程詳解

        Realview MDK中編譯器對中斷處理的過程詳解

        作者: 時間:2016-11-10 來源:網絡 收藏
        在ARM程序的開發過程中,對中斷的處理是很普遍的、也是相當重要的。Realview MDK使用的RVCT編譯器提供了__irq關鍵字,用此關鍵字修飾的函數被作為中斷出來函數編譯,即在編譯的過程中,編譯器會自動添加中斷處理過程中現場保護和恢復的代碼,減小程序的開發難度,加快軟件的開發過程。

        在理解__irq關鍵字的作用之前,先看一下ARM核對異常的處理過程。當產生異常時, ARM核拷貝CPSR寄存器的內容SPSR_寄存器中,同時設置適當的CPSR 位、改變處理器狀態進入ARM 態和處理器模式,從而進入相應的異常模式。在設置中斷禁止位禁止相應中斷(如果需要)后,ARM核保存返回地址到LR_,同時設置PC為相應的異常向量。當異常返回時, 異常處理需要從SPSR_寄存器中恢復CPSR的值,同時從LR_恢復PC,具體的異常返回指令如下:

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

        ? 從SWI和Undef異常返回時使用:

        movs pc, LR;

        ? 從FIQ、IRQ和預取終止返回時使用:

        SUBS PC, LR,#4;

        ? 從數據異常返回時使用:

        SUBS PC, LR,#8

        在使用上述指令異常返回時,如果LR之前被壓棧的話使用LDM “∧”, 例如:

        LDMFD SP!, {PC}∧

        理解了ARM異常處理的過程以后,Realview MDK中__irq關鍵字的作用就容易理解了。下面的函數為一個中斷處理函數,其前面加了__irq關鍵字。

        __irq void pwm0_irq_handler(void)

        {

        //Deassert PWM0 interrupt signal

        unsigned int i=AT91F_PWMC_GetInterruptStatus(AT91C_BASE_PWMC);

        // Clear the LEDs. On the Board we must apply a "1" to turn off LEDs

        AT91F_PIO_SetOutput(AT91C_BASE_PIOA, led_mask[0]);

        AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID1);

        AT91F_AIC_ClearIt(AT91C_BASE_AIC,AT91C_ID_PWMC);

        AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);

        }

        當編譯器器編譯這個函數時,除了保存ATPCS規則規定的寄存器以外,還保存了CPSR及PC的值。在函數的返回時,還自動添加了SUBS PC, LR, #4和從SPSR寄存器恢復CPSR寄存器值的指令。用這種方式處理以后,中斷處理函數可以和普通函數一樣的使用。

        注意:中斷處理都是在ARM模式下進行的,當源程序欲編譯成Thumb指令時,這時,用__irq關鍵字修飾的函數仍然會被編譯成ARM指令。如果源程序編譯成在CORTEX M3上運行的指令時,關鍵字__irq對函數的編譯沒有任何影響,即編譯器不會自動保存CPSR及PC的值,也不會添加SUBS PC, LR, #4和從SPSR寄存器恢復CPSR寄存器值的指令,因為CORTEX M3處理器硬件會自動處理這些問題,無需軟件開發人員關心。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 巴马| 大英县| 乃东县| 社旗县| 兴国县| 台东市| 和田市| 洪湖市| 新兴县| 蓬莱市| 潜江市| 景谷| 彩票| 独山县| 丰台区| 多伦县| 浑源县| 惠水县| 株洲市| 玉山县| 武强县| 荃湾区| 恩施市| 辽源市| 台江县| 永康市| 辽阳市| 镇安县| 仙游县| 达尔| 民县| 尖扎县| 垣曲县| 枝江市| 正安县| 舟曲县| 邳州市| 东海县| 盐山县| 汾阳市| 华亭县|