天天看點

arm架構基礎知識小結前言ARM的曆史版本通用寄存器ARM的各個模式啟動檔案MMU相關位址基本概念 時鐘以及總線概念DMA

前言

        從單片機轉到ARM,主要需要學習ARM的架構,ARM相比單片機多了一些外設和總線。在僅僅是裸奔的情況下,如果熟悉了ARM架構,那麼我認為使用任何ARM架構的晶片和用單片機将沒有差別。ARM架構之是以更複雜,當然是為了跑更快以及更好地支援片上系統,是以在某種程度上來說對片上系統不是很了解的話那對于ARM架構的了解也不會那麼深。

ARM的曆史版本

        ARM7TDMI是基于ARMv4T架構的。

        ARMv5TE架構則是伴随着ARM9E處理器家族亮相的。

        ARM11是基于ARMv6架構基于ARMv6架構的處理器包括ARM1136J(F)-S,ARM1156T2(F)-S,以及ARM1176JZ(F)-S。

        最近的幾年,基于從ARMv6開始的新設計理念,ARM進一步擴充了它的CPU設計,成果就是ARMv7架構的閃亮登場。在這個版本中,核心架構首次從單一款式變成3種款式。

        就拿ARM7TDMI來說,T代表Thumb指令集,D是說支援JTAG調試(Debugging),M意指快速乘法器,I則對應一個嵌入式ICE子產品。後來,這4項基本功能成了任何新産品的标配,于是就不再使用這4個字尾——相當于默許了。

arm架構基礎知識小結前言ARM的曆史版本通用寄存器ARM的各個模式啟動檔案MMU相關位址基本概念 時鐘以及總線概念DMA

通用寄存器

        R13通常被用作棧指針,進入異常模式時,可以将需要使用的寄存器儲存在R13所指的棧中;當退出異常吹程式時,将儲存在R13所指的棧中的寄存器值彈出。

        R14又被稱為連接配接寄存器(LinkRegister,LR),即PC的傳回值。

        R15又被記作PC。ARM指令是字對齊的,PC的值的第0位和第1位總為0。也就是說是32位對齊。

arm架構基礎知識小結前言ARM的曆史版本通用寄存器ARM的各個模式啟動檔案MMU相關位址基本概念 時鐘以及總線概念DMA

        就Cortex-M3來說,擁有R0-R15的寄存器組。其中R13作為堆棧指針SP。SP有兩個,分别為R13(MSP)和R13(PSP)即主堆棧指針(MSP)和程序堆棧指針(PSP),但在同一時刻隻能有一個可以看到,這也就是所謂的“banked”寄存器。這些寄存器都是32位的。

ARM的各個模式

        ARM有以下7種模式:

        使用者模式(User,usr)                                     正常程式執行的模式

        快速中斷模式(FIQ,fiq)                               用于高速資料傳輸和通道處理

        外部中斷模式(IRQ,irq)                              用于通常的中斷處理

        特權模式(Supervisor,svc)                          供作業系統使用的一種保護模式

        資料通路中止模式(Abort,abt)                用于虛拟存儲及存儲保護

        未定義指令中止模式(Undefined,und)  用于支援通過軟體方針硬體的協處理器

        系統模式(System,sys)                                用于運作特權級的作業系統任務

        其中除了使用者模式之外都稱之為特權模式(privileged modes),而在privileged modes中除了系統模式其它都稱為異常模式,即exception mode。起初關于異常這個詞我的了解有些偏差,我認為異常模式就是這個系統出錯了,而實際上不是。exception mode的意思是例外,意思是“這模式什麼時候會發生不好說……”,比如說來了個外部中斷也會進入異常模式,但是此時系統是運作完好的。

        其中SVC用于在系統剛啟動的啟動檔案BOOT程式中,跳轉到kernel之前必須為SVC,SVC具有最高權限,可以對任何寄存器進行操作。在裸機程式中我們有時候會一直處于SVC模式下。

        關于什麼時候會進入使用者模式或者系統模式,以下是我的猜測,比如進入linux kernel之後會設定成sys模式,比如任務排程等等都會在sys模式中,而執行使用者編寫的應用程式時,系統是處于usr模式中。以上猜測需要在linux中找出證據驗證。

        其中FIQ,IRQ為中斷模式,有中斷發生時會進入FIQ模式或者IRQ模式,至于到底是進入哪個模式是由開發者設定的。理論上FIQ模式的響應速度比IRQ模式要快。

        其中abt模式通常發生于在通路位址沒有對齊時的情況,此時會跳轉到abt所屬的中斷向量位址中去。und模式應該是取到指令之後發現指令不能用,,此時會跳轉到abt所屬的中斷向量位址中去。以上兩種模式應該是開發過程中出現BUG才會進入的,也是一種調試手段,在版本發行之前應該消除這些錯誤(我猜= =)。

啟動檔案

        這一部分隻要了解一下協處理器CP15的相關作用以及ARM或者THUMB彙編再看一下網上的例程以及解釋應該不難了解。

        在啟動檔案中我們可以做任何事情,但是通常我們可以做這些:改變程式大小端排序,關閉看門狗,屏蔽中斷,設定各個時鐘,設定從SLEEP或者IDLE啟動時的程式,初始化SDRAM,設定各模式指向的堆棧,設定好中斷向量表,判斷是從NOR還是NAND FLASH啟動,将檔案拷到SDRAM中,運作Main。         以上也說明了為什麼需要一個彙編寫的啟動檔案,設定各個模式下的SP指針以及初始化中斷向量的跳轉(ARM的中斷較多設定也較靈活)也隻有彙編幹比較合适了。甚至在SOC(片上系統)中每個任務都有自己的堆棧,是以改變堆棧指針的那一部分程式也是放在彙編裡做的。總之了解啟動檔案是一個非常好的切入點。

