??ARM 架構的 MCU 用了好多年,進一步對于 ARM 架構也或多或少的有了一些了解,之前都是遇到啥問題直接去官網找對應的手冊,一直沒有系統的總結一下,是時候總結一下,以便進行下一步學習了!
總的來說,整個 ARM 可以分為兩大部分:SoC 設計 和 ARM 平臺軟體開發,
ARM 檔案
??在了解 ARM 相關的各種概念之前,先來簡單說一下 ARM 官方提供的檔案的組織結構,其實,國外這些大公司對于檔案的組織都是比較規范的,例如,ST 的 參考手冊、資料手冊、應用手冊等等,ARM 檔案也基本可以分為參考手冊、用戶指南,這么劃分的目的就是為了讓各部分更加獨立,簡單來說,參考手冊僅介紹原理,用戶指南介紹使用方法,兩者相互獨立,

- Arm Architecture Reference Manual :架構參考手冊描述架構規范,是按照不同的架構版本分開的(如上圖是 Armv8-A的架構參考手冊),里面會詳細介紹對應架構的細節,
- Technical Reference Manual (TRM) :這個是針對 ARM IP 的參考手冊, 描述特定于該 ARM IP 的特性,
- Configuration and Integration Manual (CIM) :這個也是針對 ARM IP 的參考手冊,描述如何將處理器集成到系統中,一般來說,這些資訊只與 SoC 設計相關,僅對被授予了 IP 許可的合作方開放,
下表顯示了在不同型別的檔案中的內容:

上面說的檔案都屬于參考手冊
??ARM 的所有檔案都放在專門為開發者提供了網站 Arm developer website 上,除此之外,ARM 的官方社區也是一個寶庫,社區包含:博客(ARM 的設計師經常在上面分享一些文章)、論壇(里面有很多專業問題及設計師的解答),
架構(Architecture)
??架構(Architecture)指的是一些列的功能規范,ARM 架構 指的就是是基于 ARM 架構的處理器的功能規范,即 ARM CPU 架構,架構指定了處理器的行為方式,例如它有什么指令以及指令做什么,

可以將架構看作是硬體和軟體之間的契約,描述了軟體可以依賴硬體提供哪些功能,大體包含以下內容:
| 條目 | 說明 |
|---|---|
| 指令集 | 每條指令的功能;指令如何在記憶體中表示(它的編碼) |
| 暫存器組 | 有多少暫存器;暫存器的大小;暫存器的功能;暫存器的初始狀態 |
| 例外模型 | 不同的權限級別;例外的型別;從例外中獲取或回傳時會發生什么 |
| 記憶體模型 | 記憶體訪問是如何排序的;快取是如何運作的,什么時候以及軟體必須如何執行顯式維護 |
| 除錯、跟蹤和分析 | 如何設定和觸發斷點;跟蹤工具可以捕獲什么資訊,以什么格式捕獲 |
??ARM 架構 可以認為就是個專有名詞,是 ARM 制定的一些列功能規范的統稱,至今已經有發展了很多版,最初的 ARMv1、ARMv2,后來的 ARMv6、ARMv8;最新的 ARMv9,
??每一代 ARM 架構 都有一個專門的檔案(架構參考手冊)來介紹該架構的具體細節,需要注意的是,架構參考手冊是根據 Profile 來分開的,并不是一個統一的檔案,例如,《Armv8-M Architecture Reference Manual》、《Armv8-A Architecture Reference Manual》等等,
微架構(Micro-Architecture)
??ARM 架構不會介紹處理器是如何構建的或它是如何作業的, 處理器的構建和設計稱為微架構, 微架構介紹了特定處理器的作業方式,微架構就是對于 ARM 架構的進一步的實作

