ARM的七種異常類型_第1頁
ARM的七種異常類型_第2頁
ARM的七種異常類型_第3頁
ARM的七種異常類型_第4頁
ARM的七種異常類型_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、ARM7支持六種操作模式:(1) 用戶模式(usr):正常的程序執(zhí)行狀態(tài)(2) FIQ模式(fiq): 支持數(shù)據(jù)傳送或通道處理(3) IRQ模式(irq): 用于通用的中斷處理(4) 管理模式(svc):用于操作系統(tǒng)的保護模式(5) 異常模式(abt):數(shù)據(jù)或者指令預取異常時進入(6) 無定義模式(und):當無定義指令被執(zhí)行時進入(7)軟件控制,外部中斷,異常處理都可以改變操作模式。大部分的應用程序在用戶模式下執(zhí)行。其他模式,比如管理模式,在中斷、異常服務、或者訪問被保護資源時進入。ARM 的中央寄存器集是16 個用戶寄存器R0 R15。這些寄存器均是32 位寬度,R0 R12沒有其他特殊功

2、能,寄存器R13 R15在CPU中有特殊功能。R13被用作棧指針(stack pointer,SP)。R14被稱為鏈接寄存器(link register, LR),當調(diào)用一個函數(shù)時返回地址被自動保存到鏈接寄存器,在函數(shù)返回時有效。這使得快速進入和返回“葉”函數(shù)(不調(diào)用其他函數(shù)的函數(shù))成為可能。如果函數(shù)是分支的一部分(即該函數(shù)將調(diào)用另一個函數(shù)),鏈接寄存器必須入棧(R13)。R15 是程序計數(shù)器(program counter, PC)。有趣的是,許多指令也可以在R13 R15中執(zhí)行,就像它們是標準的用戶寄存器。ARM中斷的問題ARM的七種異常類型1復位異常2數(shù)據(jù)訪問中止異常3快速中斷請求異常4

3、一般中斷請求5預取指令異常6軟件中斷異常7未定義異常問題:1為什么除了進入復位異常模式外,在別的異常處理模式中都允許FIQ中斷?2數(shù)據(jù)訪問中止異常的優(yōu)先級大于FIQ異常,為什么在數(shù)據(jù)訪問異常處理模式中,還允許FIQ中斷?這樣不就成了:在高優(yōu)先級異常處理中允許低優(yōu)先級的中斷發(fā)生?即使這樣,因為FIQ中斷的優(yōu)先級 將下一條指令的地址存入LR 2 復制CPSR到SPSR 3 根據(jù)異常類型,設置CPSR的運行模式位和相應的中斷位 4 強制PC從相應的異常向量地址取下一條指令執(zhí)行,跳轉到相應的異常處理程序處 B:異常處理完畢之后,ARM微處理器會執(zhí)行以下幾步操作 1 將連接寄存器LR的值減去相應的偏移量

4、后送到PC中。 2 將SPSR復制回CPSR中。 3 若在進入異常處理時設置了中斷禁止位,要在此清除。 4 可以認為應用程序總是從復位異常處理程序開始執(zhí)行的,因此復位異常處理程序不需要返回。 問題1:在B 中,為什么還要清除中斷禁止位?我是這樣理解的: 進入異常時,先保存了CPSR到相應的SPSR,返回的時候,直接復制SPSR到CPSR不就使得和中斷前的CPSR一樣嗎?為什么還要清除相應的中斷位? 問題2:B 點 怎么理解?麻煩大家給講講。1:如果CPSR的I位為0,ARM處理器會再次響應中斷,所以清除I位是必須的 2:其實是說,一旦發(fā)生復位,處理就立即轉向復位向量.其實復位還有其它操作,B4

