Cortex-M3异常
一、異常類型
? 1、Cortex-CM3在內核系統上搭載了一個異常響應系統,支持為數眾多的系統異常和外部中斷。其中,編號為1-15對應的是系統異常,大于等于16的則全是外部中斷。除了個
??????? 別異常的優先級被定死外,其他異常的優先級都是可以編程的。
? 2、系統異常清單
? 3、外部中斷清單
? 4、在NVIC的中斷控制及狀態寄存器中,有一個VECTACTIVE位段,另外,還有一個特殊功能寄存器IPSR。在他們二者里面,都記錄了當前正在服務異常的編號。
? 5、如果一個發生的異常不能被即刻相應,就稱它被“懸起(pending)”。不過,少數fault異常是不允許被懸起的。對于每個異常源,在被懸起的情況下,都會有一個對應的“懸
??????? 起狀態寄存器”保存期異常請求,知道該異常能夠被執行為止。
二、優先級的定義
? 1、對Cortex-CM3來說,優先級對于異常是很關鍵的,它會影響一個異常是否會響應以及何時會響應。優先級的數值越小,則優先級越高。
? 2、Cortex-CM3支持中斷嵌套,使得高優先級異常可以搶占低優先級異常。有3個系統異常:復位,NMI以及硬fault,它們有固定的優先級,并且它們的優先級號是復數,從而
??????? 高于所有其他異常。所有其他異常的優先級都是可以編程的(但不可編程為負數)。
? 3、原則上Cortex-CM3支持3個固定的優先級和多大256個可編程的優先級,并且支持128級搶占,但實際上支持的優先級數會更少。它們在設計時會裁掉表達優先級的幾個低
?????? 端有效位,以達到減少優先數的目的。(優先級號是以MSB對齊的)
?? 1)、使用3位表達優先級的的情況
?? 2)、如果使用更多的事表達優先級,則能夠使用的值就越多,同時需要的門也越多,這會帶來更多成本和消耗。Cortex-CM3允許的最少使用位數為3位。
?? 3)、3位表達的優先級和4位表達的優先級對比
?? 4)、3位、5位、8位表達優先級時,優先級寄存器的使用情況
? 4、為了使搶占機能變得更可控,Cortex-CM3還把256級優先級按位分成高低兩段,分別是搶占優先級和亞優先級。
? 5、NVIC中的優先級組:該位段的值對每一個優先級可配置的異常都有影響,把其優先級分為兩個位段:MSB所在的位段對應搶占優先級,二LSB所在的位段對應亞優先級。
?? 1)、搶占優先級決定了搶占行為:當系統正在響應某異常L時,如果來了搶占級更高的異常H,則H可以搶占L。亞優先級則處理內務:當搶占優先級的異常有不止一個懸起
???????????? 時,就優先響應亞優先級最高的異常。
?? 2)、此優先級分組規定:亞優先級至少是一位,因此搶占優先級最多是7位,造成了最多只有128級搶占的現象。
? 6、計算搶占優先級和亞優先級的有效位數時,必須先求出下列值:
?? 1)、芯片實際使用了多少位來表達優先級。
?? 2)、優先級組是如何劃分的。
? 7、雖然優先級分組的功能很強大,但是粗心的更改會使他變得很暴力,尤其是在設計硬實時系統的時候。在絕大多數情況下,優先級的分組都要預先經過計算論證,并且在開
??????? 機初始化時一次性的設置好,以后也不再動用。
三、向量表
? 1、當發生了異常并且要響應它時,Cortex-CM3需要定位其處理例程的入口地址。這些入口地址存儲在所謂的“(異常)向量表”中。缺省情況下,Cortex-CM3認為該表位于零
??????? 地址處,且各向量占用四字節。
? 2、為了動態重分發中斷,Cortex-CM3允許向量表重定位——從其他地址處開始定位各異常向量。這些地址可以是代碼區,也可以是RAM區。通過修改NVIC中的一個叫“向量
??????? 表偏移量寄存器”中的值就能重定位向量表。但要注意:向量表的起始地址是有要求的,必須先求出系統中共有多少個向量,再把這個數字向上增加到是2的整次冪,而起始
?????? 地址必須對齊到后者的邊界上。
?? 1)、向量表偏移寄存器
? 3、如果需要動態的更改向量表,則對于任何器件來說,向量表的起始處都必須包含一下向量:
?? 1)、主堆棧指針(MSP)的初始值。
?? 2)、復位向量。
?? 3)、NMI。
?? 4)、硬fault服務例程。
四、中斷輸入及懸起行為
? 1、中斷輸入及懸起行為也適用于NMI。只是NMI將會立即無條件執行,除了以下情況:
?? 1)、當前已經在執行NMI例程。
?? 2)、CPU被調試器喊停(halted)。
?? 3)、被一些嚴重的系統錯誤鎖定
?? 則新的NMI請求也將被懸起。
? 2、當中斷輸入被assert后,該中斷就被懸起。即使后來中斷源取消了中斷請求,已經被標記懸起的中斷也會被記錄下來。到了系統中,它的優先級最高的時候,就會得到響
??????? 應。但是,如果在某個中斷得到響應之前,其懸起狀態被清除了,則中斷被取消。
? 3、當某中斷的服務例程開始執行時,就稱此中斷進入了活躍狀態,并且其懸起位會被硬件自動清零。
???? 在一個中斷活躍后,直到其服務例程執行完畢,并且返回。才能對該中斷的新請求予以響應。
? 4、如果中斷源咬著請求信號不放,該中斷就會在其上催服務例程返回后再次被設置為懸起狀態。
???? 另一方面,如果某個中斷在得到響應之前,其請求信號以若干的脈沖的方式呈現,則被視為只有一次中斷請求,多出的中斷脈沖全部錯失——這是中斷請求太快,以至于超
???? 出處理器反應限度的情況。
? 5、如果在服務例程中執行時,中斷請求釋放了,但是在服務例程返回前又重新被置為有效,則Cortex-CM3會記住此動作,重新懸起該中斷。
五、Fualt異常類型
?一)、有若干個系統異常專用于fault處理。Cortex-CM3中的Fault可分為以下幾類。
? 1、總線faults。
? 2、存儲器管理faults。
? 3、用法faults。
? 4、硬faults。
?二)、總線Faults
? 1、在AHB接口上正在傳輸數據時,如果回復了一個錯誤信號,則會產生總線fault,產生的場合是:
?? 1)、取指,通常被稱作預流產(prefech? abort)。
?? 2)、數據讀/寫,通常被稱作數據流產(data? abort)。
? 2、在Cortex-CM3中執行以下動作可以觸發總線異常:
?? 1)、中斷處理起始階段的堆棧PUSH動作。稱為“入棧錯誤”。
?? 2)、中斷處理收尾階段的堆棧POOP動作。稱為“出棧錯誤”。
?? 3)、在處理器啟動中斷處理序列后的向量讀取時。這是一種罕見的特殊情況,被歸類為營fault。
? 3、當上述總線fault(取向量除外)發生時,只要沒有同級或更高優先級的異常正在服務,且FAULTMASK=1時,就會執行總線的鼓舞例程。
?? 1)、如果在檢測到總線fault時,還檢測到了更高優先級的異常,則先處理后者,而總線fault則被標記為懸起。
?? 2)、如果總線fault被除能,或者總線fault發生時正在處理同級或更高優先級的異常,則總線fault被迫成為“硬傷”——上訪成硬fault,使得最后執行的是硬fault例程。
?? 3)、如果在總線執行時又產生了總線fault,內核進入鎖定狀態。
? 4、欲使能總線fault的服務例程需要在NVIC的“系統Hnadler控制及狀態寄存器”中置位BUSFAULTENV位。要注意的是,在使能之前,總線fault服務例程的入口·地址必須已經在
??????? 向量表中配置好。否則程序可能跑飛。
? 5、如何找出fault事故原因:NVIC提供了若干個fault狀態寄存器,其中一個名為“總線fault狀態寄存器”。通過它,總線fault服務例程可以確定產生fault的場合:是在數據訪問
?????? 時,在取指時,還是在中斷的堆棧操作時。
?? 1)、對于精確的總線fault,肇事的指令的地址被壓在棧堆中。
?? 2)、如果不是精確的總線fault,則無法定位。
?? 3)、BFSR的程序員模型:
?三)、用法fault
? 1、用法fault發生的場合是:
?? 1)、執行了未執行的指令。
?? 2)、執行了預處理器指令。
?? 3)、嘗試進入ARN狀態。
?? 4)、無效的中斷返回。
?? 5)、使用多重加載/存儲指令,地址沒對齊。
?? 6)、除數為零。
?? 7)、任何未對齊的訪問。
? 2、用法fault說明
?? 1)、如果用法fault被使能,再發生用法fault時通常會執行其服務例程。
?? 2)、但是如果當時還發生了更高優先級的異常,則用法fault被懸起。
?? 3)、如果此時處理器正在處理同級或更高優先級異常,或者用法fault服務例程被使能,則上訪成硬fault最終執行的是硬fault的服務例程。
?? 4)、如果硬fault服務例程或NMI服務例程的執行竟然導致了用法fault,內核又要被鎖定。
? 3、用法fault必須被使能才能正常響應。其在NVIC中的使能位是USGFAULTENV。如果把向量表置于RAM中,應優先建立好用法fault服務例程的入口地址。
? 4、為了調查用法fault的的案發現場,NVIC中有一個“用法fault狀態寄存器(UFSR)”,它指向導致用法fault的原因。在服務例程中,導致用法fault的指令被壓入棧堆中。
?? 1)、UFSR占用2個字節可以被按半字或字訪問。按字訪問時的地址是0xE000_ED28,高半字有效;按半字訪問時的地址是0xE000_ED2A。
?? 2)、和其他FAULT狀態寄存器一樣,里面的位可以通過寫1來清零。
?四)、硬fault
? 1、硬fault是總線fault、存儲器管理fault,用法fault上訪的結果。即這些fault例程如果無法執行,就會上訪生硬fault。另外,在取向量時產生的總線fault也按硬fault處理。
? 2、在NVIC中有一個為硬fault狀態寄存器(HFSR),它指出產生硬fault的原因。如果不是由于取向量造成的,則硬fault服務例程必須檢查其他的fault狀態寄存器,以最終決定
??????? 是誰上訪。
? 3、HFSR寄存器
?五)、應對fault
? 1、在軟件開發中,我們可以根據各種fault的值來判定程序錯誤,并且改正將其改正。但是在一個實時系統中情況就大不同——在找出fault的原因和,軟件必須決定下一步該怎
??????? 么做。
? 2、應對fault的常用方法
?? 1)、復位。
?? 2)、恢復。
?? 3)、中止相關任務。
? 3、各個fault狀態寄存器(FSRs)都保持住它們的狀態,知道手工清除。Fault服務例程在處理了相應的fault后不要忘記清除這些狀態。FSRs采用一種寫時清除機制(寫1時清
??????? 除)。
六、SVC和PendSV
?一)、SVC
? 1、SVC稱為系統服務調用或系統調用,用于產生系統函數的的調用請求。
? 2、SVC作為操作系統函數門戶示意圖
?二)PendSV
? 1、PendSV稱為可懸起的系統調用,它與SVC協同使用。
? 2、SVC異常是必須立即等到響應的,而PendSV不同,它可以像普通的中斷被懸起。懸起PendSV的方法是:手工往NVIC的PendSV懸起寄存器中寫1。
總結
以上是生活随笔為你收集整理的Cortex-M3异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Simulink之大功率晶体管(GTR)
- 下一篇: 朱啸虎:几百亿资金今年注入小程序,你能抓