訂閱
糾錯
加入自媒體

ARM模式、寄存器、流水線等基礎(chǔ)知識詳解

關(guān)于ARM的一些基本概念,大家可以參考我之前的文章:

《到底什么是Cortex、ARMv8、arm架構(gòu)、ARM指令集、soc?一文幫你梳理基礎(chǔ)概念【科普】》

關(guān)于ARM指令用到的IDE開發(fā)環(huán)境可以參考下面這篇文章

《1. 從0開始學(xué)ARM-安裝Keil MDK uVision集成開發(fā)環(huán)境》

《2. 從0開始學(xué)ARM-CPU原理,基于ARM的SOC講解》

有了計算機(jī)硬件架構(gòu)的原理,下面我就可以學(xué)習(xí)ARM模式、寄存器、流水線等基礎(chǔ)知識。

一、ARM技術(shù)特征

ARM的成功,一方面得益于它獨(dú)特的公司運(yùn)作模式,另一方面,當(dāng)然來自于ARM處理器自身的優(yōu)良性能。作為一種先進(jìn)的RISC處理器,ARM處理器有如下特點。

體積小、低功耗、低成本、高性能。支持Thumb(16位)/ARM(32位)雙指令集,能很好地兼容8位/16位器件。大量使用寄存器,指令執(zhí)行速度更快。大多數(shù)數(shù)據(jù)操作都在寄存器中完成。尋址方式靈活簡單,執(zhí)行效率高。指令長度固定。

二、ARM的基本數(shù)據(jù)類型

ARM采用的是32位架構(gòu),ARM的基本數(shù)據(jù)類型有以下3種。

Byte:字節(jié),8bit。Halfword:半字,16bit(半字必須與2字節(jié)邊界對齊)。Word:字,32bit(字必須與4字節(jié)邊界對齊)。存儲器可以看做是序號為0~2^32^-1的線性字節(jié)陣列。每一個字節(jié)都有唯一的地址。

注意:

ARM系統(tǒng)結(jié)構(gòu)v4以上版本支持以上3種數(shù)據(jù)類型,v4以前版本僅支持字節(jié)和字。

當(dāng)將這些數(shù)據(jù)類型中的任意一種聲明成unsigned類型時,n位數(shù)據(jù)值表示范圍為0~2^n^-1的非負(fù)數(shù),通常使用二進(jìn)制格式。

當(dāng)將這些數(shù)據(jù)類型的任意一種聲明成signed類型時,n位數(shù)據(jù)值表示范圍為-2^n-1^~2^n-1^-1的整數(shù),使用二進(jìn)制的補(bǔ)碼格式。

所有數(shù)據(jù)類型指令的操作數(shù)都是字類型的,如“ADD r1,r0,#0x1”中的操作數(shù)“0x1”就是以字類型數(shù)據(jù)處理的。

Load/Store 數(shù)據(jù)傳輸指令可以從存儲器存取傳輸數(shù)據(jù),這些數(shù)據(jù)可以是字節(jié)、半字、字。加載時自動進(jìn)行字節(jié)或半字的零擴(kuò)展或符號擴(kuò)展。對應(yīng)的指令分別為LDR/BSTRB(字節(jié)操作)、LDRH/STRH(半字操作)、LDR/STR(字操作)。

ARM指令編譯后是4個字節(jié)(與字邊界對齊);Thumb指令編譯后是2個字節(jié)(與半字邊界對齊)。

三、ARM處理器工作模式

Cortex系列之前的ARM處理器工作模式一共有7種。

1. 工作模式

Cortex系列的ARM處理器工作模式有8種,多了1個monitor模式,如下圖所示:

ARM處理器工作模式

ARM之所以設(shè)計出這么多種模式出來,就是為了「應(yīng)對CPU在運(yùn)行時各種突發(fā)事件」,比如要支持正常的應(yīng)用程序的運(yùn)行,在運(yùn)行任何一個時間點又可能發(fā)生很多異常事件,比如:關(guān)機(jī)、收到網(wǎng)卡信息、除數(shù)為0、訪問非法內(nèi)存、解析到了非法指令等等,不光要能處理這些異常還要能夠從異常中再返回到原來的程序繼續(xù)執(zhí)行。

