從單片機轉(zhuǎn)到ARM,主要需要學習ARM的架構(gòu),ARM相比單片機多了一些外設和總線。在僅僅是裸奔的情況下,如果熟悉了ARM架構(gòu),那么我認為使用任何ARM架構(gòu)的芯片和用單片機將沒有區(qū)別。ARM架構(gòu)之所以更復雜,當然是為了跑更快以及更好地支持片上系統(tǒng),所以在某種程度上來說對片上系統(tǒng)不是很了解的話那對于ARM架構(gòu)的理解也不會那么深。
本文首先介紹了ARM的架構(gòu)圖及各個模式,其次介紹了通用寄存器、MMU相關地址基本概念、ARM920T中有三種類型的地址等,最后闡述了ARM處理器的架構(gòu)及命名規(guī)則。
一、ARM架構(gòu)圖
下圖所示的是ARM構(gòu)架圖。它由32位ALU、若干個32位通用寄存器以及狀態(tài)寄存器、32&TImes;8位乘法器、32&TImes;32位桶形移位寄存器、指令譯碼以及控制邏輯、指令流水線和數(shù)據(jù)/地址寄存器組成。
1.ALU:它有兩個操作數(shù)鎖存器、加法器、邏輯功能、結(jié)果以及零檢測邏輯構(gòu)成。
2.桶形移位寄存器:ARM采用了32&TImes;32位的桶形移位寄存器,這樣可以使在左移/右移n位、環(huán)移n位和算術(shù)右移n位等都可以一次完成。
3.高速乘法器:乘法器一般采用“加一移位”的方法來實現(xiàn)乘法。ARM為了提高運算速度,則采用兩位乘法的方法,根據(jù)乘數(shù)的2位來實現(xiàn)“加一移位”運算;ARM高速乘法器采用32&TImes;8位的結(jié)構(gòu),這樣,可以降低集成度(其相應芯片面積不到并行乘法器的1/3)。
4.浮點部件:浮點部件是作為選件供ARM構(gòu)架使用。FPA10浮點加速器是作為協(xié)處理方式與ARM相連,并通過協(xié)處理指令的解釋來執(zhí)行。
5.控制器:ARM的控制器采用的是硬接線的可編程邏輯陣列PLA。
6.寄存器
二、ARM的各個模式
ARM有以下7種模式:
用戶模式(User,usr) 正常程序執(zhí)行的模式
快速中斷模式(FIQ,fiq) 用于高速數(shù)據(jù)傳輸和通道處理
外部中斷模式(IRQ,irq) 用于通常的中斷處理
特權(quán)模式(Supervisor,svc) 供操作系統(tǒng)使用的一種保護模式
數(shù)據(jù)訪問中止模式(Abort,abt) 用于虛擬存儲及存儲保護
未定義指令中止模式(Undefined,und) 用于支持通過軟件方針硬件的協(xié)處理器
系統(tǒng)模式(System,sys) 用于運行特權(quán)級的操作系統(tǒng)任務
其中除了用戶模式之外都稱之為特權(quán)模式(privileged modes),而在privileged modes中除了系統(tǒng)模式其它都稱為異常模式,即exception mode。起初關于異常這個詞我的理解有些偏差,我認為異常模式就是這個系統(tǒng)出錯了,而實際上不是。exception mode的意思是例外,意思是“這模式什么時候會發(fā)生不好說……”,比如說來了個外部中斷也會進入異常模式,但是此時系統(tǒng)是運行完好的。
其中SVC用于在系統(tǒng)剛啟動的啟動文件BOOT程序中,跳轉(zhuǎn)到kernel之前必須為SVC,SVC具有最高權(quán)限,可以對任何寄存器進行操作。在裸機程序中我們有時候會一直處于SVC模式下。
關于什么時候會進入用戶模式或者系統(tǒng)模式,以下是我的猜測,比如進入linux kernel之后會設置成sys模式,比如任務調(diào)度等等都會在sys模式中,而執(zhí)行用戶編寫的應用程序時,系統(tǒng)是處于usr模式中。以上猜測需要在linux中找出證據(jù)驗證。
其中FIQ,IRQ為中斷模式,有中斷發(fā)生時會進入FIQ模式或者IRQ模式,至于到底是進入哪個模式是由開發(fā)者設定的。理論上FIQ模式的響應速度比IRQ模式要快。
其中abt模式通常發(fā)生于在訪問地址沒有對齊時的情況,此時會跳轉(zhuǎn)到abt所屬的中斷向量地址中去。und模式應該是取到指令之后發(fā)現(xiàn)指令不能用,,此時會跳轉(zhuǎn)到abt所屬的中斷向量地址中去。以上兩種模式應該是開發(fā)過程中出現(xiàn)BUG才會進入的,也是一種調(diào)試手段,在版本發(fā)行之前應該消除這些錯誤。
三、通用寄存器
R13通常被用作棧指針,進入異常模式時,可以將需要使用的寄存器保存在R13所指的棧中;當退出異常吹程序時,將保存在R13所指的棧中的寄存器值彈出。
R14又被稱為連接寄存器(LinkRegister,LR),即PC的返回值。
R15又被記作PC。ARM指令是字對齊的,PC的值的第0位和第1位總為0。也就是說是32位對齊。
就Cortex-M3來說,擁有R0-R15的寄存器組。其中R13作為堆棧指針SP。SP有兩個,分別為R13(MSP)和R13(PSP)即主堆棧指針(MSP)和進程堆棧指針(PSP),但在同一時刻只能有一個可以看到,這也就是所謂的“banked”寄存器。這些寄存器都是32位的。
四、MMU相關地址基本概念
關于MMU,因為多種存儲設備的物理地址不同以及不連貫性,將其地址安放在合理的連續(xù)虛擬地址上是很必要的,所以MMU出現(xiàn)了。MMU即將不同的地址放在合適的虛擬地址中,以便調(diào)度。比如要跑LINUX必須要有MMU的支持才行。
五、ARM920T中有三種類型的地址
虛擬地址(VA),變換后的虛擬地址(MVA),物理地址(PA)。
以下是一個當一個指令被請求時地址所做操作的例子:
1、 指令VA(IVA)被ARM920T發(fā)出
2、 它被ProcID(當前進程所在的進程空間塊的編號)轉(zhuǎn)換成指令MVA(IMVA),指令CACHE(ICACHE)和MMU看到的就是IMVA。
3、 如果在IMMU上的保護模塊確認IMVA不會被中斷,并且IMVA標簽也在ICACHE中,指令數(shù)據(jù)會讀出并返回到ARM920T內(nèi)核中。
4、 如果IMVA tag并不在ICACHE中,那么IMMU會產(chǎn)生出一個指令PA(IPA)。地址會給AMBA總線接口以獲取外部數(shù)據(jù)。
那么VA是如何被PID轉(zhuǎn)換為MVA的呢?
這有關于CP15中的13,F(xiàn)CSE PID register
R13是fast context switch extension(FCSE 快速上下文切換擴展)processidentifier(PID 進程標識符)寄存器,此寄存器復位時為0。
讀R13會得到FCSE PID的值,寫R13會更新FCSE PID的值到[31:25]中,位[24:0]應該是零。
如何使用FCSE PID:
920T內(nèi)核發(fā)出的地址都是0-32MB的范圍,4GB的逆序空間被分成了1238個進程空間塊,每個進程空間塊大小為32MB。每個進程空間塊中可以包含一個進程。系統(tǒng)128個進程空間塊的編號0-127,編號為I的進程空間塊中的進程實際使用的虛擬地址空間為(I*0x02000000)到(I*0x02000000+0x01FFFFFF)。
所以VA通常高7位都為0時 MVA = VA | (PID 《《 25)
當VA高7位不為0時 MVA = VA,這種VA是本進程用于訪問別的進程中的數(shù)據(jù)和指令的虛擬地址,注意這時被訪問的進程標識符不能為0。
注意:當FCSE_PID為0時,即當前復位,則當前920T和CACHES及MMU之間是平面映射的關系(很巧妙:))。
六、TLB是什么
TLB即translate look-aside buffer,快表就是存儲幾個常用的頁表,以提高系統(tǒng)運行的速度。在更新頁表之前要使其無效,其操作的寄存器為R8,R8為只寫寄存器,如果讀它則會造成不可估計的后果。
七、AP賦值表
而DOMAIN的賦值則是在C3中的,32bit共有16個域,每個域分兩個bit,這兩個bit控制當前域的權(quán)限。而以上四個bit是為了選擇0-15個域的其中一個。
八、關于C、B賦值
以上有關于兩種寫緩存,寫通以及寫回。寫回法是指CPU在執(zhí)行寫操作時,被寫的數(shù)據(jù)只寫入cache,不寫入主存,僅當需要替換時,才把已經(jīng)修改的cache塊寫回到主存中。寫通法是指CPU在執(zhí)行寫操作時,必須把數(shù)據(jù)同時寫入cache和主存。
九、時鐘以及總線概念
FCLK, HCLK, andPCLK
FCLK is used byARM920T.
HCLK is used forAHB bus, which is used by the ARM920T, the memory controller, the interruptcontroller, the LCD controller, the DMA and USB host block.
PCLK is used forAPB bus, which is used by the peripherals such as WDT, IIS, I2C, PWM timer, MMCinterface,ADC, UART, GPIO, RTC and SPI.
What is AHB/APB?
InternalAdvanced Microcontroller Bus Architecture(AMBA)是一種總線標準,以下兩項都符合此標準。
AHB(AdvancedHigh performance Bus),主要用于系統(tǒng)高性能、高時速速率模塊間通信。
APB(AdvancedPeripheral Bus),主要用于慢速片上外設與ARM核的通訊。
AHB私有外設總線,只用于CM3內(nèi)部的AHB外設,它們是:NVIC,F(xiàn)PB, DWT和ITM。
APB私有外設總線,既用于CM3內(nèi)部的APB設備,也用于外部設備(這里的“外部”是對內(nèi)核而言)。CM3允許器件制造商再添加一些片上APB外設到APB私有總線上,它們通過APB接口來訪問。
十、四種耗電模式
NORMAL,SLOW,IDLE,SLEEP
先配置主PLL MPLL給CPU用。在上電復位的時候PLL是不穩(wěn)定的,所以在PLLCON在被軟件配置之前Fin直接是跳過MPll給FCLK,所以不配置PLLCON也是可以正常工作。即使工作在正常狀態(tài)下,也可以對MPLLCON進行配置,配置之后等待PLL Lock-time過后內(nèi)部各模塊的CLK才可以被正常供應。
十一、arm處理器架構(gòu)詳解
那架構(gòu)呢?再來看一張圖。
其中左側(cè)的就是架構(gòu),右側(cè)的是處理器,也可以叫核。arm首個最成功的cpu是ARM7TDMI,是基于ARMv4的。ARM架構(gòu)包含了下述RISC特性:
讀取/儲存 架構(gòu)
不支援地址不對齊內(nèi)存存取(ARMv6內(nèi)核現(xiàn)已支援)
正交指令集(任意存取指令可以任意的尋址方式存取數(shù)據(jù)Orthogonal instrucTIon set)
大量的16 &TImes; 32-bit 寄存器陣列(register file)
固定的32 bits 操作碼(opcode)長度,降低編碼數(shù)量所產(chǎn)生的耗費,減輕解碼和流水線化的負擔。
大多均為一個CPU周期執(zhí)行。
不同版本的架構(gòu)會有所調(diào)整。
和三星相同的其他和arm合作的各大廠商通常會把它的CPU和各類外圍IP都放到一起,然后自己拿著圖紙去流片,生產(chǎn)出來的也是一個正方形,下面有很多引腳,這個東西不僅包含了CPU,還包含了其他的控制器,這個東西就叫做SOC(system on chip)。從英文來看,所謂的四核SOC什么的,本意就不是單指CPU,而是四核系統(tǒng)。
所以目前各大廠商所做的事情,就是買來ARM的授權(quán),得到ARM處理器的源代碼,而后自己搞一些外圍IP(或者買或者自己設計),組成一個SOC后,去流片。不同的SOC,架構(gòu)不同(就是CPU如何和IP聯(lián)系起來,有的以總線為核心,有的以DDR為核心),所以,海思是擁有自主產(chǎn)權(quán)的SOC架構(gòu)。可是,無論任何廠商,再怎么折騰,都沒有怎么動過CPU,ARM核心就好好的呆在那里,那就是中央處理器。
目前ARM的產(chǎn)品天梯:
ARM命名規(guī)則:
第一個數(shù)字:系列名稱:eg.ARM7、ARM9
第二個數(shù)字:Memory system
2:帶有MMU
4:帶有MPU
6:無MMU與MPU
第三個數(shù)字:Memory size
0:標準Cache(4-128k)
2:減小的Cache
6:可變的Cache
第四個字符:T:表示支持Thumb指令集
D:表示支持片上調(diào)試(Debug)
M:表示內(nèi)嵌硬件乘法器(MulTIplier)
I :支持片上斷點和調(diào)試點
E:表示支持增強型DSP功能
J :表示支持Jazelle技術(shù),即Java加速器
S:表示全合成式
-
ARM處理器
+關注
關注
6文章
361瀏覽量
41955 -
ARM架構(gòu)
+關注
關注
15文章
177瀏覽量
36469
發(fā)布評論請先 登錄
相關推薦
評論