新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM處理器模式和片內寄存器, ARM 異常及中斷

        ARM處理器模式和片內寄存器, ARM 異常及中斷

        作者: 時間:2016-11-09 來源:網絡 收藏
        中斷和異常的區別:中斷時從外至內的, 異常時由內發出的


        一、存儲器格式(字對齊):

        本文引用地址:http://www.104case.com/article/201611/317755.htm

        Arm體系結構將存儲器看做是從零地址開始的字節的線性組合。從零字節到三字節放置第一個存儲的字(32位)數據,從第四個字節到第七個字節放置第二個存儲的字數據,一次排列。作為32位的微處理器,arm體系結構所支持的最大尋址空間為4GB。

        存儲器格式

        1、大端格式:高字節在低地址,低字節在高地址;

        2、小端格式:高字節在高地址,低字節在低地址;

        指令長度:

        Arm微處理器的指令長度是32位的,也可以為16位(thumb狀態下)。Arm微處理器中支持字節(8位),半字(16位),字(32位)三種數據類型,其中,字需要4字節對齊,半字需要2字節對齊。

        注:所謂的指令長度是一條完整的指令的長度,而不是單純的mov這3個字母長度

        二、ARM體系的CPU有兩種工作狀態

           1、ARM狀態:處理器執行32位的字對齊的ARM指令;

        2、Thumb狀態:處理器執行16位的、半字對齊的Thumb指令;

        在程序運行的過程中,可以在兩種狀態之間進行相應的轉換。處理器工作狀態的轉變并不影響處理器的工作模式和相應寄存器中的內容。

        CPU上電處于ARM狀態

        三、ARM體系的CPU有以下7種工作模式:

        1、用戶模式(Usr):用于正常執行程序;

        2、快速中斷模式(FIQ):用于高速數據傳輸;

        3、外部中斷模式(IRQ):用于通常的中斷處理;

        4、管理模式(svc):操作系統使用的保護模式;

        5、數據訪問終止模式(abt):當數據或指令預取終止時進入該模式,可用于虛擬存儲以及存儲保護;

        6、系統模式(sys):運行具有特權的操作系統任務;

        7、未定義指令中止模式(und):當未定義的指令執行時進入該模式,可用于支持硬件;

        ARM Context-A*架構的有8中模式

        這里所指的片內寄存器是指CPU內部的寄存器, 而控制GPIO的寄存器屬于外設。

        參考:http://infocenter.arm.com/help/index.jsp arm官網對應系列文檔

        Arm的工作模式切換有兩種方法:

        被動切換:在arm運行的時候產生一些異常或者中斷來自動進行模式切換

        主動切換:通過軟件改變,即軟件設置寄存器來經行arm的模式切換,應為arm的工作模式都是可以通過相應寄存器的賦值來切換的。

        Tips:當處理器運行在用戶模式下,某些被保護的系統資源是不能被訪問的。

        除用戶模式外,其余6種工作模式都屬于特權模式;

        特權模式中除了系統模式以外的其余5種模式稱為異常模式;

        大多數程序運行于用戶模式;

        進入特權模式是為了處理中斷、異常、或者訪問被保護的系統資源;

        四、寄存器

        ARM有31個通用的32位寄存器,6個程序狀態寄存器,共分為7組,有些寄存器是所有工作模式共用的,還有一些寄存器專屬于每一種工作模式;

        R13——棧指針寄存器,用于保存堆棧指針

        R14——程序連接寄存器,當執行BL子程序調用指令時,R14中得到R15的備份,而當發生中斷或異常時,R14保存R15的返回值;

        R15——程序計數器;

        快速中斷模式有7個備份寄存器R8—R14,這使得進入快速中斷模式執行很大部分程序時,甚至不需要保存任何寄存器;

        其它特權模式都含有兩個獨立的寄存器副本R13、R14,這樣可以令每個模式都擁有自己的堆棧指針和連接寄存器;

        五、當前程序狀態寄存器(CPSR)

        CPSR中各位意義如下:

        T位:1——CPU處于Thumb狀態, 0——CPU處于ARM狀態;

        I、F(中斷禁止位): 1——禁止中斷, 0——中斷使能;

        工作模式位:可以改變這些位,進行模式切換;

        六、程序狀態保存寄存器(SPSR)

        當切換進入某一個特權模式時,SPSR保存前一個工作模式的CPSR值,這樣,當返回前一個工作模式時,可以將SPSR的值恢復到CPSR中;

        七、模式切換

        當異常發生,CPU進入相應的異常模式時,以下工作是由CPU自動完成的:

        1、在異常模式的R14中保存前一工作模式的下一條即將執行的指令地址;

        2、將CPSR的值到異常模式的SPSR中;

        3、將CPSR的工作模式設為該異常模式對應的工作模式;

        4、令PC值等于這個異常模式在異常向量表中的地址,即跳轉去執行異常向量表中的相應指令;

        從異常工作模式退回到之前的工作模式時,需要由軟件來完成以下工作:

        1、將異常模式的R14減去一個適當的值(4或8)后賦給PC寄存器;

        2、將異常模式SPSR的值賦給CPSR;

        ARM 有七種異常,當異常發生時,ARM core 會自動執行 Vector Table 中的指令。

        ARM 的七種異常及在 Vector Table 種的偏移:

        異常

        模式

        向量表偏移

        復位(reset)

        SVC

        +0x00

        未定義指令

        UND

        +0x04

        軟件中斷(SWI)

        SVC

        +0x08

        預取指終止

        ABT

        +0x0c

        數據終止

        ABT

        +0x10

        未分配

        --

        +0x14

        IRQ

        IRQ

        +0x18

        FIQ

        FIQ

        +0x1c

        ARM V4 以下版本 Vector Table 的地址為 0x00000000,V4 以上版本 Vector Table 地址可在 0x00000000,0xFFFF0000 間進行選擇。

        ARM 構架下,中斷為異常的一種。以中斷為例,當接收到中斷后,ARM core 首先將當前模式下的 CPSR,PC 寄存器分別保存到異常模式下的 SPSR,LR 寄存器,然后將目標模式的 PC 寄存器值設為地址 0x00000018(或0xFFFF0018),最后切換到目標模式----即 IRQ 模式。切換到目標模式后執行的第一條指令便是地址 0x00000018(或0xFFFF0018)上的指令。此處一般為一個跳轉指令,用于跳轉執行中斷處理函數。其它異常處理方式相似。

        S3C6410 中有個 32KBIROM(internel ROM),里面固化了一段程序。其開頭就是一個 Vector Table。以 IROM 模式啟動時,IROM 被映射到 0x00000000 位置,所以執行的第一條指令便是 Vector Table 中的 Reset 異常跳轉指令(ARM core 上電時在 0 地址取第一條指令)。我們可以利用此 IROM 的異常向量表實現 u-boot 下的中斷處理。

        剛上電,初始化中斷,使S3C6410 能接收并處理中斷。中斷發生后,先執行 0x00000018 中的異常跳轉,轉去執行 IROM 中的中斷處理函數。此處理函數很簡單:將 0x0C001FF8 (落于 SRAM 地址范圍)處的值賦給 PC。所以,我們可將我們自己的中斷處理函數的入口地址存于 0x0C001FF8 處,當中斷發生后,便會自動調用我們的中斷處理函數。其它異常的實現方法類似,只是 0x0C001FF8 要改成別的值。具體為何值,需分析 IROM 中的代碼。

        S3C6410 IROM 的反匯編代碼,可以在網上搜索到。或者也可以自己提取進行反匯編。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 正镶白旗| 江源县| 三都| 东宁县| 石林| 紫云| 普陀区| 重庆市| 金山区| 光山县| 班戈县| 三明市| 松溪县| 柘城县| 襄樊市| 南康市| 增城市| 郓城县| 临沭县| 巢湖市| 建平县| 辽阳县| 逊克县| 墨玉县| 石门县| 抚松县| 南投市| 庆云县| 油尖旺区| 扶绥县| 化隆| 儋州市| 临潭县| 连江县| 盈江县| 桦甸市| 乐陵市| 潢川县| 即墨市| 象州县| 兴山县|