国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】

這篇具有很好參考價(jià)值的文章主要介紹了第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

2023-7-3 14:28:36

以下內(nèi)容源自《【嵌入式系統(tǒng)】》
僅供學(xué)習(xí)交流使用

推薦

第二章 ARM 技術(shù)及體系結(jié)構(gòu)

2.1 嵌入式 ARM 處理器概況

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)
第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

2.1.1 ARM 體系的版本說明

2.1.2 ARM 內(nèi)核的命名

2.1.3 常用 ARM 處理器系列介紹

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

ARM7 系列處理器包括 4 種類型的核:ARM7TDMI、ARM7TDMI-S、ARM720T 和
ARM7EJ,其中 ARM7TDMI 是目前應(yīng)用最廣泛的 32 位嵌入式 RISC 處理器,ARM7 系列采
用 ARMv4T 體系結(jié)構(gòu),基于馮*諾依曼結(jié)構(gòu),能夠提供 0.9MIPS/MHz 的速度,具有三級(jí)流
水線功能,主要的應(yīng)用在工業(yè)控制、Internet 設(shè)備、網(wǎng)絡(luò)和調(diào)制器設(shè)備、移動(dòng)通信等以及嵌
入式應(yīng)用,同時(shí)由于功耗很低,適合用于對(duì)功耗要求較高的應(yīng)用,如便攜式產(chǎn)品。

ARM7 處理器特點(diǎn),是提供 16 位壓縮的 Thumb 指令集、嵌入式 ICE-RT 邏輯、JTAG
軟件調(diào)試方式,適用于大規(guī)模的 SOC 設(shè)計(jì),其中 ARM720T 還提供 8KB 的高速緩存和存儲(chǔ)
器管理功能部件,可以支持 Linux 和 Windows CE 等操作系統(tǒng)。

2.2 ARM 處理器技術(shù)

2.2.1 ARM處理器的RISC特征

CISC 結(jié)構(gòu)存在如下一些問題
(1)在 CISC 結(jié)構(gòu)的指令系統(tǒng)中,各種指令的使用頻率相差懸殊。椐統(tǒng)計(jì)約有 20%
的指令使用頻率最大,占運(yùn)行時(shí)間的 80%。也就是說,有 80%的指令只在 20%的運(yùn)行時(shí)
間內(nèi)才會(huì)用到。
(2)CISC 結(jié)構(gòu)指令系統(tǒng)的復(fù)雜性帶來了計(jì)算機(jī)體系結(jié)構(gòu)的復(fù)雜性,這不僅增加了研
制時(shí)間和成本,而且還容易造成設(shè)計(jì)錯(cuò)誤。另外,CISC 結(jié)構(gòu)指令系統(tǒng)的復(fù)雜性還給 VLSI
設(shè)計(jì)帶來了很大負(fù)擔(dān),不利于單片集成,而且許多復(fù)雜指令需要很復(fù)雜的操作,因而運(yùn)
行速度慢。
(3)在 CISC 結(jié)構(gòu)的指令系統(tǒng)中,由于各條指令的功能不均衡性,不利于采用先進(jìn)的
計(jì)算機(jī)體系結(jié)構(gòu)技術(shù)(如流水技術(shù))來提高系統(tǒng)的性能。
針對(duì)這些缺點(diǎn),提出了RISC 的結(jié)構(gòu)特點(diǎn)
(1) 簡(jiǎn)化指令集,只保留常用的基本指令;
(2) 設(shè)計(jì)大量的通用存儲(chǔ)器,減少訪存的次數(shù);
(3) 采用裝載/保存(load-store)結(jié)構(gòu),支持流水線技術(shù),使每個(gè)周期時(shí)間相等;
(4) 采用簡(jiǎn)單的指令格式、規(guī)整的指令字長(zhǎng)和簡(jiǎn)單的尋址方式。
(5) 單機(jī)器周期指令,即大多數(shù)的指令都可以在一個(gè)機(jī)器周期內(nèi)完成,并且允
許處理器在同一時(shí)間內(nèi)執(zhí)行一系列的指令。

RISC 技術(shù)的主要特點(diǎn)是 CPU 的指令集大大簡(jiǎn)化,并且關(guān)注如何用簡(jiǎn)單的指令來提
高機(jī)器的性能,特別是提高運(yùn)行速度。一般來說,CPU 的平均指令執(zhí)行速度受三個(gè)因素
的影響,即程序中的指令數(shù) IN、每條指令執(zhí)行所需的機(jī)器周期數(shù) CPI 和每個(gè)機(jī)器周期的
時(shí)間 TC,它們之間的關(guān)系如下:
程序的執(zhí)行時(shí)間=IN×CPI×TC

ARM 處理器采用了 RISC 技術(shù),為了使 ARM 能夠更好地滿足嵌入式應(yīng)用的需要,ARM 體系結(jié)構(gòu)還增加了以下功能:

  • 每條數(shù)據(jù)處理指令可同時(shí)包含算術(shù)邏輯單元(ALU)的運(yùn)算和移位處理,實(shí)現(xiàn)ALU 和移位器的最大利用;
  • 使用地址自增和自減的尋址方式優(yōu)化程序循環(huán);
  • 裝載/保存指令對(duì)數(shù)據(jù)的批量傳輸,實(shí)現(xiàn)最大數(shù)據(jù)吞吐量;
  • 大多數(shù)指令提供條件執(zhí)行,實(shí)現(xiàn)最快速的代碼執(zhí)行。

2.2.2 流水線

在 ARM 處理器中不同系列的 CPU 采用的流水線深度不同,如圖 2.2 所示,ARM7
采用三級(jí)流水線、ARM9 采用五級(jí)流水線,ARM10 采用六級(jí)流水線、ARM11 采用八級(jí)
流水線。
第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

在 ARM 處理器中將 PC 程序計(jì)數(shù)器定義到 R15 寄存器,無論處理器處于何種狀態(tài), PC 總是指向“正在取指”指令的地址。

2.2.3 哈佛結(jié)構(gòu)

哈佛結(jié)構(gòu)是一種將程序中的指令和數(shù)據(jù)分開存儲(chǔ)的存儲(chǔ)器結(jié)構(gòu)。

馮·諾伊曼結(jié)構(gòu)也稱普林斯頓結(jié)構(gòu),是一種將程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器合并在一起的存儲(chǔ)器結(jié)構(gòu)。

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

2.3 ARM7 處理器結(jié)構(gòu)

2.4 ARM7TDMI 的工作狀態(tài)及模式

2.4.1 ARM 處理器的工作狀態(tài)

ARM7TDMI 處理器內(nèi)核包含 2 套指令系統(tǒng),分別為 ARM 指令集和 Thumb 指令集,
并且各自對(duì)應(yīng) 1 種處理器的狀態(tài),即 ARM 狀態(tài)和 Thumb 狀態(tài),這兩種狀態(tài)由程序狀態(tài)字
CPSR 中 T 標(biāo)志位確定,為 0 時(shí)處理器工作在 ARM 狀態(tài),為 1 時(shí)處理器工作在 Thumb 狀態(tài),
兩種狀態(tài)的特點(diǎn)是:

  • ARM 狀態(tài):處理器執(zhí)行 32 位字對(duì)齊方式的 ARM 指令,每條 ARM 指令長(zhǎng)度為 32
    位,指令的功能強(qiáng)大,處理器默認(rèn)為此狀態(tài);
  • Thumb 狀態(tài):處理器執(zhí)行 16 位半字對(duì)齊方式的 Thumb 指令。每條 Thumb 指令長(zhǎng)
    度為 16 位,是 ARM 指令功能的子集。

由于 Thumb 指令壓縮了 ARM 指令的功能,使其指令長(zhǎng)度縮短到 16 位,節(jié)省了程序
的存儲(chǔ)空間,但也存在有些功能使用 ARM 指令編程要比使用 Thumb 指令編程,節(jié)約更多
的指令條數(shù)。這樣就增加了程序的執(zhí)行時(shí)間,因此在嵌入式應(yīng)用中,如果要加快程序的執(zhí)行
速度,一般采用 ARM 指令編程,如果要節(jié)省存儲(chǔ)器資源,可以采用 Thumb 指令編程
。