微架構包括以下內容:
- 管道長度和布局
- 快取的數量和大小
- 單個指令的回圈計數
- 實作了哪些可選功能
??一個 ARM 架構可以有多個不同的微架構以實作針對多種應用環境,例如,ARM 自己提供的各種 ARM 核就是一個個不同的微架構,
系統架構(System Architecture)
??除了上面說的 ARM 架構之外,ARM 對構成現代芯片上系統(SoC)的許多組件都有類似的規范,ARM 系統架構定義了相關組件和介面,使硬體和軟體更容易進行互操作,系統架構的整體框圖如下圖所示:

??規范是軟體兼容性的基礎,根據規范構建硬體意味著可以撰寫與之相匹配的軟體,根據規范撰寫軟體意味著它可以在兼容的硬體上運行,ARM 架構是基礎,通過指令集架構(Instruction Set Architecture,ISA)兼容性提供了一個通用的程式員模型,

??基本系統架構(The Base System Architecture,BSA)規范描述了系統軟體可以依賴的硬體系統架構,BSA 涵蓋了處理器和系統架構的各個方面,例如中斷控制器、計時器和作業系統需要的其他常見設備,這為標準作業系統、管理程式和韌體提供了可靠的平臺,
??基本引導需求(The Base Boot Requirements,BBR)規范涵蓋了基于 Arm 架構的系統以及作業系統和管理程式可以依賴的系統需求,該規范建立了韌體介面要求,如 PSCI、SMCCC、UEFI、ACPI 和 SMBIOS,
??其他標準可以建立在 BSA 的基礎上,以提供特定于市場的標準化, 例如,服務器基礎系統架構 (SBSA) 是針對服務器的 BSA 的補充, SBSA 描述了服務器作業系統的硬體和功能要求,

-
Generic Interrupt Controller: 通用中斷控制器(GIC) 規范定義了 Armv7-A/R 和 Armv8-A/R 的標準化中斷控制器,通用中斷控制器(GIC)從外設接收中斷,按優先級排列它們,并將它們交付給適當的處理器核心,