5、的說法不是很準確的arm開發(fā)經(jīng)驗筆記IT /malonely發(fā)表于2007-09-20, 15:57 前一段時間做了arm的一些開發(fā),主要是編寫了arm的啟動軟件和移植了uCOS-II到arm7。我做事情喜歡深入簡出,及從最簡單,最原理的方面先做 一個框架,然后在這個框架里面進行補充。我還是一個很喜歡和別人討論的人,希望有人可以給我提出意見和建議。我的這個心得很初級,都是一些基本的東西。現(xiàn) 在拿出來和大家分享,希望在我畢業(yè)之前能給大家留一些紀念。_ 由于這些東西發(fā)paper實在是沒有價值,但是我感覺可以作為arm開發(fā)的入門。由于我的水平和經(jīng)驗有限,錯誤也是難免的。但是如果不拿出來和大家分享,

6、就算有錯誤我也發(fā)現(xiàn)不了,是么?呵呵。我現(xiàn)試試發(fā)連載的第一篇,看看有多少價值,如果大家覺得有價值,我會繼續(xù)連載的。前言 這個文檔是我學習ARM編程的總結和心得。閱讀這個文檔的人應當首先閱讀ADS1.2的幫助文檔及相關內(nèi)容。這個文檔不會對編譯器及連接器做出詳細的說 明, 在需要的時候會指出具體內(nèi)容在相關資料的章節(jié)。同時閱讀這個文檔的人需要了解ARM指令集和一些ARM匯編的基本內(nèi)容以及C和C+的相關編程內(nèi)容。同時 還需要了解ARM的流水線結構及一些基本的編程知識。同時為了方便查閱英文文檔,所有的相關術語都使用英文原文 第一章 STARTUP1 ARM的啟動一般的嵌入式系統(tǒng)在主程序執(zhí)行之前都需要執(zhí)行一

7、些初始化的過程以創(chuàng)造嵌入式程序運行的 環(huán)境,尤其是一些高級的嵌入式系統(tǒng),由于核心芯片使用內(nèi)存映射、內(nèi)存保護等機制以及編程使用高級語言C,C+甚至JAVA語言,都需要先創(chuàng)建一個適合程 序運行的硬件環(huán)境,然后初始化或者配置或者剪裁run-time library, 這些工作都必須在主程序運行前完成,所以一個startup程序或者程序組對于一個嵌入式系統(tǒng)來說是非常重要的。要編寫startup程序,需要對編譯 器、鏈接器和匯編器的細節(jié)有一定的了解,同時對ARM芯片硬件本身的地址分配以及memory mapping機制也需要有一些了解。2 ARM 程序的工作過程 首先由各種source file經(jīng)過編譯

8、產(chǎn)生object文件,然后object文件經(jīng)過鏈接生成Image文件,然后通過ICE的方法,根據(jù)描述文件的指定下載到目標板上的固 態(tài)存儲器指定地址當中,比如flash,EEPROM, ROM等等。在程序執(zhí)行之前,根據(jù)某些描述文件,將需要讀寫數(shù)據(jù)的部分讀出放入動態(tài)存儲器比如RAM當中,然后程序從ROM開始執(zhí)行?;蛘哂袝r為了提高程 序的運行速度,也可以將所有的程序(有一些root的部分除外,以后會提及)通過一個描述文件放入指定的RAM當中,然后程序從RAM開始執(zhí)行,但是這樣 會耗費大量的動態(tài)存儲器,所以大部分程序會取折中的方法,將需要快速運行的部分和要讀寫的部分放入RAM中(一般讀固態(tài)存儲器的過程

9、和動態(tài)存儲器的過程是 一樣的,但是寫就不同了,所以讀寫的部分一定要放到RAM中),而只讀的部分和對速度要求不是那么高的部分放入固態(tài)存儲器。同時ARM結構的異常向量表規(guī) 定放在地址為0x00000000開始的地址空間上,而一般的CPU為了提高異常相應速度,會將這個向量段remap到其他的RAM當中,所以在描述文件 當中必須精確指定異常向量跳轉程序的地址到remap的地方。在application程序執(zhí)行前,還需要由一些文件描述application程序執(zhí)行 的環(huán)境。比如系統(tǒng)工作時鐘,總線頻率?,F(xiàn)在一般嵌入式編程語言為C,C+等。如果在使用它們的時候使用的runtime-library,那么在程序