用戶模式:用戶模式是用戶程序的工作模式,它運(yùn)行在操作系統(tǒng)的用戶態(tài),它沒有權(quán)限去操作其它硬件資源,只能執(zhí)行處理自己的數(shù)據(jù),也不能切換到其它模式下,要想訪問硬件資源或切換到其它模式只能通過軟中斷或產(chǎn)生異常。系統(tǒng)模式:系統(tǒng)模式是特權(quán)模式,不受用戶模式的限制。用戶模式和系統(tǒng)模式共用一套寄存器,操作系統(tǒng)在該模式下可以方便的訪問用戶模式的寄存器,而且操作系統(tǒng)的一些特權(quán)任務(wù)可以使用這個模式訪問一些受控的資源。一般中斷模式:一般中斷模式也叫普通中斷模式,用于處理一般的中斷請求,通常在硬件產(chǎn)生中斷信號之后自動進(jìn)入該模式,該模式為特權(quán)模式,可以自由訪問系統(tǒng)硬件資源。快速中斷模式:快速中斷模式是相對一般中斷模式而言的,它是用來處理對時間要求比較緊急的中斷請求,主要用于高速數(shù)據(jù)傳輸及通道處理中。管理模式:管理模式是「CPU上電后默認(rèn)模式」,因此在該模式下主要用來做系統(tǒng)的初始化,軟中斷處理也在該模式下,當(dāng)用戶模式下的用戶程序請求使用硬件資源時通過軟件中斷進(jìn)入該模式。終止模式:中止模式用于支持虛擬內(nèi)存或存儲器保護(hù),當(dāng)用戶程序訪問非法地址,沒有權(quán)限讀取的內(nèi)存地址時,會進(jìn)入該模式,linux下編程時經(jīng)常出現(xiàn)的segment fault通常都是在該模式下拋出返回的。未定義模式:未定義模式用于支持硬件協(xié)處理器的軟件仿真,CPU在指令的譯碼階段不能識別該指令操作時,會進(jìn)入未定義模式。Monitor:是為了安全而擴(kuò)展出的用于執(zhí)行安全監(jiān)控代碼的模式;也是一種特權(quán)模式

除用戶模式以外,其余的所有6種模式稱之為非用戶模式,或特權(quán)模式(Privileged Modes);其中除去用戶模式和系統(tǒng)模式以外的5種又稱為異常模式(ExceptionModes),常用于處理中斷或異常,以及需要訪問受保護(hù)的系統(tǒng)資源等情況。

2. 模式切換

ARM微處理器的運(yùn)行模式可以通過軟件改變,也可以通過外部中斷或異常處理改變。應(yīng)用程序運(yùn)行在用戶模式下,當(dāng)處理器運(yùn)行在用戶模式下時,某些被保護(hù)的系統(tǒng)資源是不能被訪問的。

3. 異常(Exception)

指由處理器執(zhí)行指令導(dǎo)致原來運(yùn)行程序的中止,異常與指令運(yùn)行相關(guān),是CPU執(zhí)行程序產(chǎn)生的,是同步的,可分為精確異常和非精確異常。異常處理遵守嚴(yán)格的程序順序,不能嵌套,只有當(dāng)?shù)谝粋異常處理完并返回后才能處理后續(xù)的異常。

4. 異常源

要進(jìn)入異常模式,一定要有異常源,ARM規(guī)定有7種異常源:

異常源描述Reset上電時執(zhí)行Undef當(dāng)流水線中的某個非法指令到達(dá)執(zhí)行狀態(tài)時執(zhí)行SWI當(dāng)一個軟中斷指令被執(zhí)行完的時候執(zhí)行Prefetch當(dāng)一個指令被從內(nèi)存中預(yù)取時,由于某種原因而失敗,如果它能到達(dá)執(zhí)行狀態(tài)這個異常才會產(chǎn)生Data如果一個預(yù)取指令試圖存取一個非法的內(nèi)存單元,這時異常產(chǎn)生IRQ通常的中斷FIQ快速中斷5. 異常源與模式關(guān)系重啟異常進(jìn)入管理模式;快速中斷請求異常進(jìn)入快中斷模式,支持高速數(shù)傳輸及通道處理(FIQ異常響應(yīng)時進(jìn)入此模式);中斷請求異常進(jìn)入中斷模式,用于通用中斷處理,(IRQ異常響應(yīng)時進(jìn)入此模式);預(yù)取指中止,數(shù)據(jù)中止異常進(jìn)入中止模式,用于支持虛擬內(nèi)存和/或存儲器保護(hù);未定義指令異常進(jìn)入未定義模式,支持硬件協(xié)處理器的軟件仿真(未定義指令異常響應(yīng)時進(jìn)入此模式) ;軟件中斷,復(fù)位異常進(jìn)入管理模式,操作系統(tǒng)保護(hù)代碼(系統(tǒng)復(fù)位和軟件中斷響應(yīng)時進(jìn)入此模式) ;

