嵌入式系統(tǒng)復(fù)習(xí)資料剖析課件_第1頁
嵌入式系統(tǒng)復(fù)習(xí)資料剖析課件_第2頁
嵌入式系統(tǒng)復(fù)習(xí)資料剖析課件_第3頁
嵌入式系統(tǒng)復(fù)習(xí)資料剖析課件_第4頁
嵌入式系統(tǒng)復(fù)習(xí)資料剖析課件_第5頁
已閱讀5頁,還剩191頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ARM嵌入式系統(tǒng)期末復(fù)習(xí)ARM嵌入式系統(tǒng)期末復(fù)習(xí)IEEE(國際電氣和電子工程師協(xié)會(huì))的定義:

嵌入式系統(tǒng)是“用于控制、監(jiān)視或者輔助操作的機(jī)器和設(shè)備的裝置”。從技術(shù)的角度定義:以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)、軟件硬件可裁剪,能適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗等嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。從系統(tǒng)的角度定義:嵌入式系統(tǒng)是設(shè)計(jì)以完成復(fù)雜功能的硬件和軟件,并使其緊密耦合在一起的計(jì)算機(jī)系統(tǒng)。術(shù)語嵌入式反映了這些系統(tǒng)通常是更大系統(tǒng)中的一個(gè)完整的部分,稱為嵌入的系統(tǒng)。一個(gè)系統(tǒng)中可以共存多個(gè)嵌入式系統(tǒng)。嵌入式系統(tǒng)的概念I(lǐng)EEE(國際電氣和電子工程師協(xié)會(huì))的定義: 嵌入式系統(tǒng)是“◆

微控制器(MCU)(MicroControllerUnit)

微處理器(MPU)(EmbeddedMicroProcessorUnit)

數(shù)字信號(hào)處理器(DSP)(DigitalSignalProcessor)

混合處理器和片上系統(tǒng)(SOC)(SystemOnChip)

可編程片上系統(tǒng)(SOPC)(SystemOnProgrammableChip) 嵌入式微處理器主要分類◆微控制器(MCU)(MicroController2023/1/7嵌入式系統(tǒng)的應(yīng)用領(lǐng)域嵌入式系統(tǒng)作為一個(gè)熱門的技術(shù),涵蓋了微電子技術(shù)、電子信息技術(shù)、計(jì)算機(jī)軟件和硬件等多項(xiàng)技術(shù)。

嵌入式的應(yīng)用更是涉及通訊設(shè)備、移動(dòng)終端、智能家居、物聯(lián)網(wǎng)、汽車電子、工業(yè)控制、醫(yī)療、航天、軍事等各個(gè)領(lǐng)域,甚至一些學(xué)者斷言嵌入式技術(shù)將成為后PC時(shí)代的主宰。2023/1/7嵌入式系統(tǒng)的應(yīng)用領(lǐng)域嵌入式系統(tǒng)2023/1/72023/1/72023/1/7

按照實(shí)時(shí)性分操作系統(tǒng)嵌入式操作系統(tǒng)分為實(shí)時(shí)操作系統(tǒng)和非實(shí)時(shí)操作系統(tǒng)。下面主要講實(shí)時(shí)操作系統(tǒng)的概念。嵌入式操作系統(tǒng)非實(shí)時(shí)操作系統(tǒng)實(shí)時(shí)操作系統(tǒng)硬實(shí)時(shí)操作系統(tǒng)軟實(shí)時(shí)操作系統(tǒng)2023/1/7按照實(shí)時(shí)性分操作系統(tǒng)嵌入式操作系統(tǒng)非實(shí)時(shí)操實(shí)時(shí)操作系統(tǒng)

實(shí)時(shí)系統(tǒng)是由事件驅(qū)動(dòng)的,能對(duì)外部事件在限定的時(shí)間范圍內(nèi)作出響應(yīng)。響應(yīng)時(shí)間要有保證。對(duì)外部事件的響應(yīng)包括: (1)事件發(fā)生時(shí)要識(shí)別出來 (2)在給定時(shí)間約束內(nèi)必須輸出正確的結(jié)果

實(shí)時(shí)系統(tǒng)強(qiáng)調(diào)的是實(shí)時(shí)性、可靠性和靈活性,與實(shí)時(shí)應(yīng)用軟件相結(jié)合成為有機(jī)的整體起著核心作用,由它來管理和協(xié)調(diào)各項(xiàng)工作,為應(yīng)用軟件提供良好的運(yùn)行軟件環(huán)境及開發(fā)環(huán)境。實(shí)時(shí)操作系統(tǒng)實(shí)時(shí)系統(tǒng)是由事件驅(qū)動(dòng)的,能對(duì)外部2023/1/7實(shí)時(shí)操作系統(tǒng)又分為:硬實(shí)時(shí)系統(tǒng): 對(duì)系統(tǒng)響應(yīng)時(shí)間有嚴(yán)格的要求,如果系統(tǒng)響應(yīng)時(shí)間不能滿足,就會(huì)引起系統(tǒng)崩潰或致命的錯(cuò)誤。軟實(shí)時(shí)系統(tǒng):對(duì)系統(tǒng)響應(yīng)時(shí)間有要求,但是如果系統(tǒng)響應(yīng)時(shí)間不能滿足,它并不會(huì)導(dǎo)致系統(tǒng)出現(xiàn)致命的錯(cuò)誤或崩潰,只是降低系統(tǒng)的吞吐量。2023/1/7實(shí)時(shí)操作系統(tǒng)又分為:幾種主流的嵌入式操作系統(tǒng)FreeRTOS:開源免費(fèi)的輕量級(jí)實(shí)時(shí)系統(tǒng)μCos-II:源碼開放(商業(yè)收費(fèi))、面向中小型嵌入式系統(tǒng)應(yīng)用。Linux:嵌入式Linux具有一些獨(dú)特的優(yōu)勢(shì):層次結(jié)構(gòu)及

內(nèi)核完全開放;強(qiáng)大的網(wǎng)絡(luò)支持功能;具備一整套開發(fā)工具鏈;廣泛的硬件支持特性。WinCE:它是微軟針對(duì)個(gè)人電腦以外的電腦產(chǎn)品所研發(fā)的嵌入式操作系統(tǒng),支持具有豐富應(yīng)用程序和服務(wù)。Vxworks:美國WindRiver公司于1983年開發(fā),具有可靠、實(shí)時(shí)、可裁減特性。QNX:主要用于汽車電子的實(shí)時(shí)系統(tǒng)Android

幾種主流的嵌入式操作系統(tǒng)嵌入式系統(tǒng)軟件層次一個(gè)嵌入式系統(tǒng)從軟件角度來看分為四個(gè)層次:

1.引導(dǎo)加載程序包括固化在固件(firmware)中的boot代碼(可選),和BootLoader兩大部分。

2.Linux內(nèi)核特定嵌入式平臺(tái)定制的內(nèi)核及內(nèi)核的啟動(dòng)參數(shù)。設(shè)備驅(qū)動(dòng)程序是可裝入的內(nèi)核模塊。

3.文件系統(tǒng)包括根文件系統(tǒng)和建立于Flash內(nèi)存設(shè)備之上的文件系統(tǒng)。

4.用戶應(yīng)用程序特定用戶的應(yīng)用程序。嵌入式系統(tǒng)軟件層次一個(gè)嵌入式系統(tǒng)從軟件角度來看分為四個(gè)層次:嵌入式系統(tǒng)的最小系統(tǒng)嵌入式控制器時(shí)鐘系統(tǒng)調(diào)試測(cè)試接口復(fù)位及其配置系統(tǒng)存儲(chǔ)器系統(tǒng)供電系統(tǒng)(電源)最小系統(tǒng)嵌入式系統(tǒng)的最小系統(tǒng)嵌入式控制器時(shí)鐘系統(tǒng)調(diào)試測(cè)試接口復(fù)位及其ARM7系列

ARM7采用馮·諾依曼(Von-Neumann)存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)存儲(chǔ)器和程序存儲(chǔ)器使用同一存儲(chǔ)空間,用相同的指令訪問。馮·諾依曼結(jié)構(gòu)也被大多數(shù)計(jì)算機(jī)所采用。