10、執(zhí) 行前還需要為這些庫函數(shù)初始化heap。然后ARM可能工作在不同的模式,還需要為不同的工作模式設置stack。這樣,描述鏈接地址的文件,以及在 application運行前所有的初始化程序就是startup程序組3 STARTUP分類這樣,將startup程序所完成的功能分類。一類是鏈接地址描述,一類是各種初始化的程序。根據(jù)不同的應用,描述文件和初始化程序的內(nèi)容以及結構和復雜程度都會不同。但是基本上,它們都必須實現(xiàn)以下功能。3.1 描述文件實現(xiàn)功能描述文件可以是鏈接命令行上簡單的幾個字符,也可以是一個非常復雜的文件,但是它必須完成如下功能: 指定程序下載的地址 指定程序執(zhí)行的地址3.2 初始

11、化程序?qū)崿F(xiàn)的功能初始化程序根據(jù)不同的應用,其結構和復雜度也不同,但是它必須完成如下基本功能: 異常向量初始化 內(nèi)存環(huán)境初始化 其他硬件環(huán)境初始化4 描述文件要編寫描述文件,必須知道ARM Image文件的組成及ARM Image文件執(zhí)行的機理。4.1 ARM Image的結構一個ARM Image structure由linker在以下幾個方面定義:組成它的regions 和 output sections 當Image 下載的時候這些regions 和 sections 在內(nèi)存中的位置當Image 執(zhí)行時這些regions和sections在內(nèi)存中的位置4.1.1 ARM Image的組成一

12、個ARM Image被保存在可執(zhí)行文件當中,它的層次結構可以包括Image,regions,output sections和input sections。 一個Image由一個或多個regions組成,每個region包括一個或多個output sections 每個output section由一個或多個input sections組成 Input sections是一個object file中的code和data信息。Image的結構如下圖:NOTE Input section,output section和region的定義見ADS_LinkerGuide 3-3頁。同時Input se

13、ction 有幾種屬性,分別為readonly,read-write,zero-initialized。分別稱為RO,RW和ZI。屬性來源于AREA后的attr屬性。比 如CODE是RO,DATA是RW,NOINT默認為ZI,即用0值初始化,但是可以選擇不進行0值初始化。ZI屬性僅僅來源于SPACE, DCB, DCD, DCDU, DCQ, DCQU, DCW, 或者DCWU。由以上定義,ZI屬性的包含于RW屬性,它是有初始值的RW數(shù)據(jù)。又例如在C語言中,代碼為RO,靜態(tài)變量和全局變量是RW,ZI的。4.1.2 Image 的Load view 和 execution view在 下載的時候

14、Image regions被放置在memory map當中,而在執(zhí)行Image前,或許你需要將一些regions放置在它們執(zhí)行時的地址上,并建立起ZI regions。例如,你初始化的RW數(shù)據(jù)需要從它在下載時的在ROM中的地址處移動到執(zhí)行時RAM的地址處。 NOTE Load view 和execution view的詳細定義見ADS_LinkerGuide 3-4以上的描述包括二個內(nèi)容,一是要指定各個section在load view和execution view時的地址即memory map,二是要在執(zhí)行前根據(jù)這些地址進行section的初始化。4.1.3 制定Memory map制 定m

15、emory map的方法基本上有二種,一是在link時使用命令行選項,并在程序執(zhí)行前利用linker pre-define symbol使用匯編語言制定section的段初始化,二是使用scatter file。以上二種方法依應用程序的復雜度而定,一針對簡單的情況,二針對復雜的情況。4.1.1.1 利用linker pre-define symbol使用匯編程序這是簡單的方法,針對簡單的memory map。在link時使用選項-ro, -rw, 等等指定memory map的地址。詳細說明參看ADS_LinkerGuide中命令行選項說明。然后利用匯編使用pre-define symbol,

