[嵌入式]Cortex-A8處理器程式設計(上)

丫就是熊個貓貓發表於2016-12-18

Cortex-A8處理器程式設計

3.1 ARM程式設計簡介

·在嵌入式系統開發中,目前使用的主要程式語言是C和彙編。很多地方,例如開機時硬體系統的初始化,包括CPU狀態的設定、中斷的使能、主頻的設定、以及RAM的控制引數及初始化等都使用匯編語言。組合語言是和CPU的指令集緊密相連的,作為涉及底層的嵌入式系統開發,組合語言程式設計不可或缺的重要方法。

·ARM嵌入式系統程式設計和所使用的ARM微處理器資源密切相關。只有瞭解ARM微處理器的工作模式、狀態、儲存器組織、定址方式,並且掌握ARM的指令系統,才有可能寫出適用的ARM程式。

3.2 Cortex-A8處理器模式和狀態

一、處理器模式

 

二、處理器狀態

 Cortex-A8處理器有3種操作狀態,這些狀態由CPSR暫存器的T位和J位控制。

· ARM狀態:執行32位字對齊的ARM指令,T位和J位為0。

· Thumb狀態:執行16位或32位半字對齊的Thumb2指令,T位為1,J位為0。

· ThumbEE狀態:執行為動態產生目標而設計的16位或32位半字對齊的Thumb2指令集的變體。T位和J位為1。

處理器的操作狀態可以在以下幾種狀態間轉換:

 ·ARM狀態和Thumb狀態之間轉換

   使用BL和BLX指令,並載入到PC。

 ·Thumb狀態和ThumbEE狀態之間轉換

   使用ENTERX指令和LEAVEX指令。

   異常會導致處理器進入ARM狀態或Thumb狀態。一般情況,當退出異常處理時,處理器會恢復原來的T位和J位的值。

3.3 Cortex-A8儲存器組織

一、資料型別

Cortex-A8支援以下資料型別:

1)雙字,64位;2)字,32位;3)半字,16位;4)位元組,8位。

    當這些資料型別為無符號資料時,為普通二進位制格式,N位資料值代表一個非負整數(範圍為0~2N-1);當這些資料型別為有符號資料時,為二進位制補碼格式,N位資料值代表一個整數(範圍為-2N-1~2N-1-1)。

為了達到最好的效能,資料必須按照以下方式對齊:

 ·以字為單位時,按4位元組對齊;

 ·以半字為單位時,按2位元組對齊;

 ·以位元組為單位時,按1位元組對齊。

Cortex-A8處理器支援混合大小端格式和非對齊資料訪問。

 

二、儲存格式

Cortex-A8處理器支援小端格式和位元組不變的大端格式。此外,處理器還支援混合大小端格式(既有大端格式又有小端格式)和非對齊資料訪問。對指令的讀取,則總是以小端格式操作。

例如:對於0x12345678資料,大端模式和小端模式的存放如圖所示。

 

三、暫存器組

Cortex-A8處理器總共有40個32位長的暫存器。

· 33個通用暫存器。

·7個狀態暫存器:

——1個CPSR(Current Programs Status Register,當前程式狀態暫存器);

——6個SPSR(Saved Program Status Register,備份程式狀態暫存器)。

這些暫存器不能同時訪問,處理器狀態和操作模式決定了哪些暫存器對程式設計者是可用的。

 

  · 未分組的通用暫存器R0—R7

    16個資料暫存器中R0--R7是未分組的通用暫存器,用來儲存資料和地址。

  ·分組通用暫存器R8—R15,處理器模式決定物理暫存器

    ——R8—R12暫存器:快速中斷及其他模式兩組;

    ——R13,R14暫存器:分7組,使用者和管理模式共用;

            R13:又稱SP,堆疊指標

            R14:又稱LR,連結暫存器

    ——R15:又稱PC,程式計數器,所有模式共用;

  · 當前狀態暫存器CPSR:所有模式共用;

  · 分組的狀態儲存暫存器SPSR:6個異常模式對應。