??目前,GIC 已經發展到了第四代,ARM 官方提供了 《ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification》和《Arm Generic Interrupt Controller Architecture Specification GIC architecture version 3 and 4》這兩個檔案來介紹 GIC,注意:M-Profile 使用的是 NVIC 中斷控制器,
-
System Memory Management Unit: 系統記憶體管理單元(SMMU,有時也稱為 IOMMU)為非處理器主機提供翻譯服務,
??目前,SMMU 已經發展到了第三代,ARM 官方提供了 《ARM System Memory Management Unit Architecture Specification - SMMU architecture version 2.0》和《Arm System Memory Management Unit Architecture Specification, SMMU architecture version 3》這兩個檔案來介紹 SMMU, -
Generic Timer: 通用定時器為系統中的所有處理器提供公共參考系統計數, 這些計時器提供用于諸如作業系統調度程式滴答之類的功能, 通用定時器是 Arm 架構的一部分,但系統計數器是一個系統組件,
-
Server Base System Architecture and Trusted Base System Architecture: 服務器基礎系統架構 (SBSA) 和可信基礎系統架構 (TBSA) 為 SoC 開發人員提供系統設計指南,
-
Advanced Microcontroller Bus Architecture: 高級微控制器總線架構 (AMBA) 總線協議系列控制基于 Arm 的系統中組件的連接方式以及這些連接上的協議,
-
CoreSight Architecture: CoreSight 架構為實時除錯和收集跟蹤資訊提供了系統范圍的解決方案,
指令集架構
??指令集架構(Instruction Set Architecture,ISA)是計算機抽象模型的一部分,它定義了軟體如何控制 CPU,Arm ISA 允許開發人員撰寫符合 Arm 規范的軟體和韌體,以此實作在任何基于 Arm 的處理器上都可以以同樣的方式執行它們,ARM 指令集架構有三種:
-
A64: A64 指令集是在 Armv8-A 中引入的,以支持 64 位架構,A64 指令集有固定的 32 位指令長度,主要的特性有:
- Clean decode table based on 5-bit register specifiers.
- Instruction semantics broadly similar to A32 and T32.
- 31 general-purpose 64-bit registers accessible at all times.
- No modal banking of general purpose registers for improved performance and energy.
- Program counter and stack pointer are not general purpose registers.
- Dedicated zero register available for most instructions.
-
A32: A32 指令集有固定的 32 位指令長度,并在 4 位元組邊界上對齊,A32 指令集就是在 Armv6 和 Armv7 架構中我們常說的 ARM 指令集,Armv8 及之后改名 A32 以與 A64 進行區分, 隨著 Thumb-2 技術的引入,它的大部分功能都被納入了 T32 中,
??A32 指令主要被用于 A-profile 和 R-profile, -
T32: T32 指令集最初是作為 16 位指令的補充集引入的,用于改進的用戶代碼的代碼密度,隨著時間的推移,T32 演變成 16 位和 32 位混合長度的指令集,因此,編譯器可以在單個指令集中平衡性能和代碼大小,
??T32 指令集就是在在 Armv6 和 Armv7 架構中被我們所熟知的 Thumb 指令集,Armv8 及之后改名為 T32, T32 支持所有架構的 Profile,并且是 M-Profile 架構所支持的唯一指令集,
指令集是架構引數手冊中一個重要的章節,詳細的介紹可以在對應版本的架構參考手冊中找到,
??以上這三種指令集被稱為 ARM 基礎指令集(ARM Base ISAs),除此之外,ARM 還提供指令集擴展:自定義指令、DSP、浮點等等,其中以我用的最多的浮點來簡單說明一下,
ARM 浮點處理
??最近專案中用到了大量的浮點運算,且要求的時間精度較高,但是在使用程序中發現,總是會超過時間限制,最終經過測驗發現,程式中的浮點運算 sqrt 占用了大量時間,單個執行 sqrt 需要 30多個微妙,
??我實際用的是基于 Cortex-m4f 核的 MCU,主頻 128M,感覺單個執行 sqrt 需要時間有些過長于是開始在 ARM 官網找資料,結合 CMSIS 的代碼,開始一步一步定位問題:
- 首先,根據 ARM 手冊, Cortex-m4f 內核集成了浮點運算單元(FPU)和 DSP,實作單精度浮點算術運算,支持所有 ARM 單精度資料處理指令和資料型別,支持完整 DSP 指令集,
- 檢查 CMSIS 代碼中的相關配置也沒有問題

