<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM處理器模式和片內(nèi)寄存器, ARM 異常及中斷

          ARM處理器模式和片內(nèi)寄存器, ARM 異常及中斷

          作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          中斷和異常的區(qū)別:中斷時從外至內(nèi)的, 異常時由內(nèi)發(fā)出的


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

          本文引用地址:http://www.ex-cimer.com/article/201611/317755.htm

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

          存儲器格式

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

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

          指令長度:

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

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

          二、ARM體系的CPU有兩種工作狀態(tài)

             1、ARM狀態(tài):處理器執(zhí)行32位的字對齊的ARM指令;

          2、Thumb狀態(tài):處理器執(zhí)行16位的、半字對齊的Thumb指令;

          在程序運行的過程中,可以在兩種狀態(tài)之間進(jìn)行相應(yīng)的轉(zhuǎn)換。處理器工作狀態(tài)的轉(zhuǎn)變并不影響處理器的工作模式和相應(yīng)寄存器中的內(nèi)容。

          CPU上電處于ARM狀態(tài)

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

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

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

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

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

          5、數(shù)據(jù)訪問終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時進(jìn)入該模式,可用于虛擬存儲以及存儲保護(hù);

          6、系統(tǒng)模式(sys):運行具有特權(quán)的操作系統(tǒng)任務(wù);

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

          ARM Context-A*架構(gòu)的有8中模式

          這里所指的片內(nèi)寄存器是指CPU內(nèi)部的寄存器, 而控制GPIO的寄存器屬于外設(shè)。

          參考:http://infocenter.arm.com/help/index.jsp arm官網(wǎng)對應(yīng)系列文檔

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

          被動切換:在arm運行的時候產(chǎn)生一些異?;蛘咧袛鄟碜詣舆M(jìn)行模式切換

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

          Tips:當(dāng)處理器運行在用戶模式下,某些被保護(hù)的系統(tǒng)資源是不能被訪問的。

          除用戶模式外,其余6種工作模式都屬于特權(quán)模式;

          特權(quán)模式中除了系統(tǒng)模式以外的其余5種模式稱為異常模式;

          大多數(shù)程序運行于用戶模式;

          進(jìn)入特權(quán)模式是為了處理中斷、異常、或者訪問被保護(hù)的系統(tǒng)資源;

          四、寄存器

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

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

          R14——程序連接寄存器,當(dāng)執(zhí)行BL子程序調(diào)用指令時,R14中得到R15的備份,而當(dāng)發(fā)生中斷或異常時,R14保存R15的返回值;

          R15——程序計數(shù)器;

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

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

          五、當(dāng)前程序狀態(tài)寄存器(CPSR)

          CPSR中各位意義如下:

          T位:1——CPU處于Thumb狀態(tài), 0——CPU處于ARM狀態(tài);

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

          工作模式位:可以改變這些位,進(jìn)行模式切換;

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

          當(dāng)切換進(jìn)入某一個特權(quán)模式時,SPSR保存前一個工作模式的CPSR值,這樣,當(dāng)返回前一個工作模式時,可以將SPSR的值恢復(fù)到CPSR中;

          七、模式切換

          當(dāng)異常發(fā)生,CPU進(jìn)入相應(yīng)的異常模式時,以下工作是由CPU自動完成的:

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

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

          3、將CPSR的工作模式設(shè)為該異常模式對應(yīng)的工作模式;

          4、令PC值等于這個異常模式在異常向量表中的地址,即跳轉(zhuǎn)去執(zhí)行異常向量表中的相應(yīng)指令;

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

          1、將異常模式的R14減去一個適當(dāng)?shù)闹担?或8)后賦給PC寄存器;

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

          ARM 有七種異常,當(dāng)異常發(fā)生時,ARM core 會自動執(zhí)行 Vector Table 中的指令。

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

          異常

          模式

          向量表偏移

          復(fù)位(reset)

          SVC

          +0x00

          未定義指令

          UND

          +0x04

          軟件中斷(SWI)

          SVC

          +0x08

          預(yù)取指終止

          ABT

          +0x0c

          數(shù)據(jù)終止

          ABT

          +0x10

          未分配

          --

          +0x14

          IRQ

          IRQ

          +0x18

          FIQ

          FIQ

          +0x1c

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

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

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

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

          S3C6410 IROM 的反匯編代碼,可以在網(wǎng)上搜索到?;蛘咭部梢宰约禾崛∵M(jìn)行反匯編。



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();