在程序的執(zhí)行過程中,處理器只能處于一種狀態(tài),也就是說 ARM 指令與 Thumb 指令
不能同時(shí)混合使用,但是,ARM 處理器可以隨時(shí)在兩種工作狀態(tài)之間切換,處理器在切換
過程中,不會(huì)影響處理器工作模式和相應(yīng)寄存器中的內(nèi)容。處理器的狀態(tài)切換一般采用 BX
指令實(shí)現(xiàn)。見程序舉例【例 2-1】。
【例 2-1】

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

ARM 狀態(tài)和 Thumb 狀態(tài)切換時(shí),使用帶狀態(tài)切換的轉(zhuǎn)移指令 BX,BX 為寄存器尋址
方式,寄存器的內(nèi)容是要轉(zhuǎn)移的地址,由于指令是字對(duì)齊或半字對(duì)齊存放,因此地址的最低
位沒有使用,BX 指令就利用地址的最低位的值來修改程序狀態(tài)字 CPSR 中的 T 標(biāo)志。以實(shí)
現(xiàn)處理器狀態(tài)的切換
。

處理器開機(jī)或進(jìn)入到異常模式,其工作狀態(tài)默認(rèn)為 ARM 狀態(tài),通過 BX 指令可以切換
到 Thumb 狀態(tài)。處理器不論工作在哪一種狀態(tài)下,都不會(huì)影響異常事件的發(fā)生,在 ARM
處理器中有備份程序狀態(tài)字 SPSR 保存異常發(fā)生前的 CPSR 值,當(dāng)異常退出時(shí)通過 SPSR 值,
就可以恢復(fù)異常前處理器的工作狀態(tài)。

2.4.2 ARM 處理器模式

ARM 處理器共支持 7 種處理器模式,分別為:

  • 用戶模式(usr):ARM 處理器正常的程序執(zhí)行狀態(tài);
  • 快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理;
  • 外部中斷模式(irq):用于通用的中斷處理;
  • 管理模式(svc):操作系統(tǒng)使用的保護(hù)模式;
  • 數(shù)據(jù)訪問終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)
    及存儲(chǔ)保護(hù);
  • 系統(tǒng)模式(sys):運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù);
  • 未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬
    件協(xié)處理器的軟件仿真。

除用戶模式外,其它的 6 種模式稱為特權(quán)模式(Privileged Modes)。ARM 內(nèi)部寄存器
和一些片內(nèi)外設(shè)在硬件設(shè)計(jì)上只允許特權(quán)模式下訪問。此外,特權(quán)模式可以自由的切換處理
器模式,而用戶模式不能直接切換到別的模式。
在特權(quán)模式中,除去系統(tǒng)模式以外的 5 種又稱為異常模式(Exception Modes),它們除
了可以通過程序切換進(jìn)入外,也可以由特定的異常進(jìn)入。當(dāng)特定的異常出現(xiàn)時(shí),處理器進(jìn)入
相應(yīng)的模式。每種異常模式都有一些獨(dú)立的寄存器,以避免異常退出時(shí)用戶模式的狀態(tài)不可
靠。如表 2-3 所示。

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

ARM 處理器中的 7 中模式,是以當(dāng)前程序狀態(tài)寄存器 CPSR 中控制位 M[4:0]來標(biāo)志,
在特權(quán)模式下通過修改 M[4:0]值,就可以改變處理器的運(yùn)行模式。

2.5 ARM7 內(nèi)部寄存器

ARM7 微處理器共有 37 個(gè) 32 位寄存器,其中 31 個(gè)為通用寄存器,6 個(gè)為狀態(tài)寄存器。
但是這些寄存器不能被同時(shí)訪問,具體哪些寄存器是可訪問的,取決微處理器的工作狀態(tài)及
具體的運(yùn)行模式。37 個(gè)寄存器定義如下:

  • 31 個(gè)通用寄存器:R0~R15、R8_fiq 、R9_fiq、R10_fiq、R11_fiq、R12_fiq、R13_svc、
    R13_irq、R13_fiq、R13_abt、R13_und、R14_svc、R14_irq、R14_fiq、R14_abt、
    R14_und。
  • 6 為狀態(tài)寄存器,其中 ARM7 的 6 個(gè)狀態(tài)寄存器只使用了 12 位,分別為:CPSR、
    SPSR_svc、SPSR _irq、SPSR _fiq、SPSR _abt、SPSR _und。
    ARM 處理器共有 7 種不同的處理器模式,每種模式都有一組相應(yīng)的寄存器組,其中用
    戶模式和系統(tǒng)模式使用同一組寄存器。

2.5.1 ARM 狀態(tài)下的寄存器組織

在 ARM 狀態(tài)下,程序設(shè)計(jì)人員能夠訪問的寄存器如表 2-4 所示,但是究竟那些寄存器
對(duì)程序員來說當(dāng)前是可用的,則完全取決于當(dāng)前處理器的運(yùn)行模式,因此,在不同的運(yùn)行模
式下,程序員實(shí)際能訪問寄存器的權(quán)限是不一樣的。

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