異常發(fā)生之后,CPU必須要立刻做出響應(yīng),關(guān)于異常后面會詳細(xì)講解。

四、ARM寄存器

Cortex A系列ARM處理器共有40個32位寄存器,其中33個為通用寄存器,7個為狀態(tài)寄存器。usr模式和sys模式共用同一組寄存器。

通用寄存器包括R0~R15,可以分為3類:

未分組寄存器R0~R7分組寄存器R8~R14、R13(SP) 、R14(LR)程序計數(shù)器PC(R15)、R8_fiq-R12_fir為快中斷獨(dú)有1. 未分組寄存器R0~R7

在所有運(yùn)行模式下,未分組寄存器都指向同一個物理寄存器,它們未被系統(tǒng)用作特殊的用途.因此在中斷或異常處理進(jìn)行運(yùn)行模式轉(zhuǎn)換時,由于不同的處理器運(yùn)行模式均使用相同的物理寄存器,所以可能造成寄存器中數(shù)據(jù)的破壞。

2. 分組寄存器R8~R14

對于分組寄存器,它們每一次所訪問的物理寄存器都與當(dāng)前處理器的運(yùn)行模式有關(guān)。

對于R8~R12來說,每個寄存器對應(yīng)2個不同的物理寄存器,當(dāng)使用FIQ(快速中斷模式)時,訪問寄存器 R8_fiq~R12_fiq;當(dāng)使用除FIQ模式以外的其他模式時,訪問寄存器R8_usr~R12_usr。

對于R13,R14來說,每個寄存器對應(yīng)7個不同的物理寄存器,其中一個是用戶模式與系統(tǒng)模式共用,另外6個物理寄存器對應(yīng)其他6種不同的運(yùn)行模式,并采用以下記號來區(qū)分不同的物理寄存器:

R13_mode    R14_mode

其中mode可為:「usr,fiq,irq,svc,abt,und,mon」。

3. 寄存器R13(sp)

在ARM指令中常用作「堆棧指針」,用戶也可使用其他的寄存器作為堆棧指針,而在Thumb指令集中,某些指令強(qiáng)制性的要求使用R13作為堆棧指針。

寄存器R13在ARM指令中常用作堆棧指針,但這只是一種習(xí)慣用法,用戶也可使用其他的寄存器作為堆棧指針。而在Thumb指令集中,某些指令強(qiáng)制性的要求使用R13作為堆棧指針。

由于處理器的每種運(yùn)行模式均有自己獨(dú)立的物理寄存器R13,在用戶應(yīng)用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運(yùn)行模式的棧空間。這樣,當(dāng)程序的運(yùn)行進(jìn)入異常模式時,可以將需要保護(hù)的寄存器放入R13所指向的堆棧,而當(dāng)程序從異常模式返回時,則從對應(yīng)的堆棧中恢復(fù),采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行。

4.  R14(LR)鏈接寄存器(Link Register)

當(dāng)執(zhí)行子程序調(diào)用指令(BL)時,R14可得到R15(程序計數(shù)器PC)的備份。

在每一種運(yùn)行模式下,都可用R14保存子程序的返回地址,當(dāng)用BL或BLX指令調(diào)用子程序時,將PC的當(dāng)前值復(fù)制給R14,執(zhí)行完子程序后,又將R14的值復(fù)制回PC,即可完成子程序的調(diào)用返回。以上的描述可用指令完成。

從子程序返回:

「方法1:」

 MOV PC, LR

或者

 BX LR

「方法2:」在子程序入口處使用以下指令將R14存入堆棧:

 STMFD SP!,{,LR}

對應(yīng)的,使用以下指令可以完成子程序返回:

 LDMFD SP!,{,PC}

5. R15(PC)程序狀態(tài)寄存器

寄存器R15用作程序計數(shù)器(PC),在ARM狀態(tài)下,位[1:0]為0,位[31:2]用于保存PC,在Thumb狀態(tài)下,位[0]為0,位[31:1]用于保存PC。

比如如果pc的值是0x40008001,那么在尋址的時候其實會查找地址0x40008000,低2位會自動忽略掉!競中原因,請讀者自己思考?」

由于ARM體系結(jié)構(gòu)采用了多級流水線技術(shù),對于ARM指令集而言,PC總是指向當(dāng)前指令的下兩條指令的地址,即PC的值為當(dāng)前指令的地址值加8個字節(jié)。