ARM7為三級(jí)流水線結(jié)構(gòu)(取指令,指令譯碼,指令執(zhí)行),平均功耗為0.6mW/MHz,時(shí)鐘速度為66MHz,每條指令平均執(zhí)行1.9個(gè)時(shí)鐘周期。取指譯碼執(zhí)行ARM7多數(shù)不支持MMU。ARM7系列2023/1/7ARM9系列ARM9采用哈佛(Harvard)存儲(chǔ)結(jié)構(gòu),程序存儲(chǔ)器與數(shù)據(jù)存儲(chǔ)器分開,提供了較大的存儲(chǔ)器帶寬。ARM9為五級(jí)流水(取指,譯碼,執(zhí)行,緩沖/數(shù)據(jù),回寫),平均功耗為0.7mW/MHz。時(shí)鐘速度為120MHz-200MHz,每條指令平均執(zhí)行1.5個(gè)時(shí)鐘周期。32位AMBA總線接口的MMU支持;2023/1/7ARM9系列2023/1/7從編程的角度看,ARM微處理器的工作狀態(tài)一般有兩種,并可在兩種狀態(tài)之間切換:ARM狀態(tài),此時(shí)處理器執(zhí)行32位的字對(duì)齊的ARM指令;Thumb狀態(tài),此時(shí)處理器執(zhí)行16位的、半字對(duì)齊的Thumb指令。

對(duì)于ARM9處理器有兩種工作狀態(tài)和7種工作模式。1.ARM9處理器的兩種工作狀態(tài)3ARM工作狀態(tài)和工作模式2023/1/7從編程的角度看,ARM微處理器的工作狀態(tài)一般2023/1/7處理器模式說明備注

用戶(usr)正常程序工作模式正常的程序執(zhí)行狀態(tài),不能直接切換到其它模式

系統(tǒng)(sys)用于支持操作系統(tǒng)的特權(quán)任務(wù)等與用戶模式類似,但具有可以直接切換到其它模式等特權(quán),供需要訪問系統(tǒng)資源的操作系統(tǒng)任務(wù)使用

快中斷(fiq)支持高速數(shù)據(jù)傳輸及通道處理FIQ異常響應(yīng)時(shí)進(jìn)入此模式,用于高速數(shù)據(jù)傳輸或通道處理

中斷(irq)用于通用中斷處理IRQ異常響應(yīng)時(shí)進(jìn)入此模式,用于通用的中斷處理

管理(svc)操作系統(tǒng)保護(hù)代碼系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入此模式,供操作系統(tǒng)使用的一種保護(hù)模式

中止(abt)用于支持虛擬內(nèi)存和/或存儲(chǔ)器保護(hù)當(dāng)存取異常時(shí)將會(huì)進(jìn)入這種模式,用于支持虛擬內(nèi)存和存儲(chǔ)器保護(hù)