16、來進行各種段的定位。Linker pre-define定義如下:由前面對ZI的說明,Image$RW$Limit = Image$ZI$Limit。這些都是linker預先定義的外部變量,在使用的時候可以用IMPORT引入。下面給出一個例子。假 設linker 選項為:-ro-base 0x40000000 -rw-base 0x40003000。程序和只讀變量(const 變量)大小為0x84,這樣RO section的大小為0x84 bytes。Data的大小為0x04 bytes,并且data被初始化,則RW section的大小為0x04,ZI section的大小為0x04。這樣程序

17、在load view,地址是這樣的:0x40000000開始到地址0x40000080,是RO section部分(程序從0x40000000開始),Image$RO$Limit = 0x40000084.0x40000084地址開始到地址0x40000084,是RW section部分。在execution view,由linker的選項,各個section的地址是這樣的:RO section的地址不變。RW section的起始地酚蔽?x40003000,則Image$RW$Base = 0x40003000。因為全部的0x04 bytes data被初始化,所以Image$RW$Limi

18、t = Image$ZI$Limt = 0x40003004?,F(xiàn)在要做的就是將RW section移到以0x40003000開始的地方,并且創(chuàng)造一個ZI section。一個更通用的做法是:首 先比較Image$RO$Limit和mage$RW$Base,如果相等,說明execution view下RW section的地址和load view 下RW section的地址相同,這樣,不需要移動RW section;如果不等,說明需要移動RW section 到它在execution view中的地方。然后將Image$ZI$Base地址到Image$ZI$Limt地址的內(nèi)容清零。示例代碼如下

19、:;讀入linker pre-define symbolsIMPORT Image$RO$LimitIMPORT Image$RW$BaseIMPORT Image$ZI$BaseIMPORT Image$ZI$Limit; .一些其他的代碼或偽指令;R0讀入section load addressLDR R0,= Image$RO$Limit;R1讀入section execution addressLDR R1,= Image$RW$Base;R2讀入execution section 后的緊跟的word addressLDR R2,= Image$ZI$Base;檢查RW section

20、的地址在load view和execution view下;是否相等,如果相等,就不移動RW section,直接建立;ZI scetionCMP R0,R1BEQ do_zi_init;否則就copy RW section到execution view下指定的地址BL copy; .; .;copy 是一個用于copy的子函數(shù),它把從R0中的地址開始的;section copy到R1中的地址開始的section,這個section的;上限地址后緊跟的word address保存在R2中copyCMP R1,R2LDRCC R3,R0,#4STRCC R3,R1,#4BCC copyMOV P

21、C,LR; .; .;do_zi_int子函數(shù)是為創(chuàng)建ZI section做一些準備工作do_zi_int;將ZI section開始的地址裝入R1LDR R1,= Image$ZI$Base;將ZI section結束后緊跟的word address裝入R2LDR R2,= Image$ZI$Limit;將ZI section 需要的初始化量裝入R3MOV R3,#0BL zi_int; .; .;zi_int子函數(shù)用于建立并初始化ZI section,ZI section的;開始地址儲存在R1,ZI section結束后緊跟的word address;地址儲存在R2zi_intCMP R1

22、,R2STRCC R3,R1,#4BCC zi_intMOV PC,LR; .; .這個方法針對比較簡單的應用,如果需要進行一個比較復雜的memory map,如下圖,那么這個方法就不適用了。為了解決復雜memory map的問題需要用到scatter load 機制。標簽: arm 發(fā)信人: duremi (快樂點), 信區(qū): Modern_Elec標 題: ARM7常見問題1:數(shù)據(jù)異常 (ZZ)發(fā)信站: 逸仙時空 Yat-sen Channel (Fri Apr 7 10:11:49 2006), 站內(nèi)信件ARM7常見問題1:數(shù)據(jù)異常 作者 嗚哇啦 日期 2006-3-30 13:45:0