MMU相關位址基本概念

        關于MMU,因為多種儲存設備的實體位址不同以及不連貫性,将其位址安放在合理的連續虛拟位址上是很必要的,是以MMU出現了。MMU即将不同的位址放在合适的虛拟位址中,以便排程。比如要跑LINUX必須要有MMU的支援才行。

        ARM920T中有三種類型的位址:

        虛拟位址(VA),變換後的虛拟位址(MVA),實體位址(PA)。

        以下是一個當一個指令被請求時位址所做操作的例子:

        1、  指令VA(IVA)被ARM920T發出

        2、  它被ProcID(目前程序所在的程序空間塊的編号)轉換成指令MVA(IMVA),指令CACHE(ICACHE)和MMU看到的就是IMVA。

        3、  如果在IMMU上的保護子產品确認IMVA不會被中斷,并且IMVA标簽也在ICACHE中,指令資料會讀出并傳回到ARM920T核心中。

        4、  如果IMVA tag并不在ICACHE中,那麼IMMU會産生出一個指令PA(IPA)。位址會給AMBA總線接口以擷取外部資料。

arm架構基礎知識小結前言ARM的曆史版本通用寄存器ARM的各個模式啟動檔案MMU相關位址基本概念 時鐘以及總線概念DMA

        那麼VA是如何被PID轉換為MVA的呢?

        這有關于CP15中的13,FCSE PID register

        R13是fast context switch extension(FCSE 快速上下文切換擴充)processidentifier(PID 程序辨別符)寄存器,此寄存器複位時為0。

        讀R13會得到FCSE PID的值,寫R13會更新FCSE PID的值到[31:25]中,位[24:0]應該是零。

        如何使用FCSE PID:

        920T核心發出的位址都是0-32MB的範圍,4GB的逆序空間被分成了1238個程序空間塊,每個程序空間塊大小為32MB。每個程序空間塊中可以包含一個程序。系統128個程序空間塊的編号0-127,編号為I的程序空間塊中的程序實際使用的虛拟位址空間為(I*0x02000000)到(I*0x02000000+0x01FFFFFF)。

        是以VA通常高7位都為0時 MVA = VA | (PID << 25)

當VA高7位不為0時 MVA = VA,這種VA是本程序用于通路别的程序中的資料和指令的虛拟位址,注意這時被通路的程序辨別符不能為0。

        注意:當FCSE_PID為0時,即目前複位,則目前920T和CACHES及MMU之間是平面映射的關系(很巧妙:))。

        TLB是什麼?

        TLB即translate look-aside buffer,快表就是存儲幾個常用的頁表,以提高系統運作的速度。在更新頁表之前要使其無效,其操作的寄存器為R8,R8為隻寫寄存器,如果讀它則會造成不可估計的後果。

arm架構基礎知識小結前言ARM的曆史版本通用寄存器ARM的各個模式啟動檔案MMU相關位址基本概念 時鐘以及總線概念DMA

        AP指派表:

arm架構基礎知識小結前言ARM的曆史版本通用寄存器ARM的各個模式啟動檔案MMU相關位址基本概念 時鐘以及總線概念DMA

        而DOMAIN的指派則是在C3中的,32bit共有16個域,每個域分兩個bit,這兩個bit控制目前域的權限。而以上四個bit是為了選擇0-15個域的其中一個。

        關于C、B指派:

arm架構基礎知識小結前言ARM的曆史版本通用寄存器ARM的各個模式啟動檔案MMU相關位址基本概念 時鐘以及總線概念DMA

        以上有關于兩種寫緩存,寫通以及寫回。寫回法是指CPU在執行寫操作時,被寫的資料隻寫入cache,不寫入主存,僅當需要替換時,才把已經修改的cache塊寫回到主存中。寫通法是指CPU在執行寫操作時,必須把資料同時寫入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),主要用于系統高性能、高時速速率子產品間通信。

        APB(AdvancedPeripheral Bus),主要用于慢速片上外設與ARM核的通訊。

        AHB私有外設總線,隻用于CM3内部的AHB外設,它們是:NVIC,FPB, DWT和ITM。

        APB私有外設總線,既用于CM3内部的APB裝置,也用于外部裝置(這裡的“外部”是對核心而言)。CM3允許器件制造商再添加一些片上APB外設到APB私有總線上,它們通過APB接口來通路。

四種耗電模式:

         NORMAL,SLOW,IDLE,SLEEP

         先配置主PLL MPLL給CPU用。在上電複位的時候PLL是不穩定的,是以在PLLCON在被軟體配置之前Fin直接是跳過MPll給FCLK,是以不配置PLLCON也是可以正常工作。即使工作在正常狀态下,也可以對MPLLCON進行配置,配置之後等待PLL Lock-time過後内部各子產品的CLK才可以被正常供應。

DMA

        閱讀晶片手冊即可。