在 ARM 狀態(tài)中,R0~ R15 稱為通用寄存器,其中,R0~ R7 是不分組的寄存器;R8~ R14
是根據(jù)運(yùn)行模式進(jìn)行分組的寄存器;R15 是程序計(jì)數(shù)器,也是不分組的。

  1. 一般通用寄存器
    R0~R7 是未分組的通用寄存器,他們未被系統(tǒng)用作特殊的用途,一般用于保存數(shù)據(jù)或
    地址值。處理器運(yùn)行在任何模式下,R0~R7 寄存器都指向同一個(gè)物理寄存器,因此,在中
    斷或異常處理進(jìn)行模式轉(zhuǎn)換時(shí),由于不同的模式使用相同的物理寄存器,可能會(huì)造成寄存器
    中數(shù)據(jù)的破壞,在程序設(shè)計(jì)時(shí)應(yīng)注意保護(hù)現(xiàn)場(chǎng)。

    R8~R14 寄存器按照不同的處理器運(yùn)行模式進(jìn)行分組,在任何一個(gè)運(yùn)行模式下都有自
    己對(duì)于 R8~R14 的一組 32 位的物理寄存器。其中寄存器 R8~R12 只有 2 組不同的物理寄
    存器,一組是專為快速中斷 FIQ 模式設(shè)計(jì)的 R8_fiq~R12_fiq 寄存器,另一組是其余 6 種模
    式共同使用的 R8~R12。因此在進(jìn)入到 FIQ 模式后,就不必要為保護(hù) R8~R12 寄存器而浪
    費(fèi)時(shí)間。程序就可以直接使用 R8_fiq~R12_fiq 寄存器進(jìn)行操作,從而實(shí)現(xiàn)了快速的中斷處
    理。

    R13 和 R14 寄存器分別有 6 個(gè)不同的 32 位物理寄存器,其中用戶模式和系統(tǒng)模式共有
    一組,其余的 5 個(gè)異常模式分別使用一組。

  2. 堆棧指針寄存器 SP
    堆棧是在內(nèi)存中劃出一段存儲(chǔ)空間,用于暫時(shí)保存一些數(shù)據(jù),堆棧操作通常會(huì)發(fā)生在子
    程序調(diào)用、異常發(fā)生或者是程序運(yùn)行過程中寄存器數(shù)量不夠時(shí),堆棧操作的規(guī)則是先進(jìn)后出
    (或稱為后入先出),使用一個(gè)指針 SP,來指定數(shù)據(jù)在內(nèi)存中的地址,堆棧操作分為“入?!?br> 和“出?!?,入棧是往堆棧中寫入數(shù)據(jù),就是按照 SP 的值確定將數(shù)據(jù)寫入到內(nèi)存中對(duì)應(yīng)的
    存儲(chǔ)單元,每寫入一個(gè)數(shù)據(jù)堆棧的剩余空間就減少一個(gè),同時(shí)對(duì)堆棧指針 SP 進(jìn)行修改;出
    棧是相反的操作,是從堆棧中取走數(shù)據(jù),就是按照 SP 的值將內(nèi)存中對(duì)應(yīng)存儲(chǔ)中的數(shù)據(jù)取走,
    每取走一個(gè)數(shù)據(jù)堆棧的剩余空間就增加一個(gè),同時(shí)對(duì)堆棧指針(SP)進(jìn)行修改。堆棧實(shí)際
    是一段內(nèi)存空間,那么堆棧的出入口其實(shí)就是一個(gè)地址,在進(jìn)行堆棧操作時(shí)需要能夠非常方
    便地知道當(dāng)前的出入口在哪里,因此設(shè)計(jì)了堆棧指針(SP),始終指向當(dāng)前堆棧操作的出入
    口的地址。

    在 ARM 程序設(shè)計(jì)中通常用寄存器 R13 作為堆棧指針(SP),用于指定堆棧操作出入口
    的地址
    ,ARM 處理器一共有 6 個(gè)堆棧寄存器,分別是 R13、R13_svc、R13_irq、R13_fiq、
    R13_abt、R13_und,其中用戶模式和系統(tǒng)模式共用一個(gè),每種異常模式都有自己專用的 R13
    寄存器,它們通常指向各模式所對(duì)應(yīng)的專用堆棧,也就是說,ARM 處理器向程序設(shè)計(jì)者提
    供了 6 個(gè)不同的堆??臻g,提高了處理器的異常處理速度。這些堆棧指針分別是用戶和系統(tǒng)
    共用堆棧,指針 SP 是 R13;管理堆棧,指針 SP 是 R13_svc;中止堆棧,指針 SP 是 R13_abt;
    未定義堆棧,指針 SP 是 R13_und;中斷堆棧,指針 SP 是 R13_irq;快速中斷堆棧,指針 SP
    是 R13_fiq。

    ARM 處理器提供了 6 個(gè) 32 位的堆棧指針,而且堆棧的操作也非常靈活,根據(jù)堆棧指針
    的增減方向和指針指向存儲(chǔ)單元是否為空,可以提供 4 種不同的堆棧方式:滿遞增、空遞增、
    滿遞減、空遞減
    。在用戶應(yīng)用程序的初始化部分,一般都要初始化每種模式下的堆棧指針,
    使其指向該運(yùn)行模式的??臻g,這樣,當(dāng)程序的運(yùn)行進(jìn)入異常模式時(shí),可以將需要保護(hù)的寄
    存器壓入到堆棧指針?biāo)赶虻亩褩卧?,而?dāng)程序從異常模式返回時(shí),則從對(duì)應(yīng)的堆棧中恢
    復(fù),采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行。

  3. 連接寄存器 LR
    在 ARM 處理器中 R14 寄存器可以作為通用寄存器使用之外,主要用作連接寄存器(LR:
    Link Register),連接寄存器用于保存子程序返回地址或者異常處理程序的返回地址
    ,LR 寄
    存器一共有 6 個(gè),其中子程序的返回地址使用一個(gè) R14,每種異常模式各自有一個(gè)專用的
    LR 寄存器用于保存異常處理程序的返回地址,它們分別為 R14_svc、R14_irq、R14_fiq、
    R14_abt、R14_und。LR 的保存過程如下:

    ① 對(duì)子程序返回地址保存
    在 ARM 指令集或者 Thumb 指令集中,分支指令 BL 具有保存斷點(diǎn)的功能,就是說在程
    序轉(zhuǎn)移之前,將程序計(jì)數(shù)器 PC 的內(nèi)容自動(dòng)保存到鏈接寄存器 LR 中,當(dāng)使用 BL 指令調(diào)用
    子程序時(shí),返回地址將自動(dòng)存入到 R14 中,在子程序結(jié)束時(shí),將 R14 的內(nèi)容復(fù)制到 PC 中,
    即可實(shí)現(xiàn)子程序的返回。通常實(shí)現(xiàn)子程序的調(diào)用過程有 2 種情況。

    一種是子程序中不會(huì)嵌套子程序,那么就不需要將 R14 的內(nèi)容保護(hù),可以直接將 R14
    的內(nèi)容送給 PC,實(shí)現(xiàn)程序的跳轉(zhuǎn)。只要執(zhí)行下列的任何一條指令即可。
    MOV PC,LR
    BX LR

    另一種是子程序中嵌套子程序,那么就要對(duì) R14 寄存器和其他寄存器的內(nèi)容進(jìn)行保護(hù),
    一般在子程序的入口,使用“入?!辈僮髦噶顚⒁Wo(hù)的寄存器壓入堆棧,如下列的入棧操
    作指令:
    STMFD SP!,{< registers>,LR}

    在子程序結(jié)束時(shí),使用“出?!辈僮髦噶顚⒍褩V械膬?nèi)容彈出到對(duì)應(yīng)的寄存器,就可將
    返回地址從堆棧中復(fù)制到 PC 中,即可實(shí)現(xiàn)程序的返回。如下列的出棧操作指令:
    LDMFD SP!,{< registers>,PC}

    ② 對(duì)異常處理返回地址的保存
    在 ARM 處理器中有 5 種異常,異常事件的發(fā)生是隨機(jī)的,是可以相互嵌套的,為了加
    快處理速度,設(shè)計(jì)了 5 個(gè)專用寄存器存放異常處理程序的返回地址。當(dāng)異常發(fā)生時(shí),會(huì)自動(dòng)
    的保存程序計(jì)數(shù)器 PC 的內(nèi)容。保存操作如下:

    • 系統(tǒng)復(fù)位或者軟中斷發(fā)生時(shí),將當(dāng)前的 PC 復(fù)制到 R14_svc 寄存器中;
    • 存儲(chǔ)器非法訪問時(shí)發(fā)生的異常,將當(dāng)前的 PC 復(fù)制到 R14_abt 寄存器中;
    • 解碼器解碼后確認(rèn)是未定義指令時(shí)的異常,將當(dāng)前的 PC 復(fù)制到 R14_und 寄存器中;
    • IRQ 中斷發(fā)生時(shí),將當(dāng)前的 PC 復(fù)制到 R14_irq 寄存器中;
    • 快速中斷 FIQ 發(fā)生時(shí),將當(dāng)前的 PC 復(fù)制到 R14_fiq 寄存器中;
  4. 程序計(jì)數(shù)器 PC
    在 ARM 處理器中 R15 寄存器就是 CPU 中的程序計(jì)數(shù)器,R15 中的內(nèi)容總是指向正在
    “取指”指令的地址
    。由于 ARM 指令是字對(duì)齊的,R15 最低兩位 bit[1:0]總為 0,bit[31:2]
    用于保存 ARM 指令地址;而 Thumb 指令是半字對(duì)齊的,R15 最低位 bit0 總為 0,bit[31:1]
    用于保存 Thumb 指令地址;也就是說,在 ARM 狀態(tài)下,PC 值的最低兩位總是 0,在 Thumb
    狀態(tài)下,PC 值的最低位總是 0。在程序設(shè)計(jì)中,R15 雖然可以用作通用寄存器,但是有一
    些指令在使用 R15 時(shí)有一些特殊限制,若不注意,執(zhí)行的結(jié)果將是不可預(yù)料的。

    由于 ARM7 體系結(jié)構(gòu)采用了 3 級(jí)流水線技術(shù),對(duì)于 ARM 指令集而言,PC 總是指向當(dāng)
    前指令的下兩條指令的地址,PC 值一般為當(dāng)前指令地址值加 8 個(gè)字節(jié)。但使用 STR 或 STM
    指令保存 R15 時(shí),R15 保存的值可能是當(dāng)前指令地址加 8 字節(jié),或者是當(dāng)前指令地址加 12
    字節(jié)(或別的數(shù)據(jù)),偏移量究竟是 8 還是 12(或是其他數(shù))取決于 ARM 芯片的設(shè)計(jì)。對(duì)
    于某個(gè)具體的芯片,它是個(gè)常量。

    當(dāng)執(zhí)行一條寫 R15 的指令時(shí),寫入 R15 的值被當(dāng)成一個(gè)指令的地址,程序從這個(gè)地址
    處繼續(xù)執(zhí)行,因此執(zhí)行寫入 R15 的指令相當(dāng)于程序執(zhí)行一次跳轉(zhuǎn)。由于 ARM 指令是字對(duì)齊
    的,寫入 R15 值的最低兩位 bit[1:0]必須是 0b00,否則結(jié)果將不可預(yù)測(cè)。在 Thumb 指令集
    中,指令是半字對(duì)齊的,寫入 R15 地址值的最低位必須是 0,否則難于預(yù)測(cè)執(zhí)行結(jié)果。

  5. 狀態(tài)寄存器
    ARM7 中有一個(gè)當(dāng)前程序狀態(tài)寄存器 CPSR(Current Program Status Register),CPSR 可
    在任何運(yùn)行模式下被訪問,它包括條件標(biāo)志位、中斷禁止位、當(dāng)前處理器模式標(biāo)志位,以及
    其他一些相關(guān)的控制和狀態(tài)位。ARM 內(nèi)核就是通過使用 CPSR 來監(jiān)視和控制內(nèi)部操作的。

    每一種異常運(yùn)行模式都有一個(gè)專用的物理狀態(tài)寄存器,稱為備份程序狀態(tài)寄存器 SPSR
    (Saved Program Status Register),它們分別為 SPSR_svc、SPSR _irq、SPSR _fiq、SPSR _abt、SPSR _und。當(dāng)異常發(fā)生時(shí),SPSR 用于保存 CPSR 的當(dāng)前值,從異常退出時(shí)則可由 SPSR 來恢復(fù) CPSR。

    CPSR 與 SPSR 相互間的關(guān)系:

    • 當(dāng)一個(gè)特定的異常中斷發(fā)生時(shí),將 CPSR 的當(dāng)前值保持到相應(yīng)異常模式下的 SPSR
      寄存器中,然后設(shè)置 CPSR 為相應(yīng)的異常模式;
    • 從異常中斷程序退出返回時(shí),可通過保持在 SPSR 中的值來恢復(fù) CPSR 值。

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