未定義(und)支持硬件協(xié)處理器的軟件仿真未定義指令異常響應(yīng)時(shí)進(jìn)入此模式,軟件仿真硬件協(xié)處理器3ARM工作狀態(tài)和工作模式2023/1/7處理器模式說明備注用戶(u特權(quán)模式處理器模式說明備注

用戶(usr)正常程序工作模式不能直接切換到其它模式

系統(tǒng)(sys)用于支持操作系統(tǒng)的特權(quán)任務(wù)等與用戶模式類似,但具有可以直接切換到其它模式等特權(quán)

快中斷(fiq)支持高速數(shù)據(jù)傳輸及通道處理FIQ異常響應(yīng)時(shí)進(jìn)入此模式

中斷(irq)用于通用中斷處理IRQ異常響應(yīng)時(shí)進(jìn)入此模式

管理(svc)操作系統(tǒng)保護(hù)代碼系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入此模式

中止(abt)用于支持虛擬內(nèi)存和/或存儲(chǔ)器保護(hù)在ARM7TDMI沒有大用處

未定義(und)支持硬件協(xié)處理器的軟件仿真未定義指令異常響應(yīng)時(shí)進(jìn)入此模式

除用戶模式外,其它模式均為特權(quán)模式。ARM內(nèi)部寄存器和一些片內(nèi)外設(shè)在硬件設(shè)計(jì)上只允許(或者可選為只允許)特權(quán)模式下訪問。此外,特權(quán)模式可以自由的切換處理器模式,而用戶模式不能直接切換到別的模式。

未定義(und)

中止(abt)

管理(svc)

中斷(irq)

快中斷(fiq)

系統(tǒng)(sys)3ARM工作狀態(tài)和工作模式特權(quán)模式處理器模式說明備注用戶(usr)正異常模式處理器模式說明備注

用戶(usr)正常程序工作模式不能直接切換到其它模式

系統(tǒng)(sys)用于支持操作系統(tǒng)的特權(quán)任務(wù)等與用戶模式類似,但具有可以直接切換到其它模式等特權(quán)

快中斷(fiq)支持高速數(shù)據(jù)傳輸及通道處理FIQ異常響應(yīng)時(shí)進(jìn)入此模式

中斷(irq)用于通用中斷處理IRQ異常響應(yīng)時(shí)進(jìn)入此模式

管理(svc)操作系統(tǒng)保護(hù)代碼系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入此模式

中止(abt)用于支持虛擬內(nèi)存和/或存儲(chǔ)器保護(hù)在ARM7TDMI沒有大用處

未定義(und)支持硬件協(xié)處理器的軟件仿真未定義指令異常響應(yīng)時(shí)進(jìn)入此模式

未定義(und)

中止(abt)

管理(svc)

中斷(irq)

快中斷(fiq)

這五種模式稱為異常模式。它們除了可以通過程序切換進(jìn)入外,也可以由特定的異常進(jìn)入。當(dāng)特定的異常出現(xiàn)時(shí),處理器進(jìn)入相應(yīng)的模式。每種異常模式都有一些獨(dú)立的寄存器,以避免異常退出時(shí)用戶模式的狀態(tài)不可靠。3ARM工作狀態(tài)和工作模式異常模式處理器模式說明備注用戶(usr)正用戶和系統(tǒng)模式處理器模式說明備注

用戶(usr)正常程序工作模式不能直接切換到其它模式

系統(tǒng)(sys)用于支持操作系統(tǒng)的特權(quán)任務(wù)等與用戶模式類似,但具有可以直接切換到其它模式等特權(quán)

快中斷(fiq)支持高速數(shù)據(jù)傳輸及通道處理FIQ異常響應(yīng)時(shí)進(jìn)入此模式

中斷(irq)用于通用中斷處理IRQ異常響應(yīng)時(shí)進(jìn)入此模式

管理(svc)操作系統(tǒng)保護(hù)代碼系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入此模式

中止(abt)用于支持虛擬內(nèi)存和/或存儲(chǔ)器保護(hù)在ARM7TDMI沒有大用處

未定義(und)支持硬件協(xié)處理器的軟件仿真未定義指令異常響應(yīng)時(shí)進(jìn)入此模式

這兩種模式都不能由異常進(jìn)入,而且它們使用完全相同的寄存器組。系統(tǒng)模式是特權(quán)模式,不受用戶模式的限制。操作系統(tǒng)在該模式下訪問用戶模式的寄存器就比較方便,而且操作系統(tǒng)的一些特權(quán)任務(wù)可以使用這個(gè)模式訪問一些受控的資源。

系統(tǒng)(sys)

用戶(usr)3ARM工作狀態(tài)和工作模式用戶和系統(tǒng)模式處理器模式說明備注用戶(us管理模式(svc)的進(jìn)入方式和處理內(nèi)容: ①系統(tǒng)上電復(fù)位后進(jìn)入管理模式,運(yùn)行系統(tǒng)初始化程序,如中斷允許/禁止,主時(shí)鐘設(shè)置,SDRAM配置,各個(gè)功能模塊初始化等。 ②當(dāng)執(zhí)行軟件中斷指令SWI指令時(shí),進(jìn)入管理模式。處理器啟動(dòng)時(shí)的模式轉(zhuǎn)換圖:管理模式(Supervisor)多種特權(quán)模式變化用戶程序的運(yùn)行模式復(fù)位后的缺省模式主要完成各模式的堆棧設(shè)置,注意不要進(jìn)入用戶模式一般為用戶模式User管理模式(svc)的進(jìn)入方式和處理內(nèi)容:管理模式多種特權(quán)2023/1/7ARM內(nèi)部寄存器ARM9微處理器共有37個(gè)32位寄存器,其中31個(gè)為通用寄存器,6個(gè)為狀態(tài)寄存器。但是這些寄存器不能被同時(shí)訪問,具體哪些寄存器是可編程訪問的,取決微處理器的工作狀態(tài)及具體的運(yùn)行模式。但在任何時(shí)候,通用寄存器R14~R0、程序計(jì)數(shù)器PC、一個(gè)或兩個(gè)狀態(tài)寄存器都是可訪問的(對(duì)應(yīng)模式下的)。

2023/1/7ARM內(nèi)部寄存器ARM9寄存器類別寄存器在匯編中的名稱各模式下實(shí)際訪問的寄存器用戶系統(tǒng)管理中止未定義中斷快中斷通用寄存器和程序計(jì)數(shù)器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態(tài)寄存器CPSRCPSRSPSR無SPSR_svcSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM狀態(tài)各模式下的寄存器寄存器類別寄存器在匯編中的名稱各模式下實(shí)際訪問的寄存器用戶系2023/1/7ARM狀態(tài)下的寄存器組織通用寄存器:通用寄存器包括R0~R15,可以分為三類:未分組寄存器R0~R7分組寄存器R8~R14程序計(jì)數(shù)器PC(R15)2023/1/7ARM狀態(tài)下的寄存器組織通用寄存器:通用寄未分組寄存器R0~R7

在所有的運(yùn)行模式下,未分組寄存器都指向同一個(gè)物理寄存器,他們未被系統(tǒng)用作特殊的用途,是真正的通用寄存器。 因此,在中斷或異常處理進(jìn)行運(yùn)行模式轉(zhuǎn)換時(shí),由于不同的處理器運(yùn)行模式均使用相同的物理寄存器,可能會(huì)造成寄存器中數(shù)據(jù)的破壞,這一點(diǎn)在進(jìn)行程序設(shè)計(jì)時(shí)應(yīng)引起注意。未分組寄存器R0~R7 在所有的運(yùn)行模式下,未分組寄存器都指2023/1/7分組寄存器R8~R12每次所訪問的物理寄存器與處理器當(dāng)前的運(yùn)行模式有關(guān)R8~R12:每個(gè)寄存器對(duì)應(yīng)兩個(gè)不同的物理寄存器當(dāng)使用fiq模式時(shí),訪問寄存器R8_fiq~R12_fiq;當(dāng)使用除fiq模式以外的其他模式時(shí),訪問寄存器R8_usr~R12_usr。2023/1/7分組寄存器R8~R12每次所訪問的物理寄存器寄存器類別寄存器在匯編中的名稱各模式下實(shí)際訪問的寄存器用戶系統(tǒng)管理中止未定義中斷快中斷通用寄存器和程序計(jì)數(shù)器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態(tài)寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM狀態(tài)各模式下的寄存器寄存器類別寄存器在匯編中的名稱各模式下實(shí)際訪問的寄存器用戶系2023/1/7分組寄存器R13~R14R13(SP)、R14(LR):每個(gè)寄存器對(duì)應(yīng)6個(gè)不同的物理寄存器其中的一個(gè)是用戶模式與系統(tǒng)模式共用,另外5個(gè)物理寄存器對(duì)應(yīng)于其他5種不同的運(yùn)行模式采用以下的記號(hào)來區(qū)分不同的物理寄存器:R13_<mode>R14_<mode>mode為以下幾種之一:usr、fiq、irq、svc、abt、und。2023/1/7分組寄存器R13~R14R13(SP)、R12023/1/7堆棧指針—R13R13在ARM指令中常用作堆棧指針SP,但這只是一種習(xí)慣用法,用戶也可使用其他的寄存器作為堆棧指針。在Thumb指令集中,某些指令強(qiáng)制性的要求使用R13作為堆棧指針SP。由于處理器的每種運(yùn)行模式均有自己獨(dú)立的物理寄存器R13,在初始化部分,都要初始化每種模式下的R13,這樣,當(dāng)程序的運(yùn)行進(jìn)入異常模式時(shí),可以將需要保護(hù)的寄存器放入R13所指向的堆棧,而當(dāng)程序從異常模式返回時(shí),則從對(duì)應(yīng)的堆棧中恢復(fù)。2023/1/7堆棧指針—R13R13在ARM指令中常用作堆子程序連接寄存器—R14R14也稱作子程序連接寄存器或連接寄存器LR。當(dāng)執(zhí)行BL指令調(diào)用子程序時(shí),R14復(fù)制R15(程序計(jì)數(shù)器PC)以備份。其他情況下,R14用作通用寄存器。R14寄存器與異常發(fā)生,異常發(fā)生時(shí),程序要跳轉(zhuǎn)至異常服務(wù)程序,對(duì)返回地址的處理與子程序調(diào)用類似,都是由硬件完成的。將對(duì)應(yīng)的異常模式下的R14設(shè)置為異常返回地址(有些異常有一個(gè)小的固定偏移量)子程序連接寄存器—R14R14也稱作子程序連接寄存器或連接寄子程序連接寄存器—R14在每一種運(yùn)行模式下,都可用R14保存子程序的返回地址,當(dāng)用BL或BLX指令調(diào)用子程序時(shí),將PC的當(dāng)前值拷貝給R14,執(zhí)行完子程序后,又將R14的值拷貝回PC,即可完成子程序的調(diào)用返回。 BL SUB1 …… SUB1: STMFD SP!,{<regs>,LR}/*將R14存入堆棧*/ …… LDMFD SP!,{<regs>,PC}/*完成子程序返回*/Lable程序A程序BR14BLLable地址A???MOVPC,LRR14(地址A)Lable???子程序連接寄存器—R14在每一種運(yùn)行模式下,都可用R14保存2023/1/7程序計(jì)數(shù)器PC(R15)R15(PC)指向正在取指的地址??梢哉J(rèn)為它是一個(gè)通用寄存器,但是對(duì)于它的使用有許多與指令相關(guān)的限制或特殊情況。如果R15使用的方式超出了這些限制,那么結(jié)果將是不可預(yù)測(cè)的。由于ARM9體系結(jié)構(gòu)采用了多級(jí)流水線技術(shù),對(duì)于ARM指令集而言,PC總是指向當(dāng)前執(zhí)行指令的下兩條指令的地址,即PC的值為當(dāng)前指令的地址值加8,也即PC指向正在取指的地址。ARM狀態(tài)下,位[1:0]為0,位[31:2]用于保存PC;Thumb狀態(tài)下,位[0]為0,位[31:1]用于保存PC;2023/1/7程序計(jì)數(shù)器PC(R15)R15(PC)指向正讀R15的限制

正常操作時(shí),從R15讀取的值是處理器正在取指的地址,即當(dāng)前正在執(zhí)行指令的地址加上8個(gè)字節(jié)(兩條ARM指令的長(zhǎng)度)。由于ARM指令總是以字為單位,所以R15寄存器的最低兩位總是為0。LDRR0,PC??????PCPC-4PC-8正在執(zhí)行正在譯碼正在取指流水線狀態(tài)地址程序代碼讀R15的限制正常操作時(shí),從R15讀取的值是寄存器類別寄存器在匯編中的名稱各模式下實(shí)際訪問的寄存器用戶系統(tǒng)管理中止未定義中斷快中斷通用寄存器和程序計(jì)數(shù)器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態(tài)寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM狀態(tài)各模式下的寄存器寄存器類別寄存器在匯編中的名稱各模式下實(shí)際訪問的寄存器用戶系 在ARM微處理器中,有CPSR和SPSR兩種程序狀態(tài)寄存器。1、當(dāng)前程序狀態(tài)寄存器CPSR(CurrentProgramStatusRegister)用來保存當(dāng)前程序狀態(tài)的寄存器。所有模式共用同一個(gè)CPSR。2、保存(備份)程序狀態(tài)寄存器SPSR_mode

(SavedProgramStatusRegister) SPSR_mode用來進(jìn)行異常處理,其功能包括: ─保存ALU中的當(dāng)前操作信息 當(dāng)異常發(fā)生時(shí),用來保存CPSR的值,從異常返回時(shí),將

SPSR_mode復(fù)制到CPSR中,恢復(fù)CPSR的值。 ─控制允許和禁止中斷 修改SPSR的值 ─設(shè)置處理器的運(yùn)行模式 修改SPSR的值注意:如果通過程序修改CPSR寄存器中的模式位進(jìn)入異常模式,那么硬件將不會(huì)把CPSR保存至SPSR中。

程序狀態(tài)寄存器(PSR) 在ARM微處理器中,有CPSR和SPSR兩種程序狀態(tài)寄存器寄存器類別寄存器在匯編中的名稱各模式下實(shí)際訪問的寄存器用戶系統(tǒng)管理中止未定義中斷快中斷通用寄存器和程序計(jì)數(shù)器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態(tài)寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM狀態(tài)各模式下的寄存器寄存器類別寄存器在匯編中的名稱各模式下實(shí)際訪問的寄存器用戶系2023/1/7程序狀態(tài)寄存器CPSR的每一位的安排

2023/1/7程序狀態(tài)寄存器CPSR的每一位的安排2023/1/7標(biāo)志位含

義NNegativelessthan,當(dāng)用兩個(gè)補(bǔ)碼表示的帶符號(hào)數(shù)進(jìn)行運(yùn)算時(shí),N=1表示運(yùn)算的結(jié)果為負(fù)數(shù);N=0表示運(yùn)算的結(jié)果為正數(shù)或零;ZZero,Z=1表示運(yùn)算的結(jié)果為零(通常表示比較結(jié)果“相等”);Z=0表示運(yùn)算的結(jié)果為非零;CCarry/Borrow/Extend加法運(yùn)算結(jié)果進(jìn)位時(shí)(包括CMN指令),C=1;減法運(yùn)算借位時(shí),C=0;移位操作的非加/減運(yùn)算指令,C為從最高位最后移出的值;其他的非加/減運(yùn)算指令,C的值通常不改變。VOverflow加/減法運(yùn)算指令,V=1表示符號(hào)位溢出。對(duì)于其他的非加/減運(yùn)算指令,C的值通常不改變。QQ標(biāo)志指示DSP運(yùn)算指令是否溢出。3130292827…876543210NZCV(保留)IFTM4M3M2M1M02023/1/7標(biāo)志位含義NNegativeles2023/1/7 CPSR的最低8位為控制位,當(dāng)發(fā)生異常時(shí),這些位被硬件改變。當(dāng)處理器處于一個(gè)特權(quán)模式時(shí),可用軟件操作這些位。中斷禁止位I、F:(I--IRQdisable,F—FIQdisable)I=1禁止IRQ中斷;

I=0允許IRQ中斷F=1禁止FIQ中斷;

F=0允許FIQ中斷T標(biāo)志位(Statebit):該位反映處理器的運(yùn)行狀態(tài)T=1時(shí),程序運(yùn)行于Thumb狀態(tài)T=0時(shí),程序運(yùn)行于ARM狀態(tài)

運(yùn)行模式位M[4:0]是模式位,決定處理器的運(yùn)行模式

3130292827…876543210NZCV(保留)IFTM4M3M2M1M02023/1/7 CPSR的最低8位為控制位,當(dāng)發(fā)生異常時(shí),CPSR(當(dāng)前程序狀態(tài)寄存器)的低5位用于定義當(dāng)前操作模式:處理器運(yùn)行模式及可以訪問的寄存器3130292827…876543210NZCV(保留)IFTM4M3M2M1M0CPSR(當(dāng)前程序狀態(tài)寄存器)的低5位用于定義當(dāng)前操作模式ARM異常簡(jiǎn)介

只要正常的程序流被暫時(shí)中止,處理器就進(jìn)入異常模式,如果同時(shí)發(fā)生兩個(gè)或更多異常,那么將按照異常的優(yōu)先級(jí)來處理異常。

在ARM中共有7種異常:異常模式向量表偏移復(fù)位(reset)SVC(管理模式)+0x00(優(yōu)先級(jí)最高)未定義指令UND(未定義模式)+0x04軟件中斷(SWI)SVC(管理模式)+0x08預(yù)取指終止ABT(中止模式)+0x0c數(shù)據(jù)終止ABT(中止模式)+0x10未分配--+0x14IRQIRQ(中斷模式)+0x18FIQ

FIQ(快速中斷模式)+0x1cARM異常簡(jiǎn)介只要正常的程序流被暫時(shí)中止,處ARM指令系統(tǒng)ARM指令系統(tǒng)

尋址方式是處理器執(zhí)行指令時(shí)尋找真實(shí)操作數(shù)地址的方式。ARM處理器支持9種基本尋址方式尋址方式分類

尋址方式是根據(jù)指令中給出的地址碼字段來實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式。ARM處理器具有9種基本尋址方式。1.寄存器尋址; 2.立即尋址;3.寄存器移位尋址; 4.寄存器間接尋址;5.基址尋址; 6.多寄存器尋址;7.堆棧尋址; 8.塊拷貝尋址;9.相對(duì)尋址。尋址方式是處理器執(zhí)行指令時(shí)尋找真實(shí)操作數(shù)地址

操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2 ;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結(jié)果保存到R0

0xAA0x55R2R1尋址方式分類——寄存器尋址MOVR1,R20xAA操作數(shù)的值在寄存器中,指令中的地址碼字段指出

立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下:SUBS R0,R0,#1;R0減1,結(jié)果放入R0,并且影響標(biāo)志位;R0=R0-#1;MOV R0,#0xFF;將立即數(shù)0xFF裝入R0寄存器

尋址方式分類——立即尋址立即尋址指令中的操作碼字段后面的地址碼部分即

寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個(gè)操作數(shù)是寄存器移位方式時(shí),第2個(gè)寄存器操作數(shù)在與第1個(gè)操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。寄存器移位尋址指令舉例如下:MOV R0,R2,LSL#3 ;R2的值左移3位,結(jié)果放入R0,即是R0=R2×8ANDS R1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相“與”操作,結(jié)果放入R10x55R0R20x01尋址方式分類——寄存器移位尋址MOVR0,R2,LSL#30x080x08邏輯左移3位寄存器移位尋址是ARM指令集特有的尋址方式。

寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下:LDR R1,[R2] ;將R2指向的存儲(chǔ)單元的數(shù)據(jù)讀出;將其保存在R1中SWP R1,R1,[R2] ;將寄存器R1的值和R2指向的存儲(chǔ)單元的內(nèi)容交換0x55R0R20x400000000xAA0x40000000尋址方式分類——寄存器間接尋址LDRR0,[R2]0xAA寄存器間接尋址指令中的地址碼給出的是一個(gè)通用

基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址?;穼ぶ酚糜谠L問基址附近的存儲(chǔ)單元,常用于查表、數(shù)組操作、功能部件寄存器訪問等?;穼ぶ分噶钆e例如下:LDR R2,[R3,#0x0C] ;讀取R3+0x0C地址上的存儲(chǔ)單元的內(nèi)容,存入R2。STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值保存到R0指定的存儲(chǔ)單元尋址方式分類——基址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA將R3+0x0C作為地址裝載數(shù)據(jù)基址尋址就是將基址寄存器的內(nèi)容與指令中給出的

多寄存器尋址一次可傳送幾個(gè)寄存器值,允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,{R2-R7,R12};

[R1]->R2,[R1+4]->R3,[R1+8]->R4等(R1自動(dòng)加1)。STMIA R0!,{R2-R7,R12};將寄存器R2~R7、R12的值保存到R0指向的存儲(chǔ);單元中(R0自動(dòng)加1)。注:ARM指令中{!},為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存器的內(nèi)容不改變。0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲(chǔ)器地址尋址方式分類——多寄存器尋址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x40000010多寄存器尋址一次可傳送幾個(gè)寄存器值,允許一條

堆棧是一個(gè)按特定順序進(jìn)行存取的存儲(chǔ)區(qū),操作順序?yàn)椤昂筮M(jìn)先出”。堆棧尋址是隱含的,它使用一個(gè)專門的寄存器(堆棧指針SP,R13)指向一塊存儲(chǔ)區(qū)域(堆棧),SP指針?biāo)赶虻拇鎯?chǔ)單元即是堆棧的棧頂。存儲(chǔ)器堆??煞譃閮煞N:向上生長(zhǎng):向高地址方向生長(zhǎng),稱為遞增堆棧向下生長(zhǎng):向低地址方向生長(zhǎng),稱為遞減堆棧尋址方式分類——堆棧尋址堆棧是一個(gè)按特定順序進(jìn)行存取的存儲(chǔ)區(qū),操作順尋址方式分類——堆棧尋址棧底(低地址)棧頂棧區(qū)SP堆棧存儲(chǔ)區(qū)(低地址)棧頂棧底棧區(qū)SP向下增長(zhǎng)向上增長(zhǎng)0x123456780x12345678堆棧壓棧堆棧壓棧尋址方式分類——堆棧尋址棧底(低地址)棧頂棧區(qū)SP堆棧存儲(chǔ)滿堆棧是指堆棧指針指向堆棧的最后一個(gè)已使用的地址;空堆棧是指堆棧指針指向下一個(gè)待壓入數(shù)據(jù)的空位置。 ARM體系結(jié)構(gòu)使用多寄存器指令load-store來完成堆棧操作。在指令上加上后綴FA、FD、EA、ED(F-滿位置,E-空位置,A-遞增,D-遞減)來表示sp指針的尋址方式,如FA表示滿遞增。尋址方式分類——堆棧尋址滿堆棧是指堆棧指針指向堆棧的最后一個(gè)已使用的地址;空堆棧是指可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長(zhǎng),堆棧指針指向含有有效數(shù)據(jù)項(xiàng)的最高地址。指令如LDMFA、STMFA等;空遞增:堆棧向上增長(zhǎng),堆棧指針指向堆棧上的第一個(gè)空位置。指令如LDMEA、STMEA等;滿遞減:堆棧向下增長(zhǎng),堆棧指針指向含有有效數(shù)據(jù)項(xiàng)的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長(zhǎng),堆棧指針向堆棧下的第一個(gè)空位置。指令如LDMED、STMED等。尋址方式分類——堆棧尋址可以組合出四種類型的堆棧方式:尋址方式分類——堆棧尋址