即:PC值=當(dāng)前程序執(zhí)行位置+8

【流水線技術(shù)參考第七章】

6. CPSR、SPSR

「CPSR」(Current Program Status Register,當(dāng)前程序狀態(tài)寄存器),CPSR可在任何運(yùn)行模式下被訪問,它包括條件標(biāo)志位、中斷禁止位、當(dāng)前處理器模式標(biāo)志位,以及其他一些相關(guān)的控制和狀態(tài)位。

每一種運(yùn)行模式下又都有一個專用的物理狀態(tài)寄存器,稱為「SPSR」(Saved Program Status Register,備份的程序狀態(tài)寄存器),當(dāng)異常發(fā)生時,SPSR用于保存CPSR的當(dāng)前值,從異常退出時則可由SPSR來恢復(fù)CPSR。

由于用戶模式和系統(tǒng)模式不屬于異常模式,它們沒有SPSR,當(dāng)在這兩種模式下訪問SPSR,結(jié)果是未知的。

寄存器CPSR格式如下:

條件碼標(biāo)志(condition code flags)「N,Z,C,V」均為條件碼標(biāo)志位,它們的內(nèi)容可被算術(shù)或邏輯運(yùn)算的結(jié)果所改變,并且可以決定某條指令是否被執(zhí)行。在ARM狀態(tài)下,絕大多數(shù)的指令都是有條件執(zhí)行的,在Thumb狀態(tài)下,僅有分支指令是有條件執(zhí)行的。

「N  (Number)」:當(dāng)用兩個補(bǔ)碼表示的帶符號數(shù)進(jìn)行運(yùn)算時,N=1表示運(yùn)行結(jié)果為負(fù),N=0表示運(yùn)行結(jié)果為正或零

「Z  :(Zero)」:Z=1表示運(yùn)算結(jié)果為零,Z=0表示運(yùn)行結(jié)果非零

「C」  :可以有4種方法設(shè)置C的值:

(Come)加法運(yùn)算(包括CMP):當(dāng)運(yùn)算結(jié)果產(chǎn)生了進(jìn)位時C=1,否則C=0減法運(yùn)算(包括CMP):當(dāng)運(yùn)算產(chǎn)生了借位,C=0否則C=1對于包含移位操作的非加/減運(yùn)算指令 ,C為移出值的最后一位對于其他的非加/減運(yùn)算指令C的值通常不改變

「V」  :
(oVerflow)對于加/減法運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號位溢出時,V=1表示符號位溢出;對于其他的非加/減運(yùn)算指令V的值通常不改變

「Q」:在ARM V5及以上版本的E系列處理器中,用Q標(biāo)志位指示增強(qiáng)的DSP運(yùn)算指令是否發(fā)生了溢出。在其它版本的處理器中,Q標(biāo)志位無定義

「J:」
僅ARM  v5TE-J架構(gòu)支持 , T=0;J = 1  處理器處于Jazelle狀態(tài),也可以和其他位組合.

「E位:」大小端控制位

「A位:」A=1 禁止不精確的數(shù)據(jù)異常

「T  :」T = 0;J=0; 處理器處于 ARM 狀態(tài)T = 1;J=0 處理器處于 Thumb 狀態(tài)T = 1;J=1 處理器處于 ThumbEE 狀態(tài)

控制位CPSR的低8位(包括I,F,T和M[4:0])稱為控制位,當(dāng)發(fā)生異常時這些位可以被改變,如果處理器運(yùn)行特權(quán)模式,這些位也可以由程序修改。

「中斷禁止位I,F」【重要】I=1 禁止IRQ中斷F=1 禁止FIQ中斷

比如我們要想在程序中實現(xiàn)禁止中斷,那么就需要將CPSR[7]置1。

運(yùn)行模式位[4-0]bite模式ARM模式可訪問的寄存器0b10000用戶模式userPC,CPSR,R0~R140b10001FIQ模式PC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R0~R70b10010IRQ模式PC,CPSR,SPSR_irq,R14_irq~R13_irq,R0~R120b10011管理模式PC,CPSR,SPSR_svc,R14_svc~R13_svc,R0~R120b10111中止模式AbortPC,CPSR,SPSR_abt,R14_abt~R13_abt,R0~R120b11011未定義模式C,CPSR,SPSR_und,R14_und~R13_und,R0~R120b11111系統(tǒng)模式PC,CPSR,R0~R14

