新聞中心

        2440之中斷管理

        作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
        中斷處理:

        中斷是嵌入式里最重要的一個概念。一般一個系統(tǒng)對于一個設(shè)備要么采用中斷方式,要么采用輪詢方式 。中斷方式可以有效地減少處理器負(fù)荷 ,但是如果大量采用中斷則有可能降低處理速度 ,因為中斷處理破壞了處理器的流水機制。復(fù)習(xí)下微機原理中中斷處理過程和中斷機制。

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

        2440中支持FIQ(快速中斷)和IRQ(普通中斷)2種中斷方式,一般只采用IRQ中斷。2440有60個中斷源,不支持中斷嵌套。具體的參考用戶手冊第14章。下圖是2440中斷產(chǎn)生過程。

        具體的講解一下,關(guān)于寄存器請查閱用戶手冊。

        中斷源分為2種,子中斷中斷源和中斷源,當(dāng)一個子中斷產(chǎn)生一個中斷信號,子中斷源掛起寄存器(SUBRCPND)相應(yīng)位自動置1,察看子中斷屏蔽寄存器(SUBMASK)該子中斷是否被屏蔽(人工設(shè)置),如果沒屏蔽,則中斷源寄存器(SRCPND)置1,察看該中斷源是否被屏蔽和采用那種模式,如果沒被屏蔽,采用IRQ模式,進(jìn)行優(yōu)先級判斷后,高優(yōu)先級的執(zhí)行,中斷掛起寄存器置1,產(chǎn)生IRQ信號。同時CPSR寄存器的I位置1,表明當(dāng)前有一個IRQ中斷產(chǎn)生。記得以前讓大家注意該寄存器中的I和Q位了吧,他的作用就在這 。

        中斷處理過程:

        CPU每執(zhí)行一條指令都會檢查CPSR寄存器,當(dāng)發(fā)現(xiàn)I和F位被置1時,就進(jìn)行中斷處理。第一步跳入異常向量表:

        b ResetHandler

        b HandlerUndef ;handler for Undefined mode

        b HandlerSWI ;handler for SWI interrupt

        b HandlerPabort ;handler for PAbort

        b HandlerDabort ;handler for DAbort

        b . ;reserved

        b HandlerIRQ ;handler for IRQ interrupt

        b HandlerFIQ ;handler for FIQ interrupt

        HandlerFIQ HANDLER HandleFIQ

        HandlerIRQ HANDLER HandleIRQ

        HandlerUndef HANDLER HandleUndef

        HandlerSWI HANDLER HandleSWI

        HandlerDabort HANDLER HandleDabort

        HandlerPabort HANDLER HandlePabort

        ^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00

        HandleReset # 4

        HandleUndef # 4

        HandleSWI # 4

        HandlePabort # 4

        HandleDabort # 4

        HandleReserved # 4

        HandleIRQ # 4

        HandleFIQ # 4

        如果是IRQ 則跳到HandlerIRQ,此過程由硬件來完成。接下來

        ldr r0,=HandleIRQ ;This routine is needed

        ldr r1,=IsrIRQ ;if there is not subs pc,lr,#4 at 0x18, 0x1c

        str r1,[r0]

        進(jìn)行第2次跳轉(zhuǎn),跳轉(zhuǎn)到2級中斷向量表

        IsrIRQ

        sub sp,sp,#4 ;reserved for PC

        stmfd sp!,{r8-r9}

        ldr r9,=INTOFFSET

        ldr r9,[r9]

        ldr r8,=HandleEINT0

        add r8,r8,r9,lsl #2

        ldr r8,[r8]

        str r8,[sp,#8]

        ldmfd sp!,{r8-r9,pc}

        HandleEINT0 # 4

        HandleEINT1 # 4

        HandleEINT2 # 4

        HandleEINT3 # 4

        次代碼完成了建立2級中斷向量表,在我們中斷程序中我們先對中斷進(jìn)行注冊

        例 EINT0 = ISR_FUNC();這樣就完成了中斷向量和中斷服務(wù)程序的關(guān)聯(lián)。跳到2級中斷向量表后就進(jìn)入了中斷處理程序。中斷處理完成了CPU返回繼續(xù)執(zhí)行中斷處理前的下一條程序,關(guān)于處理現(xiàn)場的保護(hù)部分參考微原部分。

        下邊是一個關(guān)于中斷處理函數(shù)的測試題:明白中斷處理函數(shù)的使用

        中斷是嵌入式系統(tǒng)中重要的組成部分,這導(dǎo)致了很多編譯開發(fā)商提供一種擴展—讓標(biāo)準(zhǔn)C支持中斷。具代表事實是,產(chǎn)生了一個新的關(guān)鍵字

        __interrupt。下面的代碼就使用了__interrupt關(guān)鍵字去定義了一個中斷服務(wù)子程序(ISR),請評論一下這段代碼的。

        __interrupt double compute_area (double radius)

        {

        double area = PI * radius * radius;

        printf("nArea = %f", area);

        return area;

        }

        上邊就是2440的中斷產(chǎn)生及處理過程,這些是最基本的知識要牢牢掌握。對于ARM這些都是一樣的,只不過是寄存器有可能不一樣,但處理過程是一樣的,有些處理器支持中斷可重入,如710處理器。閱讀下用戶手冊14章中關(guān)于優(yōu)先級部分,注意下有些寄存器的清0方法。



        關(guān)鍵詞: 2440中斷管

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 天津市| 沽源县| 海丰县| 霞浦县| 内黄县| 永丰县| 涞源县| 平原县| 读书| 闽侯县| 于田县| 阿拉善左旗| 老河口市| 井冈山市| 江孜县| 西青区| 新建县| 万州区| 贵定县| 清远市| 天全县| 澄迈县| 资阳市| 昌邑市| 玉田县| 和政县| 柘荣县| 高雄县| 连平县| 汽车| 广汉市| 肇源县| 天长市| 嘉义市| 济源市| 大埔区| 江西省| 宜城市| 麻江县| 中超| 双江|