處理器有兩類程式狀態暫存器:1個當前程式狀態暫存器CPSR和6個狀態儲存暫存器SPSR,主要功能如下:

·儲存最近執行的算術或邏輯運算的資訊;

·控制中斷的允許或禁止;

·設定處理器操作模式。

 

狀態暫存器

·條件標誌位

·Q標誌位

·IT塊

·J位

·GE[3:0]位

·E位

·A位

·控制位

    ——中斷遮蔽位

    ——T位

    ——模式位

·保留位

 

3.4 異常

異常是處理外部非同步事件的一種方法,在有些處理器架構中稱為中斷。

    當某個異常發生時,例如一個來自外圍裝置的中斷,處理器將暫停正常執行的程式。在處理這個異常之前,處理器需要保留當前處理器狀態以便在異常處理程式結束之後恢復原來程式執行。

    若有兩個或更多的異常同時發生,處理器將根據中斷優先順序來處理這些異常。

一、異常入口

二、異常退出

 

三、復位異常(RESET)

復位也是一種異常。當復位訊號產生時,復位發生處理器放棄正在執行的指令。當復位訊號失效之後,處理器會採取如下動作:

·將CPSR置為10011,安全Supervisor模式。

·將CPSR的A、I、F位置為1。

·將CPSR的J位置0,根據CFGTE輸入的狀態來決定CPSR的T位;CPSR的其他位不確定。

·強制PC從復位向量地址中獲取下一條指令。

·根據CFGTE輸入的狀態,在ARM或者Thumb狀態下執行恢復操作。

·復位之後,除了PC和CPSR以外的所有的暫存器的值都是不確定的。

四、快速中斷異常(FIQ)

    FIQ異常支援快速中斷。FIQ模式有8個專用暫存器。可以通過設定CPSR的F標誌位,在特權模式中禁止FIQ。

五、中斷異常(IRQ)

   IRQ比FIQ優先順序低。當處理器進入FIQ處理時,IRQ會被遮蔽。可以通過設定CPSR的I位在特權模式下禁止IRQ異常。

六、中止異常(ABT)

試圖訪問無效的指令或資料記憶體單元通常都會引起中止。

——預取指中止:預讀取中止發生時,處理器將標誌這條預讀取指令無效,但是直到執行這條指令才產生異常。

——資料中止:試圖訪問無效的資料記憶體單元引起。

七、軟體中斷異常

SVC指令進入管理模式,通常是為了請求一個特殊的管理員功能。SVC處理程式通過讀取操作碼來提取SVC功能號。

八、監控異常

當處理器執行SMC指令,核心進入監控模式請求監控功能。使用者程式執行SMC會導致一個未定義的指令異常發生。

九、未定義指令異常

當遇到一條處理器或系統協處理器無法處理的指令時,則產生未定義指令異常。軟體可以利用這種機制,通過模擬未定義的協處理器指令來擴充套件ARM指令集。

十、斷點指令

執行斷點指令BKPT,產生一個預取中止異常。在指令到達流水線執行階段前,不會引起處理器產生預取中止異常。

 

異常向量與優先順序

異常出現後處理器強制從異常型別所對應的固定儲存器地址開始執行程式,這些地址稱為異常向量(exception vectors)。在沒有進行虛擬記憶體對映時,異常向量表放置於實體記憶體地址最低處

 

異常的進入

當處理一個異常時,ARM9核心完成以下動作:

(1)將下一條指令的地址儲存在相應的LR暫存器中。

(2)將CPSR複製到相應的SPSR中。

(3)迫使CPSR模式位M[4:0]的值設定成對應的異常模式值

(4)迫使PC從相關的異常向量取下一條指令。

(5)使用者可以設定中斷禁止位來阻止或開啟異常巢狀。如果在異常發生時處理器是在Thumb狀態下,自動切換進入ARM狀態。

異常的退出

在完成異常處理後,ARM9完成以下動作:

(1)將LR暫存器的值減去相應的偏移量(偏移量根據異常的不同而不同),送到PC中。

(2)將SPSR複製回CPSR中。

(3)清除中斷禁止位標誌。

 

 

 

相關文章