注意觀察這5個bit的特點,最高位都是1,低4位的值則各不相同,這個很重要,要想搞清楚uboot、linux的源碼,尤其是異常操作的代碼,必須要知道這幾個bit的值。

五、協(xié)處理器

ARM體系結(jié)構(gòu)允許通過增加協(xié)處理器來擴(kuò)展指令集。最常用的協(xié)處理器是用于控制片上功能的系統(tǒng)協(xié)處理器。

例如,控制Cache和存儲管理單元MMU的CP15協(xié)處理器、設(shè)置異常向量表地址的mcr指令。

ARM支持16個協(xié)處理器,在程序執(zhí)行過程中,每個協(xié)處理器忽略屬于ARM處理器和其他協(xié)處理器指令,當(dāng)一個協(xié)處理器硬件不能執(zhí)行屬于她的協(xié)處理器指令時,就會產(chǎn)生一個未定義的異常中斷,在異常中斷處理程序中,可以通過軟件模擬該硬件的操作,比如,如果系統(tǒng)不包含向量浮點運(yùn)算器,則可以選擇浮點運(yùn)算軟件模擬包來支持向量浮點運(yùn)算。

ARM協(xié)處理器指令包括如下三類:

用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)操作用于ARM處理器的寄存器和ARM協(xié)處理器的寄存器間的數(shù)據(jù)傳送操作用于在ARM協(xié)處理器的寄存器和內(nèi)存單元之間傳送數(shù)據(jù)

這些指令包括如下5條:

CDP協(xié)處理器數(shù)據(jù)操作指令LDC協(xié)處理器數(shù)據(jù)讀入指令STC協(xié)處理器數(shù)據(jù)寫入指令MCR ARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令MRC 協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳送指令

關(guān)于協(xié)處理器指令,我們只需要知道幾個常用的即可,后面文章會提到。

六、Jazelle

Jazelle杰則來 或者說Java字節(jié)碼狀態(tài)是為了運(yùn)行Java虛擬機(jī)而添加的一種狀態(tài)。

ARM的Jazelle技術(shù)在硬件上提供了對Java字節(jié)碼的支持,大大提高了系統(tǒng)的性能。

由于ARM 架構(gòu)是32-bits,16-bits = “halfword” , “word” = 32-bits。

Java 字節(jié)碼 8-bits 獨(dú)立架構(gòu)的指令集。Jazelle 用硬件執(zhí)行大多數(shù)的字節(jié)碼(另一些使用高度優(yōu)化了的ARM 代碼)。這是由于折衷了硬件復(fù)雜度(功耗 & 硅片面積)和速度。

七、指令流水線

流水線技術(shù)通過多個功能部件并行工作來縮短程序執(zhí)行時間,提高處理器核的效率和吞吐率,從而成為微處理器設(shè)計中最為重要的技術(shù)之一。

1. 3級流水線

到ARM7為止的ARM處理器使用簡單的3級流水線,它包括下列流水線級。(1)取指令從寄存器裝載一條指令。(2)譯碼(decode)識別被執(zhí)行的指令,并為下一個周期準(zhǔn)備數(shù)據(jù)通路的控制信號。在這一級,指令占有譯碼邏輯,不占用數(shù)據(jù)通路。(3)執(zhí)行處理指令并將結(jié)果寫回寄存器。

當(dāng)處理器執(zhí)行簡單的數(shù)據(jù)處理指令時,流水線使得平均每個時鐘周期能完成1條指令。但一條指令需要3個時鐘周期來完成,因此有3個時鐘周期的延時,但吞吐率是每個周期一條指令。

對于3級流水線,PC寄存器里的值并不是正在執(zhí)行的指令的地址,而是預(yù)取指令的地址,這個知識點很重要,后面我們會詳細(xì)的舉例來證明。

處理器要滿足高性能的要求,為了滿足這個要求,需要重新考慮處理器的組織結(jié)構(gòu)。提高性能的方法主要有兩種方法:

提高時鐘頻率。時鐘頻率的提高,必然引起指令執(zhí)行周期的縮短,所以要求簡化流水線每一級的邏輯,流水線的級數(shù)都要增加。減少每條指令的平均指令周期數(shù)CPI。這就要求重新考慮3級流水線ARM中多余1個流水線周期的實現(xiàn)方法,以便使其占有較少的周期,或者減少因指令相關(guān)造成的流水線停頓,也可以將兩者結(jié)合起來。