多寄存器傳送指令用于將一塊數(shù)據(jù)從存儲(chǔ)器的某一位置拷貝到另一位置。塊拷貝尋址與堆棧尋址有所類似。兩者的區(qū)別在于:堆棧尋址中數(shù)據(jù)的存取是面向堆棧的,塊拷貝尋址中數(shù)據(jù)的存取是面向寄存器指向的存儲(chǔ)單元的.在塊拷貝尋址方式中,基址寄存器傳送一個(gè)數(shù)據(jù)后有4種增長(zhǎng)方式,即:IA:每次傳送后地址增加4;(IncrementAfterOperating)IB:每次傳送前的地址增加4;(IncrementBeforeOperating)DA:每次傳送后地址減少4;(DecrementAfterOperating)DB:每次傳送前地址減少4。(DecrementBeforeOperating)尋址方式分類——塊拷貝尋址多寄存器傳送指令用于將一塊數(shù)據(jù)從存儲(chǔ)器的某一STMIA

R0!,{R1—R7,R9,R11};將R1-R7的數(shù)據(jù)保存到R0指向的存儲(chǔ)器中,存儲(chǔ)器指針在保存第一個(gè)值之后增加4,向上增長(zhǎng)。R0作為基址寄存器。STMIB

R0!,{R1—R7};將R1-R7的數(shù)據(jù)保存到存儲(chǔ)器中,存儲(chǔ)器指針在保存第一個(gè)值之前增加4,向上增長(zhǎng)。R0作為基址寄存器。STMDA

