在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > IAR下的匯編/單片機啟動代碼匯編

            IAR下的匯編/單片機啟動代碼匯編

            作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
            可能大家看到了在IRQ中斷向量地址中裝載的是LDR PC, [PC, #-0x0FF0]指令,這里要和大家解釋一下這條語句,在和大家解釋這條語句時,希望大家去看看LPC2103的datasheet。
            當處理器開始執(zhí)行LDR PC, [PC, #-0x0FF0]
            指令,PC寄存器的值就已經(jīng)變成PC+8 = 0x20(這個不清楚的朋友必須去查詢一下《ARM+Architecture+Reference+Manual(2nd+Edition)》中的Prefetch and self-modifying code),
            Result = 0x20 – 0xff0 = 0xFFFFF030(實在不知道怎么算的就用電腦自帶的計算器算算);
            在查詢LPC2103數(shù)據(jù)手冊后,發(fā)現(xiàn)該地址對應的寄存器為VICVectAddr。
            在這條語句執(zhí)行完畢后,處理器就會跳轉(zhuǎn)到導致產(chǎn)生IRQ中斷,并跳轉(zhuǎn)到VICVectAddr寄存器所指向的IRQ異常處理函數(shù)中進行操作。
            實際運用中,我們可以更改一下IRQ異常向量地址的語句,讓大家更加好看。更改如下:
            LDR PC, [PC, #0xFFFFF020]
            這條語句和剛才的MDK自帶的語句實現(xiàn)的效果是一樣的!
            實例
            軟件實現(xiàn)中斷處理過程
            實驗芯片:LPC2103
            開發(fā)環(huán)境:MDK3.50
            實現(xiàn)功能:在不使用__irq關(guān)鍵詞時,如果編寫中斷服務(wù)程序。
            知識要點:
            1、在MDK開發(fā)環(huán)境下,對于LPC2000系列處理器,MDK默認的啟動模式位系統(tǒng)模式。
            2、在不使用__irq關(guān)鍵字聲明時,只將中斷處理函數(shù)當成普通函數(shù)進行處理,而不會在進入中斷時對通用寄存器的內(nèi)容進行保存,也不會再退出中斷時對通用寄存器的內(nèi)容進行恢復,因此這部分功能是必須手動添加的。
            下面進行代碼講述,下面就是當進入IRQ中斷處理函數(shù)時的處理程序,代碼全部用匯編語句完成詳細代碼如下:
            EXPORT IRQ_Uart0
            IMPORT DuleUart0
            REQUIRE8
            PRESERVE8
            AREA CODE, CODE, READONLY
            CODE32
            IRQ_Uart0
            STMFD SP!,{R0-R12,LR}
            ;保存當前處理器的所有寄存器
            MRS R0,SPSR
            ;保存當前處理器的SPSR
            STMFD SP!,{R0}
            MRS R0,CPSR ;保存當前處理器的CPSR
            STMFD SP!,{R0}
            MOV R12, SP ;保存當前的SP寄存器
            MRS R0,CPSR ;重新打開FIQ或IRQ中斷
            BIC R0,R0,#0xC0
            MSR CPSR_cxsf,R0
            BL DuleUart0 ;執(zhí)行串口0的實際處理程序
            MOV SP,R12 ;恢復SP寄存器的值
            LDMFD SP!,{R0} ;恢復中斷時的CPSR寄存器值
            MSR CPSR_cxsf,R0
            LDMFD SP!,{R0};恢復中斷前的SPSR寄存器狀態(tài)
            MSR SPSR_cxsf,R0
            LDMFD SP!,{R0-R12};恢復中斷時的所有寄存器值
            LDMFD SP!,{LR};恢復進入中斷時的PC返回地址
            SUBS PC,LR,#4;返回中斷服務(wù)程序
            END
            大家可能存在的問題如下:
            1、為什么我們在進入這段中斷處理程序中還在使用LDM和STM語句呢,不是說在用戶或系統(tǒng)模式中使用該語句會產(chǎn)生不可預料的結(jié)果么?
            答:當系統(tǒng)進入IRQ異常時,就會將處理器模式切換到IRQ異常模式。
            2、為什么會在最后一句執(zhí)行SUBS PC,LR,#4(這一句就不在解釋了),不清楚的就去看看《ARM體系結(jié)構(gòu)與編程》
            好了,我們現(xiàn)在對照著在uC/OS-II中的中斷編寫方法:
            Void ISP_Function( void )
            {
            保存全部的CPU寄存器;
            調(diào)用OSIntEnter()或OSIntNesting++;
            If(OSIntNesting == 1 )
            {
            OSTCBCur->OSTCBStkPtr= SP ;
            }
            清中斷源;
            重新打開中斷;
            執(zhí)行用戶代碼做中斷服務(wù);
            調(diào)用OSIntExit();
            恢復所有CPU寄存器;
            執(zhí)行中斷返回指令;
            }
            而在我們的處理代碼中,我們的執(zhí)行過程如下偽代碼所示:
            Void ISRFunction( void )
            {
            保存全部寄存器的內(nèi)容;
            清中斷源;
            執(zhí)行用戶代碼;
            恢復所有CPU寄存器;
            執(zhí)行中斷返回;
            }
            對于沒有的部分,大家可以試著去編寫一下!
            詳細代碼可以下載,也可以移植到你現(xiàn)有的開發(fā)板上去試試。
            --------------------------------------------------------------------------------
            基于ARM的芯片多數(shù)為復雜的片上系統(tǒng),這種復雜系統(tǒng)里的多數(shù)硬件模塊都是可配置的,需要由軟件來設(shè)置
            其需要的工作狀態(tài)。因此在用戶的應用程序之前,需要由專門的一段代碼來完成對系統(tǒng)的初始化。由于這
            類代碼直接面對處理器內(nèi)核和硬件控制器進行編程,一般都是用匯編語言。一般通用的內(nèi)容包括:
            中斷向量表
            初始化存儲器系統(tǒng)
            初始化堆棧
            初始化有特殊要求的斷口,設(shè)備
            初始化用戶程序執(zhí)行環(huán)境
            改變處理器模式
            呼叫主應用程序
            中斷向量表
            ARM要求中斷向量表必須放置在從0地址開始,連續(xù)8X4字節(jié)的空間內(nèi)。
            每當一個中斷發(fā)生以后,ARM處理器便強制把PC指針置為向量表中對應中斷類型的地址值。因為每
            個中斷只占據(jù)向量表中1個字的存儲空間,只能放置一條ARM指令,使程序跳轉(zhuǎn)到存儲器的其他地方,再執(zhí)行
            中斷處理。
            中斷向量表的程序?qū)崿F(xiàn)通常如下表示:
            AREA Boot ,CODE, READONLY
            ENTRY
            B  ResetHandler
            B  UndefHandler
            B  SWIHandler
            B  PreAbortHandler
            B  DataAbortHandler
            B
            B  IRQHandler
            B  FIQHandler
            其中關(guān)鍵字ENTRY是指定編譯器保留這段代碼,因為編譯器可能會認為這是一段亢余代碼而加以優(yōu)化。鏈
            接的時候要確保這段代碼被鏈接在0地址處,并且作為整個程序的入口。
            初始化存儲器系統(tǒng)
            存儲器類型和時序配置
            通常Flash和SRAM同屬于靜態(tài)存儲器類型,可以合用同一個存儲器端口;而DRAM因為有動態(tài)刷新和地
            址線復用等特性,通常配有專用的存儲器端口。
            存儲器端口的接口時序優(yōu)化是非常重要的,這會影響到整個系統(tǒng)的性能。因為一般系統(tǒng)運行的速度
            瓶頸都存在于存儲器訪問,所以存儲器訪問時序應盡可能的快;而同時又要考慮到由此帶來的穩(wěn)定性問題
            。
            存儲器地址分布
            一種典型的情況是啟動ROM的地址重映射。

            關(guān)鍵詞: IAR匯編單片機啟動代

            評論


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

            關(guān)閉