2.5.2 Thumb 狀態(tài)下的寄存器組織

1. 各種模式下的寄存器
Thumb 狀態(tài)下的寄存器集是 ARM 狀態(tài)下寄存器集的一個(gè)子集,程序可以直接訪問:

  • 8 個(gè)通用寄存器(R0~R7);
  • 程序計(jì)數(shù)器 PC(R15);
  • 堆棧指針 SP(R13);
  • 連接寄存器 LR(R14)
  • 程序狀態(tài)寄存器 CPSR。

每種特權(quán)模式都有一組 SP、LR 和 SPSR。Thumb 狀態(tài)下的寄存器組織詳細(xì)情況見表 2-5。

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

在Thumb 指令集中,寄存器 R0~R7 是保護(hù)數(shù)據(jù)或地址值的通用寄存器,對(duì)應(yīng)任何處
理器模式,它們中的每一個(gè)都對(duì)應(yīng)于 32 位物理寄存器。是完全通用的寄存器,不會(huì)被處理
器作為特殊的用途,并且可用于任何使用通用寄存器的指令。
堆棧指針寄存器SP,與ARM狀態(tài)下的R13寄存器相同,Thumb指令集使用傳統(tǒng)的PUSH
和 POP 指令,實(shí)現(xiàn)堆棧操作,它們以“滿遞減堆?!钡姆绞絹韺?shí)現(xiàn),詳見 2.5.1 小節(jié)“堆棧
指針寄存器 SP”部分。
鏈接寄存器 LR,與 ARM 狀態(tài)下的 R14 寄存器相同,詳見 2.5.1 小節(jié)“連接寄存器 LR”
部分。
狀態(tài)寄存器 CPSR 和 SPSR 與 ARM 狀態(tài)下的狀態(tài)寄存器寄存器相同,使用方法相似,
詳見 2.5.1 小節(jié)“狀態(tài)寄存器”部分。

2. Thumb 狀態(tài)下寄存器與 ARM 狀態(tài)下寄存器的關(guān)系

  • Thumb 狀態(tài)下 R0~R7 和 ARM 狀態(tài)下的 R0~R7 是相同的。
  • Thumb 狀態(tài)下和 ARM 狀態(tài)下的 CPSR 和所有的 SPSR 是相同的。由于 Thumb
    指令集不包含 MSR 和 MRS 指令,如果用戶需要修改 CPSR 和 SPSR 的標(biāo)志位,
    可以使用 BX 指令切換到 ARM 狀態(tài),在 ARM 狀態(tài)下使用 MSR 和 MRS 指令進(jìn)
    行修改。
  • Thumb 狀態(tài)下的 SP 對(duì)應(yīng)于 ARM 狀態(tài)下的 R13。
  • Thumb 狀態(tài)下的 LR 對(duì)應(yīng)于 ARM 狀態(tài)下的 R14。
  • Thumb 狀態(tài)下的程序計(jì)數(shù)器 PC 對(duì)應(yīng)于 ARM 狀態(tài)下 R15

Thumb 狀態(tài)寄存器在 ARM 狀態(tài)下的映射應(yīng)關(guān)系如圖 2.15 所示

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)
在圖 2.15 中的 R0~R7 為低端寄存器,R8~R12 為高端寄存器,在 Thumb 狀態(tài)下,高
端寄存器是不能訪問。如果有異常中斷出現(xiàn),那么處理器就會(huì)自動(dòng)切換到 ARM 狀態(tài)去進(jìn)行
異常處理,當(dāng)異常處理完畢返回時(shí),處理器又會(huì)自動(dòng)切換返回到 Thumb 狀態(tài)。

2.5.3 程序狀態(tài)寄存器

ARM 處理器的程序狀態(tài)寄存器包含 1 個(gè)當(dāng)前程序狀態(tài)寄存器 CPSR 和 5 個(gè)僅供異常處
理程序使用的備份程序狀態(tài)寄存器SPSR。其中CPSR可以在任何處理器模式下被訪問,SPSR
是每一種異常模式下專用的寄存器,當(dāng)異常發(fā)生時(shí),這個(gè)寄存器保存 CPSR 的內(nèi)容,在異常
退出時(shí),可以用 SPSR 中保存的值來恢復(fù) CPSR,圖 2.16 給出了程序狀態(tài)寄存器 PSR 的基
本格式,具體含義如下:

  • 4 個(gè)條件代碼標(biāo)志(負(fù)標(biāo)志 N、零標(biāo)志 Z、進(jìn)位標(biāo)志 C 和溢出標(biāo)志 V );
  • 2 個(gè)中斷禁止位(IRQ 禁止與 FIQ 禁止);
  • 5 個(gè)對(duì)當(dāng)前處理器模式進(jìn)行編碼的位(M[4:0]);
  • 1 個(gè)用于指示當(dāng)前執(zhí)行指令的狀態(tài)位(ARM 指令還是 Thumb 指令)。