23、0 其實很多人剛開始都會覺得數(shù)據(jù)異常很討厭,到后來真正了解之后,才發(fā)現(xiàn)這個東西真不錯,能有效的幫助我們查找到問題所在。如果沒有這個東西,很多問題是很難被發(fā)現(xiàn)的。 一般會出現(xiàn)此現(xiàn)象的原因: 1.堆棧的指針不合理(C編譯器無法偵測到。),隨著SP的延伸,可能會到臨界地區(qū),發(fā)生不正確的物理地址的訪問。 2.在C中使用volatile的物理地址訪問,有可能出現(xiàn)非法的數(shù)據(jù)區(qū)域訪問。 3.特別是在工業(yè)控制等場合(掉電重起后,數(shù)據(jù)要求不更改,做到數(shù)據(jù)保護),系統(tǒng)啟動過程中,屏蔽掉_main的初始化變量功能,很多公共變量(如定義成unsigned short x=0x8888,或指向某些結構的指針).在啟動后

24、沒有初始化代碼為其做初始化。所以容易產(chǎn)生隨機地址訪問,出現(xiàn) data abort。此情況下,最好在用戶程序一開始就做好全局變量的初始化工作。 解決方案: 應有一些ARM匯編基礎,在進入數(shù)據(jù)異常的時候,通過查找LR地址,ADS下使用setpc跳到LR內(nèi)的地址(keil下,則是show code at Address),此處的代碼(可能是一個小小范圍,因為流水線的問題)就是引起錯誤的指令。查看此代碼對哪些變量進行了訪問(如果有堆棧操作,則設置斷點,程序執(zhí)行到此處后。查看SP指針是否合法) - o o o o o o True love is powerful. o o o o o o 來源:逸仙時

25、空 Yat-sen Channel FROM: 202.116.78.152ARM S3C4510B系統(tǒng)中的異常中斷技術 (圖)作者:中國海洋大學 鐘石磊 孫克怡 曹偉 程凱 日期:2004-9-1 來源:本網(wǎng) 字符大?。骸敬蟆?【中】 【小】 摘要:介紹ARM S3C4510B系統(tǒng)的異常中斷機制,包括異常中斷的分類,響應與返回;中斷處理程序的安裝與調(diào)用;SWI,IRQ中斷的實例與關鍵代碼。關鍵詞:ARM;S3C4510;異常中斷;SWI;IRQ;中斷向量表引言隨著人們對于電子產(chǎn)品的要求越來越高,以80C51系列為代表的8位處理器系統(tǒng)開始面臨越來越多的局限和挑戰(zhàn),人們對于高性能芯片和嵌入式功能

26、的呼聲也越來越高。16/32 位的處理器系統(tǒng)得到了前所未有的關注和重視。32位ARM體系系列處理器便是其中的代表。S3C4510B處理器是基于ARM7體系16/32位RISC處理器,內(nèi)部集成了8KB的CACHE/SDRAM,內(nèi)嵌EARTHNET控制器,擁有7種處理器模式和內(nèi)部多線程和外部多處理器的處理器結構。在嵌入式系統(tǒng)中具有重要意義的異常中斷技術在S3C4510B系統(tǒng)中也體現(xiàn)了ARM體系獨有的一些的特點。本文根據(jù)S3C4510B系統(tǒng)的特點,分析了該系統(tǒng)中七種異常中斷的功能及特點。并給出了SWI異常中斷(外部中斷)和IRQ異常中斷(軟件中斷)的應用實例代碼。 1 S3C4510B系統(tǒng)中的異常中