較高性能的ARM核使用了5級流水線,而且具有分開的指令和數(shù)據(jù)存儲器。在Cortex-A8中有一條13級的流水線,但是ARM公司沒有對其中的技術(shù)公開任何相關(guān)的細(xì)節(jié)。

從經(jīng)典ARM系列到現(xiàn)在Cortex系列,ARM處理器的結(jié)構(gòu)在向復(fù)雜的階段發(fā)展,但沒改變的是CPU的取址指令和地址關(guān)系,「不管是幾級流水線,都可以按照最初的3級流水線的操作特性來判斷其當(dāng)前的PC位置」。

2. 流水線舉例

為方便理解,下面我們以3級流水線為例,

1)最佳流水線

最佳流水線

這是一個理想的實例,所有的指令都在寄存器中執(zhí)行,且處理器完全不必離開芯片本身。每個周期,都有一條指令被執(zhí)行,流水線的容量得到了充分的發(fā)揮。指令周期數(shù) (CPI) = 1

2)LDR流水線

LDR流水線

該例中,用6周期執(zhí)行了4條指令指令周期數(shù) (CPI) = 1.5

與最佳流水線不同,裝載(LDR) 操作將數(shù)據(jù)移進(jìn)片內(nèi)導(dǎo)致了指令/數(shù)據(jù)總線被占用,因此隨后緊跟了內(nèi)部的寫周期( writeback)以完成將數(shù)據(jù)寫回寄存器。

數(shù)據(jù)總線在周期1, 2, 3 被使用,周期6是取指,周期4用于數(shù)據(jù)裝載,而周期5是一個內(nèi)部周期用來完成載入的數(shù)據(jù)寫回到寄存器中。周期3為執(zhí)行周期:產(chǎn)生地址周器4為數(shù)據(jù)周期:從存儲器中取數(shù)據(jù)(數(shù)據(jù)只有在周期4的末尾出現(xiàn)在內(nèi)核中)周期5寫回周期:通過數(shù)據(jù)通道中的B總線和ALU將數(shù)據(jù)寫回到寄存器bank 中周期6的執(zhí)行被推遲了,直到周期5寫回完成(使用ALU )。同樣內(nèi)部周期是不需要等待狀體的,但讀寫存儲器時可能需要。3)分支流水線

BL指令用于實現(xiàn)指令流的跳轉(zhuǎn),并存儲返回地址到寄存器R14(LR)中。

分支流水線分支指令在其第一周期計算分支的目的地,同時在現(xiàn)行PC處完成一次指令預(yù)取,流水線被阻斷。這種預(yù)取在任何情況下都要做的,因為當(dāng)判決地址產(chǎn)生時已來不及停止預(yù)取。第二個周期在分支的目標(biāo)地址完成取指,而返回地址則存于R14如果link位已設(shè)置。第三周期完成目標(biāo)地址+4的取指,重新填滿流水線,并且如果跳轉(zhuǎn)是帶鏈接的還要修改R14(減去4)以便簡單地返回。分支需要三個時鐘周期來執(zhí)行BL,隨后會涉及調(diào)整階段。4)中斷流水線

中斷流水線

「IRQ 中斷的反應(yīng)時間最小=7周期」

周期1: 內(nèi)核被告知有中斷IRQ在現(xiàn)行指令執(zhí)行完之前不會被響應(yīng)( MUL and LDM/STM 指令會有長的延遲)解碼階段:中斷被解碼(中斷已使能,設(shè)置了相應(yīng)標(biāo)志位… )。如果中斷被使能和服務(wù),正常的指令將不會被解碼。

周期 2: 此時總是進(jìn)入ARM狀態(tài).執(zhí)行中斷 ( 獲取IR向量的地址), 保存 CPSR 于 SPSR, 改變CPSR模式為 IRQ 模式并禁止進(jìn)一步的 IRQ 中斷輸入。

周期 3: 保存 PC (0x800C) 于 r14_irq, 從IRQ異常處理向量處取指

周期 4: 解碼向量表中的指令; 調(diào)整r14irq 為0x8008

周期 4和 5: 無有用的指令取指, 由于周期 6的跳轉(zhuǎn)

周期 6: 取異常處理子程序的第一條指令;從子程序返回:  SUBS pc,lr,#4

這將恢復(fù)工作模式并從響應(yīng)中斷前的下一條指令處取指,如果有多個中斷,需堆棧保存返回地址。注意最大的FIQ響應(yīng)延遲為 29個周期(而非Thumb狀態(tài)的28周期!)。


聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    人工智能 獵頭職位 更多
    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標(biāo)題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號