32 位的 PSR 分為四個(gè)域:控制域、擴(kuò)展域、狀態(tài)域和標(biāo)志域。
第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

  1. 標(biāo)志域(PSR[31:24])
    在 ARM7 中標(biāo)志域只使用了四位:N 標(biāo)志、Z 標(biāo)志、C 標(biāo)志和 V 標(biāo)志,它們都是條件
    代碼標(biāo)志,可以由算術(shù)或邏輯操作來設(shè)置這些位,這些標(biāo)志還可通過 MSR 和 LDM 指令進(jìn)
    行設(shè)置,ARM 處理器對(duì)這些位進(jìn)行測(cè)試以決定是否執(zhí)行一條指令,這樣就可以實(shí)現(xiàn)條件執(zhí)
    行。

    各標(biāo)志位的含義如下:

    • 負(fù)標(biāo)志 N:N的取值為當(dāng)前指令運(yùn)算結(jié)果的最高位 bit[31]的值,當(dāng) N=1 時(shí)表示運(yùn)算結(jié)果為負(fù)數(shù),當(dāng) N=0 時(shí)表示運(yùn)算結(jié)果為正數(shù)或零;
    • 零標(biāo)志 Z:Z=1 表示運(yùn)算結(jié)果是零,Z=0 表示運(yùn)算結(jié)果不為零;進(jìn)位或借位標(biāo)志 C:對(duì)于加法指令(包括比較指令 CMN),當(dāng)運(yùn)算結(jié)果產(chǎn)生進(jìn)位時(shí),則 C=1,其他情況,C=0;對(duì)于減法指令(包括比較指令 CMP),當(dāng)運(yùn)算結(jié)果產(chǎn)生借位時(shí),則 C=0,其他情況,C=1;
    • 溢出標(biāo)志 V:對(duì)于加減運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果按照補(bǔ)碼進(jìn)行運(yùn)算時(shí),如果運(yùn)算結(jié)果超出了規(guī)定的數(shù)據(jù)表示范圍,即產(chǎn)生了溢出時(shí),則 V=1,其他情況 V=0;

    在 ARM 狀態(tài)中,所有指令都可按條件執(zhí)行,在 Thumb 狀態(tài)中,只有分支指令可條件
    執(zhí)行。

  2. 狀態(tài)域(PSR[23:16])
    ARM7 版本中未使用。

  3. 擴(kuò)展域(PSR[15:8])
    ARM7 版本中未使用。

  4. 控制域(PSR[7:0])
    PSR 的最低 8 位為控制位,它們分別是:

    • 中斷禁止標(biāo)志位;
    • 處理器狀態(tài)位;
    • 處理器模式位。

    處理器在特權(quán)模式下,可修改這些位,或者發(fā)生異常時(shí)處理器自動(dòng)改變這些位。

    ① 中斷禁止控制位 I 和 F
    標(biāo)志位 I 和 F 都是中斷禁止標(biāo)志位,用來使能或禁止 ARM 的 2 種外部中斷,在 2.3.1
    小節(jié)的圖 2.10 中 ARM 核有 2 個(gè)引腳 nFIQ 和 nIRQ 分別對(duì)應(yīng) F 和 I 標(biāo)志位,對(duì)通過 nFIQ 和
    nIRQ 進(jìn)入的外部中斷實(shí)現(xiàn)使能或禁止。
    當(dāng)控制位 I 置位時(shí),IRQ 中斷被禁止;
    當(dāng)控制位 F 置位時(shí),F(xiàn)IQ 中斷被禁止。

    ② 狀態(tài)控制位 T
    處理器的狀態(tài)控制位 T,控制處理器按照 ARM 指令集運(yùn)行,還是按照 Thumb 指令集運(yùn)
    行,要注意對(duì)狀態(tài)位的修改只能使用 BX 指令,不要在特權(quán)模式下對(duì)狀態(tài)位修改,否則處理
    器運(yùn)行不可預(yù)知。
    當(dāng)控制位 T 置位時(shí),處理器正在 Thumb 狀態(tài)下運(yùn)行;
    當(dāng)控制位 T 清零時(shí),處理器正在 ARM 狀態(tài)下運(yùn)行。

    ③ 模式控制位 M[4:0]
    M[4:0]是模式控制位,這些位決定處理器的工作模式,不是所有模式位的組合都定義了
    有效的處理器模式,因此不要使用沒有定義的 M[4:0]編碼。

    7 種模式定義如下:

    • M[4:0] = 0b10000:用戶模式;
    • M[4:0] = 0b10001:快速中斷模式;
    • M[4:0] = 0b10010:中斷模式;
    • M[4:0] = 0b10011:管理模式;
    • M[4:0] = 0b10111:中止模式;
    • M[4:0] = 0b11011:未定義模式;
    • M[4:0] = 0b11111:系統(tǒng)模式。

    如果將非法的值寫入 M[4:0]中,處理器將進(jìn)入一個(gè)無法恢復(fù)的模式。

2.6 ARM 體系的異常處理

計(jì)算機(jī)在執(zhí)行正常程序過程中,當(dāng)發(fā)生某種異常事件或某種外部請(qǐng)求時(shí),處理器就暫停
執(zhí)行當(dāng)前的程序,進(jìn)入異常模式,去執(zhí)行異常事件或某種外部請(qǐng)求的處理操作。就是說只要
正常的程序流被暫時(shí)中止,處理器就進(jìn)入異常模式。例如在用戶模式下執(zhí)行程序時(shí),當(dāng)外設(shè)
向處理器內(nèi)核發(fā)出中斷請(qǐng)求,處理器便從用戶模式切換到異常中斷模式。如果同時(shí)發(fā)生多個(gè)
異常,那么將按照固定的優(yōu)先順序來處理異常。

2.6.1異常優(yōu)先級(jí)

當(dāng)多個(gè)異常同時(shí)發(fā)生時(shí)一個(gè)固定的優(yōu)先級(jí)系統(tǒng)決定它們被處理的順序,在 ARM 體系結(jié)
構(gòu)中,異常優(yōu)先級(jí)由高到低的排列次序如表 2-6 所示。

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

在異常優(yōu)先級(jí)中,未定義指令和軟件中斷 SWI 之間是互斥的,不會(huì)同時(shí)發(fā)生,因此它
們的優(yōu)先級(jí)是相同的。
在一個(gè)數(shù)據(jù)中止處理程序中,由于沒有禁止 FIQ 異常中斷,所以可以發(fā)生 FIQ 異常中
斷。當(dāng) FIQ 使能,并且在發(fā)生 FIQ 的同時(shí)產(chǎn)生了一個(gè)數(shù)據(jù)中止時(shí),ARM7 內(nèi)核進(jìn)入數(shù)據(jù)中
止處理程序,然后立即轉(zhuǎn)到 FIQ 向量。當(dāng) FIQ 服務(wù)完成之后,恢復(fù)執(zhí)行數(shù)據(jù)中止處理程序。

2.6.2 異常向量表

在異常處理過程中,為了加快異常服務(wù)的響應(yīng)速度,異常處理程序的入口地址一般采用
硬件實(shí)現(xiàn),處理器規(guī)定了異常處理程序入口的地址區(qū)間,并且規(guī)定了地址的存放順序,一般
稱為異常向量表
,ARM 處理器異常向量表見表 2-7 所示。

第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)
在表 2-7 中,I 和 F 表示先前的值,每一種處理模式都有一個(gè)相關(guān)的中斷向量,當(dāng)一個(gè)
異常發(fā)生時(shí),ARM 處理器將自動(dòng)改變模式,而程序計(jì)數(shù)器 PC 將會(huì)被強(qiáng)行指向異常向量,
異常向量表從地址 0 的復(fù)位向量開始,然后每 4 個(gè)字節(jié)就是一個(gè)異常向量。
在異常向量表中,有一個(gè)保留的異常入口,其位于 0 x0000 0014 地址處,這個(gè)位置在早
期的 ARM 結(jié)構(gòu)中會(huì)被用到,而在 ARM7 中是保留的,以確保軟件能與不同的 ARM 結(jié)構(gòu)兼
容,然而,在有些 ARM7 處理器芯片中,這 4 個(gè)字節(jié)已經(jīng)有了非常特殊的用途。

2.6.3 異常中斷的進(jìn)入與退出

  1. 進(jìn)入異常
    程序代碼正常運(yùn)行時(shí)發(fā)生了異常,導(dǎo)致模式切換,這時(shí) ARM 內(nèi)核將自動(dòng)做如下處理:

    • 將異常處理程序的返回地址保存到相應(yīng)異常模式下的 LR 中;
    • 將 CPSR 的當(dāng)前值保存到相應(yīng)異常模式下的 SPSR 中;
    • 設(shè)置 CPSR 為相應(yīng)的異常模式;
    • 設(shè)置 PC 為相應(yīng)異常處理程序的中斷入口向量地址,跳轉(zhuǎn)到相應(yīng)的異常中斷處理程
      序執(zhí)行;

    ARM7 內(nèi)核在中斷異常時(shí)置位中斷禁止控制位,這樣可防止不受控制的異常嵌套,異??偸窃?ARM 狀態(tài)中進(jìn)行處理,當(dāng)處理器處于 Thumb 狀態(tài)時(shí)發(fā)生了異常,在異常向量地址裝入 PC 時(shí)會(huì)自動(dòng)切換到 ARM 狀態(tài)。

  2. 退出異常
    當(dāng)異常處理程序結(jié)束時(shí),異常處理程序必須:

    • 返回到發(fā)生異常中斷的指令的下一條指令處執(zhí)行,即就是說將 LR 中的值減去偏移
      量后復(fù)制到 PC 中;
    • 將 SPSR 的值復(fù)制回 CPSR;
    • 清零在入口處置位的中斷禁止標(biāo)志。
    • 恢復(fù) CPSR 的動(dòng)作會(huì)將 T, F 和 I 位自動(dòng)恢復(fù)為異常發(fā)生前的值
  3. 異常入口/出口指令
    表 2-8 所示為異常返回地址值以及退出異常處理程序所推薦使用的指令。
    第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

