ARM裸機開發:Cortex-A7 MPCore架構基礎
文章目錄
ARM裸機開發:Cortex-A7 MPCore架構基礎
一、Cortex-A7 MPCore簡介
二、Cortex-A 處理器運行模型
三、CorteX-A 寄存器組
3.1 寄存器組成
3.2 通用寄存器
3.3 程序狀態寄存器
ARM裸機開發:Cortex-A7 MPCore架構基礎
一、Cortex-A7 MPCore簡介
Cortex-A7 MPCore是一款高性能低功耗的處理器,使用的是 ARMv7-A 架構,28nm 工藝下,Cortex-A7 可以運行在1.2~1.6GHz主頻,有浮點單元、NEON 和32KB 的L1 緩存,在典型場景下功耗小于100mW, 這使得它非常適合對功耗要求嚴格的移動設備
Cortex-A7 MPCore處理器可支持核心數目:1-4個核心,通過SCU進行調度
其搭載的核心中L1緩存分為(L1 instruction cache指令緩存和L1 data cache數據緩存),可選大小范圍:8KB、16KB、32KB、64KB;L2 Cache 可以不配,也可以選擇搭載128KB、256KB、512KB、1024KB
備注:L1 和 L2 是計算機中緩存內存的級別,處理器能夠在緩存中找到其下一次操作所需的數據,與從隨機訪問內存中獲取數據相比,節省更多時間,級別越高與處理器越接近,訪問速度也越快
Cortex-A7 MPCore 架構
基于ARMv7-A架構,進行如下擴展:
① SIMDv2 擴展整形和浮點向量操作。
② 提供了與 ARM VFPv4 體系結構兼容的高性能的單雙精度浮點指令,支持全功能的IEEE754。
③ 支持大物理擴展(LPAE),最高可以訪問40 位存儲地址,也就是最高可以支持1TB 的內存。
④ 支持硬件虛擬化。
⑥ 支持Generic Interrupt Controller(GIC)V2.0。
⑦ 支持NEON,可以加速多媒體和信號處理算法。
總線架構:
Cortex-A7 MPCore處理器ACE和調試接口符合AXI和APB
調試架構:
使用了ARMv7.1 ARM Debug架構,符合CoreSight架構
通用中斷控制器體系結構:
Cortex-A7 MPCore處理器使用了通用中斷控制器(GIC) v2.0架構
通用定時器架構:
Cortex-A7 MPCore處理器實現了ARM通用定時器架構,包括對虛擬化擴展的支持。
處理器特性
有直接和間接分支預測的順序管道。
帶有內存管理單元(MMU)的哈佛1級(L1)內存系統。
APB調試接口,支持整數處理器時鐘比率,最高包括1:1。
通過嵌入式跟蹤宏單元格(ETM)接口支持跟蹤。
可選的VFPv4-D16 FPU與無trap執行或媒體處理引擎(MPE)與NEON技術。
二、Cortex-A 處理器運行模型
Cortex-A7有9種運行處理模式:
User(USR)用戶模式為非特權模式
其它 8 種運行模式都是特權模式
不同模式間的資源使用權限不一樣
模式間切換方式:1.軟件進行切換,2.中斷切換,3.異常切換;用戶模式是不能直接進行切換的,需要借助異常來完成模式切換,當要切換模式的時候,應用程序可以產生異常,在異常的處理過程中完成處理器模式切換;當中斷或者異常發生以后,處理器就會進入到相應運行模式的異常模式種,每一種模式都有一組寄存器供異常處理程序使用,這樣的目的是為了保證在進入異常模式以后,用戶模式下的寄存器不會被破壞。
補充一個Tips:Cortex-M架構的運行模式只有兩種,一個特權一個非特權
三、CorteX-A 寄存器組
3.1 寄存器組成
ARM 架構提供了 **16 個 32 位的通用寄存器(R0~R15)**供軟件使用
在非特權模式下,前 15 個(R0~R14)可以用作通用的數據存儲,R15 是程序計數器 PC,用來保存將要執行的指令。ARM 還提供了一個當前程序狀態寄存器CPSR 和一個備份程序狀態寄存器 SPSR,SPSR 寄存器就是CPSR寄存器的備份,寄存器如下圖,其中R13用來做堆棧SP指針寄存器,R14用來做LR鏈接寄存器,R15為程序寄存器,指向下一步程序的執行地址:
但在非特權模式下,R0到R15映射的寄存器就不一定是上圖的寄存器了,具體映射關系如下:
上圖的淺色部分是非特權模式與特權模式相同的寄存器,加深的部分則是對應模式下重新映射的寄存器,訪問時會訪問深色部分寄存器
我們可以看出,在所有的模式中,低寄存器組(R0~R7)是共享同一組物理寄存器的,只是一些高寄存器組在不同的模式有自己獨有的寄存器,比如 FIQ 模式下R8~R14 是獨立的物理寄存器。假如某個程序在 FIQ 模式下訪問 R13 寄存器,那它實際訪問的是寄存器 R13_fiq,如果程序處于 SVC 模式下訪問R13寄存器,那它實際訪問的是寄存器 R13_svc
根據上圖,Cortex-A的內核寄存器組成如下:
34 個通用寄存器,包括 R15 程序計數器(PC),這些寄存器都是 32 位的。
8 個狀態寄存器,包括 CPSR 和 SPSR。
Hyp 模式下獨有一個 ELR_Hyp 寄存器
3.2 通用寄存器
R0-R15為通用寄存器,具體可以分為以下三類:
未備份的寄存器,R0 - R7
備份的寄存器,即R8 - R14
程序計數器PC,即 R15
未備份寄存器
寄存器R0 - R7 低八位寄存器是未備份寄存器,因為R0 - R7 對于9個運行模式是共用的寄存器,不同的模式下,這 8 個寄存器中的數據就會被破壞,所以這 8 個寄存器 并沒有被用作特殊用途
備份寄存器
R8 - R14為備份寄存器,
R8-R12: R8 - R12寄存器在Usr和FIQ模式下,對應著不同的寄存器,在切換時因為映射的寄存器改變了,不需要對原先的寄存器做備份,進行現場保護,所以是備份寄存器
R13: R13則對應著8個寄存器,其中用戶模式(User)和系統模式(Sys)共用 的,剩下的 7 個分別對應 7 種不同的模式。同時R13 也叫做 SP,用來做為棧指針。基本上每種模式 都有一個自己的 R13 物理寄存器,應用程序會初始化 R13,使其指向該模式專用的棧地址,這就是常說的 SP 指針
R14: R14 也稱為連接寄存器(LR), LR 寄存器在 ARM 中主要用作如下兩種用途:
每種處理器模式使用 R14(LR)來存放當前子程序的返回地址,如果使用 BL 或者 BLX 來調用子函數的話,R14(LR)被設置成該子函數的返回地址,在子函數中,將 R14(LR)中的值賦給 R15(PC)即可完成子函數返回,比如在匯編子程序中可以使用如下兩種代碼
MOV PC, LR @直接將寄存器 LR 中的值賦值給 PC,實現跳轉
1
在子函數的入口出將 LR 入棧
PUSH {LR} @通過堆棧將 LR 寄存器壓棧
1
在子函數的最后面出棧即可
POP {PC} @然后將上面壓棧的 LR 寄存器數據出棧給 PC 寄存器 @嚴格意義上來講應該是將LR-4 賦給 PC,因為 3 級流水線,這里只是演示代碼。
1
2
當異常發生以后,該異常模式對應的 R14 寄存器被設置成該異常模式將要返回的地址, R14 也可以當作普通寄存器使用。
程序計數器
程序計數器 R15 也叫做 PC,R15 保存著當前執行的指令地址值加 8 個字節,這是因為 ARM 的流水線機制導致的。ARM 處理器 3 級流水線:取指->譯碼->執行,這三級流水線循環執行, 比如當前正在執行第一條指令的同時也對第二條指令進行譯碼,第三條指令也同時被取出存放 在 R15(PC)中。我們喜歡以當前正在執行的指令作為參考點,也就是以第一條指令為參考點, 那么 R15(PC)中存放的就是第三條指令,換句話說就是 R15(PC)總是指向當前正在執行的指令 地址再加上 2 條指令的地址。對于 32 位的 ARM 處理器,每條指令是 4 個字節,所以: R15 (PC)值 = 當前執行的程序位置 + 8 個字節。
和以前的51單片機PC指針相比,因為三級指令流水線,所以多了個指令偏移值(兩條指令的長度,8個字節)
3.3 程序狀態寄存器
程序狀態寄存器 CPSR 可以在任何模式下被訪問,他包含了條件標志位、中斷禁止位、當前處理器模式標志等一些狀態位以及一些控制位,因為能被所有模式訪問,所以每種模式下各自還存在CPSR寄存器的備份寄存器SPSR,用來保存對應模式運行時的CPSR狀態,這樣即使CPSR被別的模式改變了,通過各自的備份寄存器也能恢復到原來的狀態,但因為User和Sys模式不是異常模式,所以沒有配備SPSR,故不能在 User 和 Sys 模式下訪問 SPSR!
SPSR和CPSR寄存器結構相同,如下圖:
J & T 位表示當前指令集:
Jazelle:允許在某些架構的硬件上加速執行Java bytecode
Thumb:一種16-bit指令模式,在Thumb模式下,較小的opcode有更少的功能性
ThumbEE:在所處的執行環境下,使得指令集能特別適用于執行階段(Runtime)的編碼產生(例如即時編譯)
處理器模式控制位:
ARM 單片機
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。