27、斷1.1 S3C4510B系統(tǒng)異常中斷的特點S3C4510B系統(tǒng)中控制程序執(zhí)行流程的方式通常有三種,一是正常程序執(zhí)行過程,即根據(jù)指令類型增加程序計數(shù)器PC使程序順序執(zhí)行;二是通過跳轉的方式來控制程序的執(zhí)行,可以利用跳轉的命令執(zhí)行跳轉操作,也可以通過直接修改程序計數(shù)器來達到跳轉的目的;三是異常中斷的方式,可以根據(jù)軟件的執(zhí)行情況,外部設備的異常請求等實現(xiàn)內(nèi)部、外部異常的處理,系統(tǒng)功能的調(diào)用和程序進程的控制等功能。S3C4510B系統(tǒng)的異常中斷具有以下幾個特點。首先,作為ARM體系RTOS(實時操作系統(tǒng))組成部分,程序中的異常中斷必須按照ARM體系的要求進行處理器模式的轉換。其次,如果對系統(tǒng)的優(yōu)化有

28、需求時,可以進行32位的ARM處理指令和16位的THUMB指令的轉換。另外,S3C4510B處理器正常運行時,保存的返回地址是通過將PC存入LR寄存器完成的,由于中斷產(chǎn)生時的計數(shù)器PC的值有時已經(jīng)更新,如產(chǎn)生了外部中斷和快速中斷等;有時可能尚未更新,如軟件中斷和未定義指令中止等,故必須根據(jù)實際情況對返回地址進行軟件修正之后才能正確返回。最后還要注意,ARM體系支持c語言和匯編語言程序的相互之間的調(diào)用,并有ATPCS規(guī)則進行協(xié)調(diào),所以異常中斷處理程序必需按照ATPCS規(guī)則進行寄存器處理。1.2 S3C4510B系統(tǒng)中的異常中斷的類型S3C4510B擁有七種不同的異常中斷類型,分別適應于不同的中斷

29、需要。根據(jù)ARM系列處理器的特點,各種異常中斷對應于ARM系列的不同工作模式。其種類和對應關系如表1所示。 其中,復位中斷是優(yōu)先級最高的中斷。在復位引腳有效的前提下,系統(tǒng)加電或系統(tǒng)復位時都會引起復位中斷。數(shù)據(jù)訪問中止是在數(shù)據(jù)訪問指令的目標地址不存在或者該地址不允許當前指令訪問的情況下產(chǎn)生的。指令預取中止中斷是處理器或系統(tǒng)協(xié)處理器認為當前指令未定義,當系統(tǒng)預取該指令時,本中斷執(zhí)行。未定義中止在處理器或系統(tǒng)協(xié)處理器認為當前指令未定義時產(chǎn)生,故而可以根據(jù)該異常中斷機制仿真浮點向量運算??焖僦袛嗪屯獠恐袛喽际窃趯闹袛嗾埱笠_有效,且狀態(tài)寄存器中的相應中斷禁止標志位清零時產(chǎn)生。其中的外部中斷還可以用

30、來進行各系統(tǒng)進程的切換;軟中斷由用戶定義,在程序運行時由SWI指令調(diào)用,可用于用戶模式下的程序調(diào)用特權模式指令。在RTOS系統(tǒng)中可以通過該中斷機制實現(xiàn)系統(tǒng)功能調(diào)用。1.3 S3C4510B系統(tǒng)對異常中斷的響應S3C4510B系統(tǒng)對異常中斷的響應流程如下:(1) 保存處理器當前狀態(tài)寄存器CPSR的值、中斷屏蔽以及各條件標志位到將要執(zhí)行的異常中斷的SPSR中。(2) 設置當前程序狀態(tài)寄存器CPSR的值。其中包括:設置CPSR相應位的值使處理器進入特定的處理器模式;按要求屏蔽中斷,通常應該屏蔽IRQ中斷,在FIQ中斷時屏蔽FIQ中斷。(3) 設置Lr寄存器。將中斷相應模式的Lr寄存器的值設置為異常中