2.6.4 ARM 中的異常處理

  1. 復(fù)位異常
    在 2.3.1 小節(jié)的圖 2.10 中,當(dāng) nRESET 信號(hào)被拉低時(shí),ARM 處理器放棄正在執(zhí)行的指
    令,等到 nRESET 信號(hào)再次變高時(shí),處理器執(zhí)行一下操作:

    • 強(qiáng)制 M[4:0]變?yōu)?b10011,系統(tǒng)進(jìn)入管理模式;
    • 將 CPSR 中的標(biāo)志位 I 和 F 置位,IRQ 與 FIQ 中斷被禁止;
    • 將 CPSR 中的標(biāo)志位 T 清零,處理器處于 ARM 狀態(tài);
    • 強(qiáng)制 PC 從地址 0x00 開始對(duì)下一條指令進(jìn)行取指;
    • 返回到 ARM 狀態(tài)并恢復(fù)執(zhí)行。

    在系統(tǒng)復(fù)位后,除 PC 和 CPSR 之外的所有寄存器的值都是隨機(jī)的。處理器進(jìn)入管理
    模式,對(duì)系統(tǒng)進(jìn)行初始化。

  2. 中斷請(qǐng)求異常 IRQ
    IRQ 異常屬于正常的中斷請(qǐng)求,可通過對(duì)處理器的 nIRQ 引腳輸入低電平產(chǎn)生,IRQ 的
    優(yōu)先級(jí)低于 FIQ,當(dāng)程序執(zhí)行進(jìn)入 FIQ 異常時(shí),IRQ 可能被屏蔽。
    在特權(quán)模式下,若將 CPSR 的 I 位置為 1,則會(huì)禁止 IRQ 中斷,若將 CPSR 的 I 位清零,
    處理器會(huì)在指令執(zhí)行結(jié)束之前檢查 IRQ 的輸入。
    IRQ 異常的處理流程如下:
    ① 進(jìn)入 IRQ 異常模式,
    程序運(yùn)行在用戶模式下,當(dāng)一個(gè) IRQ 異常中斷發(fā)生時(shí),內(nèi)核切換到“中斷模式”,并自
    動(dòng)的做如下處理:

    • 將異常處理程序的返回地址保存到異常模式下的 R14(R14_irq)中;
    • 用戶模式的 CPSR 被保存到中斷異常模式 SPSR_irq 中。
    • 修改 CPSR,將 I 置 1,禁止新的 IRQ 中斷產(chǎn)生,但不改變 F 值,不限制 FIQ
      中斷發(fā)生,清零 T 標(biāo)志位,進(jìn)入 ARM 狀態(tài),修改模式位,設(shè)置為 IRQ 模式。
      將 IRQ 異常中斷入口向量地址 0x00000018 送入 PC
      在 IRQ 模式下,用戶模式的 R13 和 R14 將不能操作,而 R13_irq 和 R14_irq
      可以操作,即 R13_irq 保存 IRQ 模式下的地址指針,R14_irq 保存了“IRQ 中
      斷返回地址+4”(見 2.2.2 小結(jié))。

    ② 退出 IRQ 異常模式
    中斷服務(wù)程序執(zhí)行完畢后,使用一條指令將返回地址送入 PC,即可實(shí)現(xiàn) IRQ 中斷返回,
    在返回過程中處理器會(huì)自動(dòng)將 SPSR_irq 中的內(nèi)容復(fù)制到 CPSR,恢復(fù)中斷前的處理器狀態(tài)。
    由于流水線的特性,將 R14_irq 指向的地址減去一個(gè)偏移量后存入 R15(PC),IRQ 一般使用
    指令為:
    SUBS PC,LR,#4 ;PC= R14_irq-4

    該指令將寄存器 R14_irq 的值減去 4 后,復(fù)制到程序計(jì)數(shù)器 PC 中,從而實(shí)現(xiàn)從異常處
    理程序中的返回。由于 ARM7 采用三級(jí)流水線技術(shù),而處理器是在當(dāng)前指令執(zhí)行結(jié)束前檢
    測(cè) nIRQ 中斷請(qǐng)求信號(hào),如果有中斷請(qǐng)求將立即保存 PC 的值到 R14 中,此時(shí) PC 的值是當(dāng)
    前指令地址的值加 8(在 ARM 模式下),即下兩條指令的地址,因此,異常返回的地址值應(yīng)該是 PC=R14-4,如圖 2.17 所示。
    第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

  3. 快速中斷請(qǐng)求異常 FIQ
    快速中斷請(qǐng)求(FIQ)適用于對(duì)一個(gè)突發(fā)事件的快速響應(yīng),這得益于在 ARM 狀態(tài)中,快
    中斷模式有 8 個(gè)專用的寄存器可用來滿足寄存器保護(hù)的需要(這可以加速上下文切換的速
    度)。

    當(dāng) CPSR 中相應(yīng)的 F 位被清零時(shí),快速中斷就被使能,外部信號(hào)將內(nèi)核中的 nFIQ 信號(hào)
    拉低可實(shí)現(xiàn)外部 FIQ 異常,處理器進(jìn)入 FIQ 異常處理之后,F(xiàn)IQ 和 IRQ 中斷同時(shí)被禁止,
    防止外部中斷源再次發(fā)生中斷,如果允許中斷嵌套,則可以在快速中斷服務(wù)程序中重新使能
    FIQ 和 IRQ 請(qǐng)求,也就是將 CPSR 中相應(yīng)的 F 位和 I 位清零。
    可由外部通過對(duì)處理器上的 nFIQ 引腳輸入低電平產(chǎn)生 FIQ,ARM 處理器規(guī)定了 FIQ
    異常中斷的入口地址為0x001c,共4 個(gè)字節(jié),不管 FIQ 異常入口是來自ARM狀態(tài)還是Thumb
    狀態(tài),F(xiàn)IQ 處理程序都會(huì)通過執(zhí)行下面的指令從中斷服務(wù)程序中返回。
    SUBS PC,LR,#4 ;PC= R14_fiq-4

    該指令將寄存器 R14_fiq 的值減去 4 后,復(fù)制到程序計(jì)數(shù)器 PC 中,從而實(shí)現(xiàn)從異常處
    理程序中的返回,同時(shí)將 SPSR_ fiq 寄存器的內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。

    在特權(quán)模式中,可以通過置位CPSR中的F位來禁止FIQ異常。當(dāng)F控制位清零時(shí),ARM
    處理器在每條指令結(jié)束時(shí)檢查 nFIQ 引腳(見 2.3.1 小節(jié)的圖 2.10)的電平。FIQ 異常進(jìn)入與
    退出的流程與 IRQ 類似。

  4. SWI 軟中斷異常
    軟件中斷異常(SWI)用于進(jìn)入管理模式,通常用于請(qǐng)求一個(gè)特定的管理函數(shù),通過 SWI處理程序讀取指令中的操作數(shù)以提取 SWI 函數(shù)編號(hào)。SWI 處理程序通過執(zhí)行下面的指令返回:
    MOVS PC,LR ;PC= R14_svc
    這條指令的動(dòng)作恢復(fù)了 PC 和 CPSR,并返回到 SWI 之后的指令執(zhí)行。

  5. 未定義指令異常
    未定義指令異常是內(nèi)部異常中斷,當(dāng) ARM 處理器遇到一條自己和系統(tǒng)內(nèi)部任何協(xié)處理
    器都無法執(zhí)行的指令時(shí),就會(huì)發(fā)生未定義指令異常,從而進(jìn)入中斷處理程序,采用這種機(jī)制,
    可以通過軟件仿真擴(kuò)展 ARM 或 Thumb 指令集。

    在仿真未定義指令后,處理器執(zhí)行以下返回指令:
    MOVS PC,LR ;PC= R14_und
    以上指令恢復(fù) PC(從 R14_und)和 CPSR(從 SPSR_und)的值,并返回到未定義指令
    后的下一條指令執(zhí)行。

  6. 中止異常
    中止表示當(dāng)前對(duì)存儲(chǔ)器的訪問不能被完成,這是由外部 ABORT 輸入信號(hào)引起的異常中
    斷。中止異常包括兩種類型:

    • 預(yù)取指中止:由程序存儲(chǔ)器引起的中止異常;
    • 數(shù)據(jù)中止:由數(shù)據(jù)存儲(chǔ)器引起的中止異常。

    ① 預(yù)取指中止異常
    當(dāng)發(fā)生預(yù)取指中止時(shí),ARM 內(nèi)核將預(yù)取的指令標(biāo)記為無效,但在指令到達(dá)流水線的執(zhí)
    行階段時(shí)才進(jìn)入異常。如果指令在流水線中因?yàn)榘l(fā)生分支而沒有被執(zhí)行,中止將不會(huì)發(fā)生。

    在處理中止的原因之后,不管處于哪種處理器操作狀態(tài),處理程序都會(huì)執(zhí)行下面的指令
    恢復(fù) PC 和 CPSR 的內(nèi)容,并重試被中止的指令:
    SUBS PC,LR,#4 ;PC= R14_abt-4

    ② 數(shù)據(jù)中止異常
    當(dāng)發(fā)生數(shù)據(jù)中止異常時(shí),異常會(huì)在“導(dǎo)致異常的指令”執(zhí)行后的下一條指令發(fā)生。在這種
    情況下,理想的狀況是進(jìn)入數(shù)據(jù)中止異常的 ISR,然后在內(nèi)存中挑選出問題,再重新執(zhí)行導(dǎo)
    致異常的指令。

    在修復(fù)產(chǎn)生中止的原因后,不管處于哪種處理器操作狀態(tài),處理程序都必須執(zhí)行下面的
    返回指令 :
    SUBS PC,R14_abt,#8 ;PC= R14_abt-8
    這條指令恢復(fù) PC(從 R14_abt)和 CPSR(從 SPSR_abt)的值,將重新執(zhí)行中止的指
    令。

    中止的機(jī)制使得分頁(yè)的虛擬存儲(chǔ)器系統(tǒng)能得以實(shí)現(xiàn),在這樣的系統(tǒng)中,處理器允許產(chǎn)生
    仲裁地址。當(dāng)某一地址的數(shù)據(jù)無法訪問時(shí),存儲(chǔ)器管理單元 MMU 通知產(chǎn)生了中止異常。
    中止處理程序完成尋找中止的原因,使請(qǐng)求的數(shù)據(jù)可以被訪問,并重新執(zhí)行被中止的指令,
    應(yīng)用程序不必知道可用存儲(chǔ)器的數(shù)量,也不必知道被中止時(shí)所處的狀態(tài)。