!,{R1—R7};將R1-R7的數(shù)據(jù)保存到R0指向的存儲(chǔ)器中,存儲(chǔ)器指針在保存第一個(gè)值之后減少4,向下減少。R0作為基址寄存器。STMDB

!,{R1—R7};將R1-R7的數(shù)據(jù)保存到存儲(chǔ)器中,存儲(chǔ)器指針在保存第一個(gè)值之前減少4,向下減少。R0作為基址寄存器。注:ARM指令中{!}為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存器的內(nèi)容不改變。

ARM指令中{^}為可選后綴,當(dāng)指令為L(zhǎng)DM且寄存器列表中包含R15,選用該后綴時(shí)表示:除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到CPSR。同時(shí),該后綴還表示傳入或傳出的是用戶模式下的寄存器,而不是當(dāng)前模式下的寄存器。STMIA

R0!,{R1—R7,R9,R11}

相對(duì)尋址是基址尋址的一種變通。由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對(duì)尋址指令舉例如下:

BL SUBR1 ;調(diào)用到SUBR1子程序

BEQ LOOP ;條件跳轉(zhuǎn)到LOOP標(biāo)號(hào)處

...LOOP MOV R6,#1 ...SUBR1 ...尋址方式分類——相對(duì)尋址相對(duì)尋址是基址尋址的一種變通。由程序計(jì)數(shù)器PBLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}ARM指令——分支指令