- 接著查看 CMSIS 提供的專用 DSP 驅動庫,在眾多介面中偶然發現
arm_sqrt_f32這個介面,其位于 CMSIS 的arm_math.h中,具體定義如下:/** * @brief Floating-point square root function. * @param[in] in input value. * @param[out] *pOut square root of input value. * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if * <code>in</code> is negative value and returns zero output for negative values. */ static __INLINE arm_status arm_sqrt_f32( float32_t in, float32_t * pOut) { if(in >= 0.0f) { // #if __FPU_USED #if (__FPU_USED == 1) && defined ( __CC_ARM ) *pOut = __sqrtf(in); #else *pOut = sqrtf(in); #endif return (ARM_MATH_SUCCESS); } else { *pOut = 0.0f; return (ARM_MATH_ARGUMENT_ERROR); } }
從上面的定義不難看出,我們需要使用 ARM 頂一個的各種浮點運算介面才可以正常使用 浮點運算單元,
總結一下在使用浮點運算是需要注意一下幾點:
- Cortex-M4 中集成的浮點運算單元是單精度浮點運算單元,因此,所有的浮點數運算最好都使用
float型別,常數一定加上 f 后綴,(部分 Cortex-M7 集成了 雙精度浮點運算單元) - 使用
arm_math.h及 DSP 庫中定義的相關浮點數運算介面,例如,C 語言的sqrt可以使用arm_sqrt_f32代替,三角函式sin可以使用arm_sin代替等等,注意,使用arm_math.h及 DSP 庫中相關介面時需要配置一些宏值,
ARM IP
??ARM 不僅僅制定規范,還會在規范的基礎上進一步設計,這些設計被稱為 IP(Intellectual Property,知識產權),ARM IP 有很多種:Processors(也就是我們平時說 ARM 核)、Graphics and Multimedia、System IP、Physical IP、Security IP、Subsystem,

Processors
??Processors 即 ARM 核,也即 ARM CPU,就是一些可重復利用的、具有特定功能的集成電路模塊,下圖顯示了 ARM 架構以及 ARM 核對應的關系:

從上如圖中我們可以不難看出如下幾點:
- ARM 架構版本很多,但是并不是每個 ARM 架構都有實際的實作,甚至于 ARM 自己也沒有實作部分版本的架構
- 有部分第三方公司也基于 ARM 架構設計了自己的核心,例如蘋果公司,這是由于 蘋果公司具有 ARM 架構的授權,
??ARM 為自己設計的核起了一個統一的品牌名字:Arm Cortex,同時針對不同的應用場景,分為了 Application Processors(應用處理器)Arm Cortex-A、Real-time Processors (實時處理器)Arm Cortex-R、Microcontroller Processors(微控制器處理器)Arm Cortex-M 三種不同的 Profile ,

除了以上我們比較常見的 ARM 核,ARM 還設計了其他一些處理器

System IP
??Arm System IP 使系統設計人員能夠配置和構建高性能、高能效的 SoC,同時通過行業標準 AMBA 介面將 Arm 處理器與他們自己的 IP 元素相結合,從而進一步區分,
AMBA(高級微控制器總線架構)是一種免費提供的開放標準,用于連接和管理片上系統 (SoC) 中的功能模塊, 它有助于多處理器設計的一次性開發,具有大量控制器和外設,
Physical IP
??Arm Artisan Physical IP 提供業界最全面、最先進的物理IP解決方案,使用 Arm ArtisanPhysical IP 可以有效地實作復雜的 SoC 設計,
Graphics and Multimedia Processors
- Arm Mali GPU IP

- Mali Camera Image Signal Processors (ISPs)

授權方式
??從很多資料中,我們都能找到這樣一句話 “ARM 本身并不制造和銷售芯片,而是將設計授權給其他公司”,在多年發展中,ARM 逐漸形成了多種授權方式(等級),不同的授權方式,被授權方的權限不同,
??ARM 主要有三種授權等級:使用層級授權、 內核層級授權和架構/指令集層級授權,其中指令集層級授權等級最高,企業可以對 ARM 指令集進行改造以實作自行設計處理器,如蘋果在 ARM v7-A 架構基礎上開發出蘋果 Swift 架構,其他如高通 Krait、Marvell 等都是基于 ARM 指令集或微架構進行的改造所得,
Arm core licensees
??前面我們介紹了 ARM 本身設計了很多 ARM 核,Core licensees 就是把這些核授權給購買者,購買者可以使用這些核來構建自己的 MCU、SoC,
Arm architectural licensees
??牛逼的公司還可以購買 ARM 架構許可,使用 ARM 指令集設計自己的 CPU 核,這些核心必須完全符合 ARM 架構,其中,最為人所致的就是蘋果公司,2013 年,Arm 表示大約有15 家公司被授予架構許可,
Built on ARM Cortex Technology licence
??2016 年 2 月,ARM 宣布了 Built on ARM Cortex Technology 許可證,通常簡稱為 Built on Cortex (BoC) 許可證,該許可證允許授權公司與 ARM 合作,并對 ARM Cortex 的設計進行修改,這些設計修改不會與其他公司共享,其中比較為人所知的就是高通,
ARM Flexible Access
??2019 年 7 月16 日,ARM 宣布了 ARM Flexible Access,ARM Flexible Access 為開發提供了對包括 ARM IP 的無限訪問,
其他
??除了上面說的這些,ARM 自己設計的其他 IP 也有對應的授權方式,例如,Mali licensees 授權給第三方使用 ARM 設計的 GPU,
參考
- https://developer.arm.com/
- https://en.wikipedia.org/wiki/ARM_architecture
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/303847.html
標籤:其他