2.6.5 中斷延時(shí)

中斷延時(shí)就是系統(tǒng)響應(yīng)一個(gè)中斷所需要的時(shí)間,即從外部中斷請(qǐng)求信號(hào)發(fā)出到執(zhí)行對(duì)應(yīng)
的中斷服務(wù)程序 ISR 的第 1 條指令所需要的時(shí)間。在某些系統(tǒng)中如果對(duì)中斷處理不及時(shí),
系統(tǒng)可能會(huì)顯得非常遲鈍甚至出現(xiàn)系統(tǒng)崩潰的現(xiàn)象,在實(shí)時(shí)監(jiān)控系統(tǒng)中,一般對(duì)中斷延時(shí)有
較為嚴(yán)格的要求。那么用戶如何計(jì)算中斷延時(shí),怎么確定系統(tǒng)響應(yīng)中斷的速度,這個(gè)問題取
決于以下幾個(gè)因素:

  • 中斷被禁止的最長(zhǎng)時(shí)間;
  • 比自身更高優(yōu)先級(jí)的異常中斷所需要的處理時(shí)間;
  • CPU 開始處理中斷,進(jìn)行斷點(diǎn)保護(hù)、狀態(tài)設(shè)置、進(jìn)入中斷服務(wù)程序等所需要的時(shí)
    間。
  • 中斷程序現(xiàn)場(chǎng)保護(hù)及其他要求配置的操作所需要的時(shí)間。

通過軟件程序設(shè)計(jì)來縮短中斷延遲的方法有:中斷優(yōu)先級(jí)和中斷嵌套。在一些應(yīng)用中允
許中斷嵌套,就是說 CPU 在執(zhí)行一個(gè)中斷服務(wù)程序的同時(shí),再次響應(yīng)一個(gè)新的中斷,而不
是等待中斷處理程序全部完成之后才允許新的中斷產(chǎn)生,一旦嵌套的中斷服務(wù)程序完成之
后,則又回到前一個(gè)中斷服務(wù)程序,對(duì)于要求快速響應(yīng)的中斷可以設(shè)置更高的優(yōu)先級(jí),他可
以打斷正在執(zhí)行的低優(yōu)先級(jí)的中斷。
例如 FIQ 的中斷延時(shí),當(dāng) FIQ 使能時(shí),最壞情況下 FIQ 的延遲時(shí)間包含:

  • Tsyncmax,請(qǐng)求通過同步器的最長(zhǎng)時(shí)間,Tsyncmax 為 2 個(gè)處理器周期;
  • Tldm,最長(zhǎng)指令執(zhí)行需要的時(shí)間(最長(zhǎng)指令是 LDM 裝載指令),Tldm 在零等待狀態(tài)系統(tǒng)中的執(zhí)行時(shí)間為 20 個(gè)周期;
  • Texc,數(shù)據(jù)中止異常進(jìn)入時(shí)間,Texc 為 3 個(gè)周期;
  • Tfiq,F(xiàn)IQ 進(jìn)入時(shí)間,Tfiq 為 2 個(gè)周期。

因此總的延遲時(shí)間為 27 個(gè)周期,如果 ARM 內(nèi)核使用 40MHz 的時(shí)鐘時(shí),中斷延時(shí)約
為 0.68 微妙,在此時(shí)間結(jié)束后 ARM7 執(zhí)行位于 0x001c 處的指令。

2.7 ARM 體系的存儲(chǔ)方式

ARM7 處理器采用馮·諾依曼(Von Neumann)結(jié)構(gòu),指令、數(shù)據(jù)和 I/O 統(tǒng)一編址(即存
儲(chǔ)地址是在同一個(gè)地址空間)。其地址空間大小為 4GB,這些字節(jié)的單元地址是一個(gè)無符號(hào)
的 32 位數(shù)值,取值范圍是 0~232-1,各存儲(chǔ)單元地址作為 32 位無符號(hào)數(shù),可以進(jìn)行常規(guī)
的整數(shù)運(yùn)算。

采用 ARM 核設(shè)計(jì)處理器芯片時(shí),一般在處理器核和外部存儲(chǔ)器之間設(shè)計(jì)一個(gè)存儲(chǔ)器管
理部件,將 ARM 公司的 AMBA 總線接口信號(hào)和時(shí)序轉(zhuǎn)換為現(xiàn)實(shí)的外部總線信號(hào)和時(shí)序。
ARM 處理器對(duì)存儲(chǔ)器操作的數(shù)據(jù)單元包括:字節(jié)(8bit)存取、半字(16bit)存取,
字(32bit)存取,由引腳 SIZE[1:0]的編碼控制(參見 2.3.1 小節(jié)的圖 2.10)。

2.7.1 數(shù)據(jù)存儲(chǔ)格式

在 ARM 中,存儲(chǔ)地址為 A 的數(shù)據(jù)存儲(chǔ)規(guī)則如下:

  • 位于地址 A 的字包含的字節(jié)位于地址 A,A+1,A+2 和 A+3;
  • 位于地址 A 的半字包含的字節(jié)位于地址 A 和 A+1;
  • 位于地址 A+2 的半字包含的字節(jié)位于地址 A+2 和 A+3;
  • 位于地址 A 的字包含的半字位于地址 A 和 A+2。
    但是這樣并不能完全定義字、半字和字節(jié)之間的映射,存儲(chǔ)器系統(tǒng)使用下列 2 種映射機(jī)
    制中的一種。

1. 小端存儲(chǔ)格式
在小端存儲(chǔ)格式中,對(duì)于地址為 A 的字單元,其中字節(jié)的低位字節(jié)到高位字節(jié)地址順
序?yàn)?A,A+1,A+2,A+3;對(duì)于地址為 A 的半字單元,其中字節(jié)的低位字節(jié)到高位字節(jié)地
址順序?yàn)?A,A+1。也就是說,按照數(shù)據(jù)的高字節(jié)存放在高地址中的順序進(jìn)行存儲(chǔ)。如圖 2.18
中的(a)所示。
第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】,# 嵌入式系統(tǒng),arm開發(fā),嵌入式操作系統(tǒng)