帶鏈接的分支指令——BL指令適用于子程序調(diào)用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉(zhuǎn)到指定地址運(yùn)行程序。跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BL{cond}LabelAddr1LabelAddr2Addr21.當(dāng)程序執(zhí)行到BL跳轉(zhuǎn)指令時(shí),硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計(jì)數(shù)器(PC)2.程序跳轉(zhuǎn)到目標(biāo)地址Label繼續(xù)執(zhí)行,當(dāng)子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行BLLabelxxxxxxLabelxxxMOVPC,助記符說明操作條件碼位置MOVRd,operand2數(shù)據(jù)傳送Rd←operand2MOV{cond}{S}MVNRd,operand2數(shù)據(jù)非傳送Rd←(~operand2)MVN{cond}{S}ARM數(shù)據(jù)處理指令——數(shù)據(jù)傳送

MOV指令將8位立即數(shù)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運(yùn)算等操作。指令格式如下:MOV{cond}{S}Rd,operand2

MOV指令舉例如下:

MOV R1,#0x10 ;R1=0x10

MOV R0,R1 ;R0=R1

MOVS R3,R1,LSL#2 ;R3=(R1<<2),并影響標(biāo)志位

MOV PC,LR ;PC=LR,子程序返回

助記符說明操作條件碼位置MOVRd,operand2數(shù)助記符說明操作條件碼位置ADDRd,Rn,operand2加法運(yùn)算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運(yùn)算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進(jìn)位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進(jìn)位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進(jìn)位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}ARM數(shù)據(jù)處理指令——算術(shù)運(yùn)算

加法運(yùn)算指令——ADD指令將operand2的值與Rn的值相加,結(jié)果保存到Rd寄存器。指令格式如下:ADD{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

ADDSR1,R1,#1 ;R1=R1+1,并影響標(biāo)志位

ADDR1,R1,R2 ;R1=R1+R2

助記符說明操作條件碼位置ADDRd,Rn,oper助記符說明操作條件碼位置ADDRd,Rn,operand2加法運(yùn)算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運(yùn)算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進(jìn)位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進(jìn)位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進(jìn)位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

減法運(yùn)算指令——SUB指令用寄存器Rn減去operand2,結(jié)果保存到Rd中。指令格式如下:SUB{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

SUBS R0,R0,#1 ;R0=R0-1,并影響標(biāo)志位

SUBS R2,R1,R2 ;R2=R1-R2

,并影響標(biāo)志位

ARM數(shù)據(jù)處理指令——算術(shù)運(yùn)算助記符說明操作條件碼位置ADDRd,Rn,oper助記符說明操作條件碼位置ANDRd,Rn,operand2邏輯與操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2邏輯或操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2邏輯異或操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}{S}ARM數(shù)據(jù)處理指令——邏輯運(yùn)算指令

邏輯或操作指令——ORR指令將operand2的值與寄存器Rn的值按位作邏輯“或”操作,結(jié)果保存到Rd中。指令格式如下:ORR{cond}{S}Rd,Rn,operand2

應(yīng)用示例:

MOV R1,R2,LSR#24 ;使用ORR指令將R2的高8位

ORR R3,R1,R3,LSL#8

;移入到R3低8位中注:LSL為邏輯左移;LSR為邏輯右移。助記符說明操作條件碼位置ANDRd,Rn,oper助記符說明操作條件碼位置ADDRd,Rn,operand2加法運(yùn)算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運(yùn)算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進(jìn)位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進(jìn)位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進(jìn)位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

帶進(jìn)位加法指令——ADC將operand2的值與Rn的值相加,再加上CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd寄存器。指令格式如下:ADC{cond}{S}Rd,Rn,operand2應(yīng)用示例(使用ADC實(shí)現(xiàn)64位加法,結(jié)果存于R1、R0中):

ADDSR0,R0,R2 ;R0等于低32位相加,并影響標(biāo)志位

ADCR1,R1,R3

;R1等于高32位相加,并加上低位進(jìn)位ARM數(shù)據(jù)處理指令——算術(shù)運(yùn)算助記符說明操作條件碼位置ADDRd,Rn,oper助記符說明操作條件碼位置ADDRd,Rn,operand2加法運(yùn)算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運(yùn)算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進(jìn)位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進(jìn)位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進(jìn)位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}

帶進(jìn)位減法指令——SBC用寄存器Rn減去operand2,再減去CPSR中的C條件標(biāo)志位的非(減法運(yùn)算借位,則C=0),結(jié)果保存到Rd中。Rd=Rn-operand2-(C!)SBC{cond}{S}Rd,Rn,operand2應(yīng)用示例(使用SBC實(shí)現(xiàn)64位減法,結(jié)果存于R1、R0中):

SUBSR0,R0,R2 ;低32位相減,并影響標(biāo)志位

SBCR1,R1,R3

;高32位相減,并減去低位借位ARM數(shù)據(jù)處理指令——算術(shù)運(yùn)算助記符說明操作條件碼位置ADDRd,Rn,operARM數(shù)據(jù)處理指令——比較指令

比較指令——CMP指令將寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:CMP{cond} Rn,operand2

應(yīng)用示例:

CMP R1,#10

;R1與10比較,設(shè)置相關(guān)標(biāo)志位注意:CMP指令與SUBS指令的區(qū)別在于CMP指令不保存運(yùn)算結(jié)果。在進(jìn)行兩個(gè)數(shù)據(jù)的大小判斷時(shí),常用CMP指令及相應(yīng)的條件碼來操作。助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負(fù)數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測(cè)試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測(cè)試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}ARM數(shù)據(jù)處理指令——比較指令比較指令——C2023/1/7ARM匯編語言程序?qū)嵗?/p>

例:編寫一具有完整匯編格式的程序,實(shí)現(xiàn)冒泡法排序功能。設(shè)無符號(hào)字?jǐn)?shù)據(jù)存放在從0x400004開始的區(qū)域,字?jǐn)?shù)據(jù)的數(shù)目字存放在0x400000中。AREASORT,CODE,READONLY ENTRYSTART

MOVR0,#0x400000

MOV R1,[R0]LOOP SUBS R1,R1,#1 BEQ EXIT MOV R7,R1 LDR R0,=0x400004LOOP1 LDR R2,[R0],#4 LDR R3,[R0] CMP R2,R3