31、斷的返回地址。(4) 處理程序計數(shù)器PC。將PC值設為相應的中斷向量的地址,從而實現(xiàn)跳轉以執(zhí)行中斷程序。當處理器執(zhí)行完以上流程之后,處理器已經(jīng)自中斷向量進入異常中斷的處理狀態(tài)。異常中斷處理完畢之后,在異常中斷程序的末端,處理器進入異常中斷的返回狀態(tài),其流程如下:(1) 恢復狀態(tài)寄存器。將保存在中斷模式中的SPSR值賦給當前的狀態(tài)寄存器。(2) 將返回地址復制到程序計數(shù)器。這樣程序?qū)⒎祷氐疆惓V袛喈a(chǎn)生的下一條指令或出現(xiàn)問題的指令處執(zhí)行。整個響應與返回的過程如圖1所示。 需要注意的是,對于不同的異常中斷,其返回地址的計算方法也是不同的。IRQ和FIQ異常中斷產(chǎn)生時,程序計數(shù)器PC已經(jīng)更新,而SWI

32、中斷和未定義指令中斷是由當前指令自身產(chǎn)生的,程序計數(shù)器PC尚未更新,所以要計算出下一條指令的地址來執(zhí)行返回操作;指令預取中止異常中斷和數(shù)據(jù)訪問異常中斷要求返回到出現(xiàn)異常的執(zhí)行現(xiàn)場,重新執(zhí)行操作。2 S3C4510B系統(tǒng)中的異常中斷處理程序的安裝S3C4510B系統(tǒng)通過異常向量表安裝異常中斷處理程序,即將異常向量表指向異常中斷處理程序的入口,實現(xiàn)面向異常中斷的跳轉。這里需要介紹一下S3C4510B系統(tǒng)的中斷向量表。在S3C4510B系統(tǒng)中,無論在地址重映射之前還是之后,異常中斷向量表的入口地址為固定的(見表1)。當系統(tǒng)運行到滿足異常中斷條件而產(chǎn)生異常中斷時,系統(tǒng)將自動跳入相應的異常中斷向量表中。

33、而在異常向量表中保存的,正是利用跳轉指令或ldr指令指向該中斷的異常中斷處理程序的指令程序,這樣就實現(xiàn)了異常中斷處理程序的安裝。以SWI軟中斷為例,異常中斷安裝的基本順序如圖2所示,其中異常中斷向量的地址是固定的,其他地址為假設的。2.1 利用跳轉指令實現(xiàn)異常中斷的安裝將BL指令放置到中斷向量表的特定位置,跳轉目標地址為中斷處理程序的首地址,便可直接實現(xiàn)異常中斷的安裝。其優(yōu)點是BL指令可以直接保存地址,缺點是BL的跳轉范圍只有32MB的地址空間,如bl SWI_Handler。2.2 利用ldr指令實現(xiàn)異常中斷的安裝利用ldr直接向程序計數(shù)器PC中賦值也可以實現(xiàn)中斷處理程序的安裝。先要將異常中

34、斷處理程序首地址的絕對地址放在鄰近的一個存儲單元中,然后用ldr命令將該內(nèi)存單元中的地址讀取到PC中。其優(yōu)點是可調(diào)用程序的范圍不受限制,如: ;ldr pc,SWI_ADDR;SWI_ADDR dcd SWI_Handler以上兩種安裝方法各有優(yōu)缺點,需要根據(jù)實際情況來選擇。3 S3C4510B系統(tǒng)中SWI異常中斷實例S3C4510B中的SWI指令可以用來實現(xiàn)RTOS中的系統(tǒng)功能調(diào)用。它由用戶模式下當前執(zhí)行的指令引發(fā),通過一個24位的立即數(shù)來指代SWI需要調(diào)用的系統(tǒng)功能,調(diào)用執(zhí)行的過程在特權模式中進行。3.1 SWI異常中斷的處理程序通常我們把SWI的中斷處理程序分為兩級,分別完成立即數(shù)的讀取和功能調(diào)用的執(zhí)行。其指令代碼如下:stmfd sp!,r0-r12,lr ;保護現(xiàn)場,保存寄存器的值ldr r0,lr,#-4;lr寄存器保存指令bic r0,r0,#0XFF000000 ;讀取指令中的24位

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論