單片機

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

ARM架構基礎知識小結

ARM全國巡迴技術講座 - 第一場:最新ARM+Android智能終端設計案例 - 創客學院直播室?

www.makeru.com.cn
圖標

通用寄存器

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位的。 

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匯流排介面以獲取外部數據。

如何使用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為只寫寄存器,如果讀它則會造成不可估計的後果。

AP賦值表

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

關於C、B賦值

以下有關於兩種寫緩存,寫通以及寫回。寫回法是指CPU在執行寫操作時,被寫的數據只寫入cache,不寫入主存,僅當需要替換時,才把已經修改的cache塊寫回到主存中。寫通法是指CPU在執行寫操作時,必須把數據同時寫入cache和主存。

AHB/APB是什麼

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纔可以被正常供應。

推薦閱讀:

相關文章