STRLOR3,[R0,#-4] STRLOR2,[R0] SUBSR7,R7,#1 BNE LOOP1 B LOOPEXIT END2023/1/7ARM匯編語言程序?qū)嵗?STRLOR3搭建Linux交叉編譯開發(fā)環(huán)境搭建Linux交叉編譯開發(fā)環(huán)境vim沒有菜單,只有命令vim有三種基本工作模式,分別是:命令模式(commandmode)插入模式(insertmode)底行模式(lastlinemode)VIM的使用:vim沒有菜單,只有命令VIM的使用:三種工作模式CommandMode主要功能:移動(dòng)鼠標(biāo)或編輯文字LastLineMode主要功能:搜索或替換、存保存及結(jié)束InsertMode主要功能:輸入文字按a/A、i/I、o/O鍵按:鍵命令錯(cuò)誤或按Esc鍵執(zhí)行vi命令回到終端按q、q!、wq鍵按Esc鍵三種工作模式CommandMode主要功能:移動(dòng)鼠標(biāo)或編輯gcc編譯器GNUCC(簡(jiǎn)稱為gcc)是GNU項(xiàng)目中符合ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng),gcc不僅功能強(qiáng)大,而且可以編譯如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多種語言,而且gcc又是一個(gè)交叉平臺(tái)編譯器,它能夠在當(dāng)前CPU平臺(tái)上為多種不同體系結(jié)構(gòu)的硬件平臺(tái)開發(fā)軟件,因此尤其適合在嵌入式領(lǐng)域的開發(fā)編譯。gcc編譯器GNUCC(簡(jiǎn)稱為gcc)是GNU項(xiàng)目中符合gcc編譯過程Gcc的編譯流程分為了4個(gè)步驟,分別為:·預(yù)處理(Pre-Processing);·編譯(Compiling);·匯編(Assembling);·鏈接(Linking)。gcc編譯過程Gcc的編譯流程分為了4個(gè)步驟,分別為:1.預(yù)處理階段預(yù)處理程序(Pre-processor)讀取C語言源文件,對(duì)其中以“#”開頭的指令(偽指令)和特殊符號(hào)進(jìn)行處理。偽指令主要包括文件包含、宏定義和條件編譯指令。2.編譯階段編譯程序(Compiler)對(duì)預(yù)處理之后的輸出文件進(jìn)行詞法分析和語法分析,試圖找出所有不符合語法規(guī)則的部分。在確定各成分都符合語法規(guī)則后,將其“翻譯”為功能等價(jià)的中間代碼表示或者匯編代碼。3.匯編過程匯編程序(Assembler)把匯編語言代碼翻譯成目標(biāo)機(jī)器代碼的過程。4.連接階段將一個(gè)文件中引用的符號(hào)(如變量或函數(shù)調(diào)用)與該符號(hào)在另外一個(gè)文件中的定義連接起來,從而使有關(guān)的目標(biāo)文件連成一個(gè)整體,最終成為可被操作系統(tǒng)執(zhí)行的可執(zhí)行文件。連接模式分為靜態(tài)連接和動(dòng)態(tài)連接。

1.預(yù)處理階段理解下列Makefile文件: #一個(gè)簡(jiǎn)單的Makefile的例子 #以#開頭的為注釋行 test:prog.ocode.o gccprog.ocode.o–otest

prog.o:prog.cprog.hcode.h gcc–cprog.c–oprog.o

code.o:code.ccode.h gcc–ccode.c–ocode.o

clean: @echo"cleanningproject" rmmain*.o @echo"cleancompleted"理解下列Makefile文件:BootLoader介紹在嵌入式系統(tǒng)中,通常沒有像BIOS那樣的固件程序,因此整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)就完全由BootLoader來完成。Bootloader(引導(dǎo)加載程序)是嵌入式系統(tǒng)上電后運(yùn)行的第一段軟件代碼。通過它,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),完成由硬件啟動(dòng)到操作系統(tǒng)啟動(dòng)的過渡,從而為操作系統(tǒng)提供基本的運(yùn)行環(huán)境,以便為操作系統(tǒng)內(nèi)核運(yùn)行準(zhǔn)備好正確的環(huán)境.Bootloader的主要運(yùn)行任務(wù)是硬件初始化,將Linux內(nèi)核鏡像從硬盤Flash讀到RAM中,然后跳轉(zhuǎn)到Linux內(nèi)核的入口點(diǎn)去運(yùn)行,從而啟動(dòng)Linux系統(tǒng)。BootLoader介紹在嵌入式系統(tǒng)中,通常沒有像BIOSBootLoader介紹BootLoader非通用性:

每種不同的CPU體系結(jié)構(gòu)都有不同的BootLoader。有些BootLoader也支持多種體系結(jié)構(gòu)的CPU,比如U-Boot就同時(shí)支持ARM體系結(jié)構(gòu)和MIPS體系結(jié)構(gòu)。除了依賴于CPU的體系結(jié)構(gòu)外,BootLoader實(shí)際上也依賴于具體的嵌入式板級(jí)設(shè)備的配置。這也就是說,對(duì)于兩塊不同的嵌入式板而言,即使它們是基于同一種CPU而構(gòu)建的,要想讓運(yùn)行在一塊板子上的BootLoader程序也能運(yùn)行在另一塊板子上,通常也都需要修改BootLoader的源程序。BootLoader介紹BootLoader非通用性:BootLoader的兩種類型BootLoader的啟動(dòng)過程有兩種類型:?jiǎn)坞A段(SingleStage):一些只需完成很簡(jiǎn)單功能的bootloader可能是單階段的多階段(Multi-Stage):

通常多階段的BootLoader能提供更為復(fù)雜的功能,以及更好的可移植性。從固態(tài)存儲(chǔ)設(shè)備(Flash)上啟動(dòng)的BootLoader大多都是2階段的啟動(dòng)過程,也即啟動(dòng)過程可以分為stage1和stage2兩部分:(1)Stage1--依賴于處理器體系結(jié)構(gòu)和板級(jí)初始化的代碼,需要短小精悍,通常用匯編語言編寫;(2)Stage2--通常用C語言來實(shí)現(xiàn),以便于實(shí)現(xiàn)更復(fù)雜的功能以及取得更好的代碼可讀性和可移植性。但是與普通C語言應(yīng)用程序不同的是,在編譯和鏈接Bootloader程序時(shí),不能使用glibc庫中的任何支持函數(shù)。BootLoader的兩種類型BootLoader的啟動(dòng)Uboot的作用Uboot的作用uboot相關(guān)命令printenv打印環(huán)境變量usage:

printenv

-printvaluesofallenvironmentvariables

printenvname...

-printvalueofenvironmentvariable'name'Uboot>printenv

baudrate=115200

ipaddr=

ethaddr=12:34:56:78:9A:BC

serverip=Uboot>printenvipaddripaddr=

uboot相關(guān)命令printenv打印環(huán)境變量環(huán)境變量相關(guān)命令setenv添加、修改、刪除環(huán)境變量setenvnamevalue...

-setenvironmentvariable'name'to'value...‘setenvname

-deleteenvironmentvariable'name‘添加例子:

Uboot>setenvmyboardAT91RM9200DK

Uboot>printenvmyboard myboard=AT91RM9200DK修改例子:

Uboot>setenvipaddr4Uboot>setenvserverip8刪除例子:

Uboot>setenvmyboard環(huán)境變量相關(guān)命令setenv添加、修改、刪除環(huán)境變量環(huán)境變量相關(guān)命令setenv命令的使用實(shí)例:>setenvserverip>setenvipaddr00>setenvrootpath“/usr/local/arm/3.3.2/rootfs”>setenvbootargs“root=/dev/nfsrwnfsroot=\$(serverip):\$(rootpath)ip=\$(ipaddr)”>setenvkernel_addr30000000>setenvnfscmd“tftp\$(kernel_addr)uImage;bootm\$(kernel_addr)”>runnfscmd

上面定義的環(huán)境變量有serverip、ipaddr、rootpath、bootargs、kernel_addr。環(huán)境變量bootargs中還調(diào)用了環(huán)境變量,bootargs環(huán)境變量定義了命令行參數(shù),通過bootm命令傳遞給內(nèi)核。環(huán)境變量nfscmd通過tftp協(xié)議把uImage下載到指定的地址并且引導(dǎo)起來。最后,通過run命令來執(zhí)行nfscmd腳本。環(huán)境變量相關(guān)命令setenv命令的使用實(shí)例:環(huán)境變量相關(guān)命令saveenv保存變量 設(shè)置好的環(huán)境變量只是保持在內(nèi)存(斷點(diǎn)消失)中,所以需要通過saveenv命令保存至Flash中。我們經(jīng)常要設(shè)置的環(huán)境變量有ipaddr,serverip,bootcmd,bootargs。環(huán)境變量相關(guān)命令saveenv保存變量Linux內(nèi)核結(jié)構(gòu)Linux內(nèi)核組成 Linux內(nèi)核主要由五個(gè)子系統(tǒng)組成:進(jìn)程調(diào)度,內(nèi)存管理,虛擬文件系統(tǒng),網(wǎng)絡(luò)接口,進(jìn)程間通信。Linux內(nèi)核結(jié)構(gòu)Linux內(nèi)核組成Linux內(nèi)核結(jié)構(gòu)