2. 大端存儲(chǔ)格式
在大端存儲(chǔ)格式中,對(duì)于地址為 A 的字單元,其中字節(jié)的低位字節(jié)到高位字節(jié)地址順
序?yàn)?A+3,A+2,A+1,A;對(duì)于地址為 A 的半字單元,其中字節(jié)的低位字節(jié)到高位字節(jié)地
址順序?yàn)?A+1,A。也就是說,按照數(shù)據(jù)的低字節(jié)存放在高地址中的順序進(jìn)行存儲(chǔ)。如圖 2.18
中的(b)所示。

【例 2-2】
ARM 處理器寄存器 R1 中的數(shù)據(jù)內(nèi)容為 0x12345678,將其存放到內(nèi)存地址 0x2000 開始
的內(nèi) 存單元中 ,分別采用小 端存儲(chǔ)格 式和大端存儲(chǔ) 格式存放 ,試分析內(nèi)存 地址
0x2000~0x2003 各字節(jié)單元的內(nèi)容。
解:(1)采用小端存儲(chǔ)格式
根據(jù)小端存儲(chǔ)格式的規(guī)定,數(shù)據(jù)的低位字節(jié)存到低地址,高位字節(jié)存到高地址的規(guī)則,
得到地址0x2000中的字節(jié)數(shù)為0x78,0x2001中的字節(jié)數(shù)為0x56,0x2002中的字節(jié)數(shù)為0x34,
0x2003 中的字節(jié)數(shù)為 0x12。
(2)采用大端存儲(chǔ)格式
根據(jù)大端存儲(chǔ)格式的規(guī)定,數(shù)據(jù)的低位字節(jié)存到高地址,高位字節(jié)存到低地址的規(guī)則,
得到地址0x2003中的數(shù)據(jù)為0x78,0x2002中的數(shù)據(jù)為0x56,0x2001中的數(shù)據(jù)為0x34,0x2000
中的數(shù)據(jù)為 0x12。

2.7.2 非對(duì)齊的存儲(chǔ)器訪問

最后

2023-7-3 15:11:04

祝大家逢考必過
點(diǎn)贊收藏關(guān)注哦文章來源地址http://www.zghlxwxcb.cn/news/detail-532749.html

到了這里,關(guān)于第二章 ARM 技術(shù)及體系結(jié)構(gòu)【嵌入式系統(tǒng)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(2)

    【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(2)

    大家好,很高興又和各位見面啦?。?!在上一個(gè)篇章中,我們簡(jiǎn)單了解了一下線性表的基礎(chǔ)知識(shí)以及一下重要的術(shù)語。在今天的篇章中我們將來開始正式介紹線性表的順序存儲(chǔ)——又稱順序表。我們將會(huì)在本章介紹什么是順序表,對(duì)于順序表的操作我們又應(yīng)該如何實(shí)現(xiàn)。接下

    2024年02月03日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(1)

    【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(1)

    大家好,很高興又和大家見面啦!??!從今天開始,我們將進(jìn)入線性表的學(xué)習(xí)。 線性表是算法題命題的重點(diǎn)。這類算法題實(shí)現(xiàn)起來比較容易且代碼量較少,但是要求具有最優(yōu)的性能(時(shí)間復(fù)雜度、空間復(fù)雜度),因此,我們應(yīng)該牢固掌握線性表的各種基本操作(基于兩種存儲(chǔ)

    2024年02月03日
    瀏覽(29)
  • 【筆記】ARM M3-M4權(quán)威指南第二章《嵌入式軟件開發(fā)介紹》

    【筆記】ARM M3-M4權(quán)威指南第二章《嵌入式軟件開發(fā)介紹》

    2.1 ARM微控制器是由哪些構(gòu)成的 2.2 開始時(shí)需要準(zhǔn)備什么 2.2.1 開發(fā)組件,C 編譯器組件產(chǎn)品如下 2.2.2 開發(fā)板 2.2.3 調(diào)試適配板(Keil – ULINK;IAR-- I-Jet;STM Value Line Discover;JTAG/SW仿真器/在線仿真器(ICE);開源板 – ARM的CMSIC-DAP和Coocox的CoLink) 2.2.4 軟件設(shè)備驅(qū)動(dòng) 2.2.5 示例(Samp

    2024年04月13日
    瀏覽(109)
  • ARM 體系結(jié)構(gòu)與匯編語言

    Load/Store 架構(gòu),CPU 不能直接處理內(nèi)存中的數(shù)據(jù),需要先將內(nèi)存中的數(shù)據(jù)加載到寄存器中才能操作,然后將處理結(jié)果存儲(chǔ)到內(nèi)存中。 固定的指令長(zhǎng)度、單周期指令。 傾向于使用更多的寄存器來存儲(chǔ)數(shù)據(jù),而不是使用內(nèi)存中的堆棧、效率更高。 ARM 有桶型移位寄存器,單周期內(nèi)可

    2024年02月16日
    瀏覽(89)
  • 【數(shù)據(jù)結(jié)構(gòu)】第二章課后練習(xí)題——線性結(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)】第二章課后練習(xí)題——線性結(jié)構(gòu)

    1、線性表是 一個(gè)有限序列,可以為空 2、鏈表中最常用的操作是在最后一個(gè)元素之后插入一個(gè)元素和刪除最后一個(gè)元素,則采用 單循環(huán)鏈表 存儲(chǔ)方式最節(jié)省運(yùn)算時(shí)間 3、若某線性表中最常用的操作實(shí)在最后一個(gè)元素之后插入一個(gè)元素和刪除第一個(gè)元素,則采用 僅有尾結(jié)點(diǎn)的

    2024年02月07日
    瀏覽(25)
  • JavaWeb高級(jí)開發(fā)技術(shù)第二章答案

    單選題 1、 下列選項(xiàng)中,啟動(dòng)Tomcat的命令startup.bat,放在哪個(gè)目錄中() 2分 A、A、bin B、B、lib C、C、webapps D、D、work 參考答案 : A 答案說明 : bin目錄用于存放Tomcat的可執(zhí)行文件和腳本文件(擴(kuò)展名為bat的文件) 2、 下列選項(xiàng)中,修改Tomcat端口號(hào)的文件是() 2分 A、A、conf.xm

    2024年02月07日
    瀏覽(25)
  • Python基礎(chǔ)練習(xí)題--第二章 順序結(jié)構(gòu)

    Python基礎(chǔ)練習(xí)題--第二章 順序結(jié)構(gòu)

    目錄 1007:【例2.1】交換a和B的值 1008:【例2.2】打招呼Hello 1009:【例2.3】購(gòu)買筆記本 1010:【例2.4】最適宜運(yùn)動(dòng)心率 1011:【例2.5】求3個(gè)整數(shù)的和 1012:練2.1 ?小明買圖書 1013:練2.2 ?雞兔同籠 1014:練2.3 ?求平均分 1015:【例2.6】數(shù)字對(duì)調(diào) 1016:【例2.7】BMI指數(shù) 1017:練2.4 ?與

    2024年02月09日
    瀏覽(44)
  • SQL Server基礎(chǔ) 第二章 表結(jié)構(gòu)管理

    SQL Server基礎(chǔ) 第二章 表結(jié)構(gòu)管理

    目錄 一、數(shù)據(jù)類型 1,字符類數(shù)據(jù)類型 2,數(shù)值型數(shù)據(jù)類型 3,日期/時(shí)間型數(shù)據(jù)類型 二、主鍵(Primary key) 三、默認(rèn)值 四、唯一鍵(Unique) 五、自增標(biāo)識(shí) 六、約束 七、外鍵 數(shù)據(jù)類型是數(shù)據(jù)的一種屬性,是數(shù)據(jù)所表示信息的類型。 SQLServer提供了比較多的數(shù)據(jù)類型供用戶使用

    2023年04月22日
    瀏覽(24)
  • ChatGPT技術(shù)原理 第二章:自然語言處理基礎(chǔ)

    目錄 2.1 語言模型 2.3 詞嵌入 2.4 注意力機(jī)制 2.5 生成式模型

    2024年02月02日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)英文習(xí)題解析-第二章 鏈表List

    前言:最近快到FDS考試了,po重刷了一下學(xué)校的題目,自己整理了一些解析orz 因?yàn)閜o在自己找解析和學(xué)習(xí)的過程中非常痛苦,所以在此共享一下我的題目和自己寫的解題思路,歡迎各位指出錯(cuò)誤~全章節(jié)預(yù)計(jì)會(huì)陸續(xù)更新,可在專欄查看~ HW2 1. For a sequentially stored linear list of leng

    2024年04月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包