進(jìn)程調(diào)度(SCHED) 控制進(jìn)程對(duì)CPU的訪問。當(dāng)需要選擇下一個(gè)進(jìn)程運(yùn)行時(shí),由調(diào)度程序選擇最值得運(yùn)行的進(jìn)程??蛇\(yùn)行進(jìn)程實(shí)際上是僅等待CPU資源的進(jìn)程,如果某個(gè)進(jìn)程在等待其它資源,則該進(jìn)程是不可運(yùn)行進(jìn)程。

Linux使用了比較簡(jiǎn)單的基于優(yōu)先級(jí)的進(jìn)程調(diào)度算法來選擇運(yùn)行新的進(jìn)程。Linux內(nèi)核結(jié)構(gòu)

進(jìn)程調(diào)度(SCHED)Linux內(nèi)核結(jié)構(gòu)

(2)內(nèi)存管理(MM) Linux允許多個(gè)進(jìn)程安全的共享主內(nèi)存區(qū)域。它的內(nèi)存管理支持虛擬內(nèi)存,即在計(jì)算機(jī)中運(yùn)行的程序,其代碼、數(shù)據(jù)、堆棧的總量可以超過實(shí)際內(nèi)存的大小,操作系統(tǒng)只是把當(dāng)前使用的程序塊保留在內(nèi)存中,其余的程序塊則保留在磁盤中。內(nèi)存管理從邏輯上分為硬件無關(guān)部分和硬件有關(guān)部分。硬件無關(guān)部分提供了進(jìn)程的映射和邏輯內(nèi)存的對(duì)換;硬件相關(guān)部分為內(nèi)存管理硬件提供了虛擬接口。Linux內(nèi)核結(jié)構(gòu)

(2)內(nèi)存管理(MM)Linux內(nèi)核結(jié)構(gòu)

(3)虛擬文件系統(tǒng)(VirtualFileSystem,VFS) 虛擬文件系統(tǒng)隱藏了各種硬件的具體細(xì)節(jié),為所有的設(shè)備提供了統(tǒng)一的接口,VFS提供了多達(dá)數(shù)十種不同的文件系統(tǒng)。虛擬文件系統(tǒng)可以分為邏輯文件系統(tǒng)和設(shè)備驅(qū)動(dòng)程序。邏輯文件系統(tǒng)指Linux所支持的文件系統(tǒng),如ext2、Cramfs、yaffs2等;設(shè)備驅(qū)動(dòng)程序指為每一種硬件控制器所編寫的設(shè)備驅(qū)動(dòng)程序模塊。Linux內(nèi)核結(jié)構(gòu)

(3)虛擬文件系統(tǒng)(VirtualFLinux內(nèi)核結(jié)構(gòu)

(4)網(wǎng)絡(luò)接口(NET) 提供了對(duì)各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持。網(wǎng)絡(luò)接口可分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動(dòng)程序。網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實(shí)現(xiàn)每一種可能的網(wǎng)絡(luò)傳輸協(xié)議。網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)與硬件設(shè)備通訊,每一種可能的硬件設(shè)備都有相應(yīng)的設(shè)備驅(qū)動(dòng)程序。Linux內(nèi)核結(jié)構(gòu)

(4)網(wǎng)絡(luò)接口(NET)Linux內(nèi)核結(jié)構(gòu)

(5)進(jìn)程間通信(IPC) 進(jìn)程間通信支持進(jìn)程間各種通信機(jī)制。典型的包括:信號(hào)量,管道,消息。進(jìn)程調(diào)度子系統(tǒng)處于中心位置,所有其它的子系統(tǒng)都依賴它,因?yàn)槊總€(gè)子系統(tǒng)都需要掛起或恢復(fù)進(jìn)程。一般情況下,當(dāng)一個(gè)進(jìn)程等待硬件操作完成時(shí),它被掛起;當(dāng)操作真正完成時(shí),進(jìn)程被恢復(fù)執(zhí)行。 例如,當(dāng)一個(gè)進(jìn)程通過網(wǎng)絡(luò)發(fā)送消息時(shí),網(wǎng)絡(luò)接口需要掛起發(fā)送進(jìn)程,直到硬件成功地完成消息的發(fā)送;當(dāng)消息被成功的發(fā)送出去以后,網(wǎng)絡(luò)接口給進(jìn)程返回一個(gè)代碼,表示操作的成功或失敗。其他子系統(tǒng)以相似的理由依賴于進(jìn)程調(diào)度。

Linux內(nèi)核結(jié)構(gòu)

(5)進(jìn)程間通信(IPC)Linux2.6內(nèi)核特點(diǎn)Linux2.6內(nèi)核在模塊子系統(tǒng)(ModuleSubsystem)、統(tǒng)一設(shè)備模型(UnifiedDeviceModel)和即插即用支持模塊子系統(tǒng)(PnP,plugandplay)方面有重大改變。(1)、穩(wěn)定性有所提高。內(nèi)核加載和導(dǎo)出內(nèi)核模塊的過程得到改進(jìn),降低了加載或卸載模塊的同時(shí)使用該模塊的可能性(這時(shí)會(huì)導(dǎo)致系統(tǒng)崩潰)。(2)、內(nèi)核統(tǒng)一設(shè)備模型的創(chuàng)建。它促進(jìn)了模塊接口的標(biāo)準(zhǔn)化,更好的控制和管理設(shè)備,例如更準(zhǔn)確地確定系統(tǒng)設(shè)備、電源設(shè)備和設(shè)備電源狀態(tài)。改進(jìn)了系統(tǒng)總線結(jié)構(gòu)管理,Linux2.6內(nèi)核成為一個(gè)真正即插即用的OS。Linux2.6內(nèi)核特點(diǎn)Linux2.6內(nèi)核特點(diǎn):(3)、使用新的調(diào)度器算法。新的調(diào)度器基于每個(gè)CPU來分布時(shí)間片,消除了全局同步和重新分配循環(huán),從而提高了性能。Linux2.6內(nèi)核是搶占式的,顯著提高交互式和多媒體應(yīng)用程序的性能。I/O子系統(tǒng)也發(fā)生了重大變化,通過修改I/O調(diào)度器來確保不會(huì)有進(jìn)程駐留在隊(duì)列中過長(zhǎng)時(shí)間等待進(jìn)行輸入/輸出操作,這樣就使得I/O操作響應(yīng)更迅速。(4)、其他改進(jìn):Linux2.6內(nèi)核支持的CPU數(shù)目更多、支持更多設(shè)備、支持文件系統(tǒng)的性能也有所改進(jìn)。Linux2.6內(nèi)核特點(diǎn):2023/1/7Linux在傳統(tǒng)的邏輯文件系統(tǒng)的基礎(chǔ)上,增加了一個(gè)稱為虛擬文件系統(tǒng)(VFS)的接口層,如圖所示。2023/1/7Linux在傳統(tǒng)的邏輯文件系統(tǒng)2023/1/7

虛擬文件系統(tǒng)在最上層,管理各種邏輯文件系統(tǒng),屏蔽了它們之間的差異,為用戶命令、函數(shù)調(diào)用和內(nèi)核其他部分提供訪問文件和設(shè)備的統(tǒng)一接口,使得不同的邏輯文件系統(tǒng)按照同樣的模式呈現(xiàn)在使用者面前,對(duì)于普通用戶來講,覺察不到邏輯文件系統(tǒng)之間的差異,可以使用同樣的命令來操作不同邏輯文件系統(tǒng)所管理的文件,可以在它們之間自由地復(fù)制文件。

202

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論