基于移動機器人的嵌入式開發 課件 06 STM32異常和中斷處理_第1頁
基于移動機器人的嵌入式開發 課件 06 STM32異常和中斷處理_第2頁
基于移動機器人的嵌入式開發 課件 06 STM32異常和中斷處理_第3頁
基于移動機器人的嵌入式開發 課件 06 STM32異常和中斷處理_第4頁
基于移動機器人的嵌入式開發 課件 06 STM32異常和中斷處理_第5頁
已閱讀5頁,還剩42頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

北京工業職業技術學院嵌入式系統應用主講:

XXX老師STM32異常和中斷處理學習目標掌握了解熟悉異常處理的過程復位過程多堆棧的設置13異常的類型、位置和優先級2異常優先級及分組異常活動等級Abort模式主講內容主講內容Speechcontent6.2異常的優先級6.1異常類型6.3異常處理6.4復位過程6.5多堆棧的設置6.6Abort模式ARMCortex-M3異常:復位、不可屏蔽中斷、外部中斷、故障(Fault)等。異常類型、位置及優先級

異常的類型異常類型偏

移優先級描

述—0—復位時,加載向量表中第一項作為棧頂地址復位1-3(最高)電源開啟和熱復位時調用,在執行第一條指令時,優先級下降到最低,異步故障不可中斷屏蔽2-2除了復位,它不能被其他任何中斷中止或搶占,異步故障硬故障3-1如果故障由于優先級或可配置的故障處理程序被禁止而不能激活,此時所有這些故障均為硬故障,同步故障存儲管理4可配置存儲保護單元不匹配,包括不可訪問和不匹配,同步故障;也用于MPU不可用或不存在的情況,以支持默認存儲映射的從不執行區域總線故障5可配置預取出錯,存儲器訪問錯誤,以及其地址/存儲器相關的錯誤;當為精確的總線故障時是同步故障,不精確時為異步故障應用故障6可配置應用錯誤,如執行未定義的指令或試圖進行非法的狀態轉換,同步故障—7~10—保留SVCall11可配置使用SVC指令進行系統服務調用,同步故障調試監視異常12可配置調試監視異常,同步故障,但只在允許時有效;如果它的優先級比當前激活的處理程序的優先級更低,則它不能激活—13—保留PendSV14可配置系統服務的可掛起請求,異步故障,只能由軟件掛起SysTick15可配置用于系統滴答定時器,異步故障外部中斷≥16可配置由核外發出的中斷,INTISR[239:0],傳遞給NVIC,都為異步故障主講內容主講內容Speechcontent6.2異常的優先級6.1異常類型6.3異常處理6.4復位過程6.5多堆棧的設置6.6Abort模式優先級NVIC支持通過軟件設置優先級。通過寫中斷優先級寄存器的PRI_N字段可以設置優先級,范圍為0~255。硬件優先級隨著中斷號的增加而減小,優先級0為最高優先級,255為最低優先級。

軟件設置的優先級權限高于硬件優先級。例如,如果設置IRQ[0]的優先級為1,IRQ[31]的優先級為0,則IRQ[31]的優先級比IRQ[0]的高。但通過軟件設置的優先級對復位、不可屏蔽中斷和硬故障沒有影響。

當多個中斷具有相同的優先級時,擁有最小中斷號的掛起中斷優先執行。例如,IRQ[0]和IRQ[1]的優先級都為1,則IRQ[0]優先執行。

異常的優先級優先級分組NVIC支持優先級分組,便于對大量的中斷進行優先級管理和控制。設定應用中斷和復位控制寄存器中的PRIGROUP字段,將PRI_N字段分成兩部分:搶占優先級和次要優先級。搶占優先級可認為是優先級分組,當多個掛起的異常具有相同的搶占優先級時,次要優先級就起作用。優先級分組和次要優先級共同作用確定了異常的優先級。當兩個掛起的異常具有完全相同的優先級時,硬件位置編號低的異常優先被激活。

異常的優先級優先級分組

異常的優先級PRIGROUP[2:0]分隔點位置搶占優先級字段次要優先級字段占先優先級數量次占優先級數量000xxxxxxx.y[7:1][0]1282001xxxxxx.yy[7:2][1:0]644010xxxxx.yyy[7:3][2:0]328011xxxx.yyyy[7:4][3:0]1616100xxx.yyyyy[7:5][4:0]832101xx.yyyyyy[7:6][5:0]464110x.yyyyyyy[7][6:0]2128111.yyyyyyyy無[7:0]0256優先級分組對于少于8位的優先級配置,寄存器的低位通常為0。例如,使用4位優先級,則通過PRI_N[7:4]設置優先級,而PRI_N[3:0]為0000。一個中斷只能在其搶占優先級高于另一個中斷的搶占優先級時才能發生搶占。

異常的優先級優先級對異常處理的影響搶占Pre-emption:當新異常比當前異常或任務有更高優先級時,則中斷當前操作流,響應新的中斷,并執行新的ISR,于是就產生了中斷嵌套。異常產生時,處理器的狀態將自動入棧保存;與此同時,相對應的中斷向量被取出,保存處理器狀態后,將執行ISR的第一條指令,進入處理器流水線的執行階段。尾鏈Tail-chain:用于加快中斷服務處理的機制。如果有新的ISR或任務比即將返回的ISR擁有更高優先級,則處理器狀態出棧被跳過而直接執行新的ISR。

異常的優先級優先級對異常處理的影響返回Return:如果沒有掛起的異常,或沒有比棧中的ISR優先級更高的異常,則處理器執行出棧返回操作。ISR完成時,將自動通過出棧操作恢復進入ISR之前的處理器狀態。在恢復處理器狀態的過程中,如果有一個新到的中斷比正在返回的ISR或任務擁有更高優先級,則拋棄當前的操作并對新的中斷作尾鏈處理。遲到Late-arriving:用于加快搶占速度的機制。當正在為先前到達的中斷保存處理器狀態時,如果有一個更高優先級的中斷到達,則處理器選擇處理更高優先級的中斷,并為該中斷獲取向量。但狀態保存不會因為晚到而受到影響,因為對于兩個中斷來說,保存處理器狀態操作都是一樣的,故保存狀態不被中斷而是繼續進行,但保存完狀態之后會執行遲到中斷的ISR的第一條指令,返回時,則使用通常的尾鏈規則。

異常的優先級異常活動等級

當沒有異常發生時,處理器處在Thread模式下,當進入中斷處理或故障處理激活時,處理器將進入Handler模式。不同類型異常處理所對應的處理器工作模式、訪問特權級別以及棧的使用是有所不同的,也就是活動等級不同。

異常的優先級異

常活動等級特權級別棧無Thread模式特權或用戶主棧或進程棧ISR異步搶占等級特權主棧故障處理同步搶占等級特權主棧復位Thread模式特權主棧異常活動等級

所有異常類型的轉換規則,包括觸發異常的事件、轉換類型、特權級別以及棧的使用情況如下所示。

異常的優先級激活異常觸發事件轉換類型特權級別棧復位復位信號Thread特權或用戶主棧或進程棧ISR或NMI設置掛起的軟件指令或硬件信號異步搶點特權主棧故障:硬故障總線故障無CP故障非法指令故障

逐步升級存儲器訪問出錯訪問不存在的CP非法指令同步搶點特權主棧

調試監視異常

中止未允許時的調試事件同步

特權

主棧SVCSVC指令

外部中斷

異常活動等級

所有異常類型的轉換規則,包括觸發異常的事件、轉換類型、特權級別以及棧的使用情況如下所示。

異常的優先級次要異常觸發事件激活優先作用Thread復位信號異步立即,優先級最高ISR/NMIHW信號或設置掛起位異步根據優先級進行搶占或尾鏈監視異常調試事件同步如果優先級低于或等于當前事件,硬故障SVCallSVC指令同步如果優先級低于或等于當前事件,硬故障PendSV軟件掛起請求鏈根據優先級進行搶占或尾鏈用法故障非法指令同步如果優先級高于或等于當前事件,硬故障無CP故障訪問不存在的CP同步如果優先級高于或等于當前事件,硬故障總線故障存儲器訪問出錯同步如果優先級高于或等于當前事件,硬故障存儲管理MPU不匹配同步如果優先級高于或等于當前事件,硬故障硬故障逐步升級同步高于所有的NMI異常故障擴展從可配置的故障處理中逐步升級請求鏈接將local處理的優先級提高到與硬故障一樣,故可返回并鏈接到可配置的故障處理異常活動等級

所有異常類型的轉換規則,包括觸發異常的事件、轉換類型、特權級別以及棧的使用情況如下所示。

異常的優先級次要異常觸發事件激活優先作用Thread復位信號異步立即,優先級最高ISR/NMIHW信號或設置掛起位異步根據優先級進行搶占或尾鏈監視異常調試事件同步如果優先級低于或等于當前事件,硬故障SVCallSVC指令同步如果優先級低于或等于當前事件,硬故障PendSV軟件掛起請求鏈根據優先級進行搶占或尾鏈用法故障非法指令同步如果優先級高于或等于當前事件,硬故障無CP故障訪問不存在的CP同步如果優先級高于或等于當前事件,硬故障總線故障存儲器訪問出錯同步如果優先級高于或等于當前事件,硬故障存儲管理MPU不匹配同步如果優先級高于或等于當前事件,硬故障硬故障逐步升級同步高于所有的NMI異常故障擴展從可配置的故障處理中逐步升級請求鏈接將local處理的優先級提高到與硬故障一樣,故可返回并鏈接到可配置的故障處理主講內容主講內容Speechcontent6.2異常的優先級6.1異常類型6.3異常處理6.4復位過程6.5多堆棧的設置6.6Abort模式異常處理的進入與處理

當處理器處理異常發生時,會將PC、處理器狀態寄存器(xPSR)、r0~r3、r12、LR等8個寄存器的信息一次保存到堆棧指針SP所指之處。完成操作后,SP指針后移8個字。

如果NVIC配置控制寄存器的STKALLGN位已經被設置,則在壓棧之前會插入一個額外的字。從ISR返回后,處理器自動彈出8個寄存器。中斷返回是通過LR寄存器傳遞數據,故ISR可以是通常的C/C++函數,而且不需要修飾符。

寄存器入棧之后,處理器將讀取向量表中的向量、更新PC、開始執行ISR。Cortex-M3處理器處理異常的詳細步驟如下所示。

異常的處理異常處理的進入與處理

異常的處理操作是否可重新開始步驟描

述8個寄存器入棧否將xPSR、PC、r0~r3、r12和LR保存到選定的棧中讀取向量表可以,遲到異常可導致重新開始從內存中讀取向量表,通過ICode總線實現,與DCode總線上的棧操作并行從向量表中讀取SP否只有在復位情況下,SP才回指到棧頂;除了選擇棧、入棧和出棧外,其他操作不修改SP更新PC否通過讀取向量表的特定位置來更新PC;只有在第一條指令開始執行后,遲到的異常才開始被處理載入指令到流水線可以,搶占可以導致新的向量表讀取并載入流水線從向量表項所指的位置載入指令,與寄存器入棧同時進行更新LR否LR被設成EXC_RETURN,以便退出異常異常處理的進入與處理Cortex-M3提供了搶占、尾鏈及遲到等處理機制。當發生異常時,根據處理器當前行為,進入異常處理ISR的過程有所不同。處理器在不同情況下進入異常處理ISR的過程如下所述。非存取指令:在完成當前指令周期之后,在下一條指令之前進入異常處理。單加載/存取指令:根據總線狀態完成或丟棄當前指令;根據總線等待狀態,確定是否在下個指令周期進入異常處理。批量加載/存儲指令:完成或丟棄當前寄存器傳輸并將連續計數器設給EPSR;根據總線允許或中斷可繼續指令(ICI)規則,確定是否在下個指令周期時進入異常處理。異常入口點:這是一個Late-arriving異常。如果有比正在被處理的異常優先級高,處理器取消異常入口點并執行后到的異常;后到的異常在中斷處理時會使用新的中斷向量;當執行一個新的處理程序,也就是第一個ISR指令時,會應用普通搶占規則,并不作為Late-arrival。異常處理中:如果新異常比處理器當前處理的異常有更高的優先級,則處理器處理新異常。

異常的處理

異常處理的退出ISR的最后一條指令將PC的值更新為0xFFFFFFFX,也就是進入異常時的LR值,這告訴處理器,ISR的工作已經完成了,接下來要執行異常退出步驟。當從異常中返回時,處理器可能會處于以下情況之一:尾鏈到一個已掛起的異常,該異常比棧中所有異常的優先級都高;如果沒有掛起的異常,或是棧中最高優先級的異常比掛起的最高優先級異常具有更高的優先級,則返回到最近一個已壓棧的ISR;如果沒有異常已經掛起或位于棧中,則返回到Thread模式。

異常的處理

異常處理的退出當異常退出時將執行下述操作:彈出8個寄存器:如果沒有搶占,則從EXC_RETURN指定的棧中彈出PC、XPSR、r0~r3、r12和LR,并更新SP。載入當前活動的中斷號,反向棧對界調整:從棧中IPSR的位[8:0]中載入當前活動的中斷號,處理器利用它確定跟蹤哪個異常返回,并在返回時清除相應位。當位[8:0]為零時,處理器返回到Thread模式。選擇SP:如果返回到一個異常,SP為Main_SP;如果返回到Thread模式,SP為Main_SP或Process_SP。

異常的處理

異常處理的退出在ISR中可用以下指令作為最后一條指令將值0xFFFFFFFX加載到PC,以發送異常返回:POP/LDM,載入PC。LDR,PC作為目的地址。BX,使用任何寄存器進行跳轉。

異常的處理

異常處理的退出當采用這種方法返回時,寫入到PC的值被截取,并且作為EXC_RETURN的值。下面描述了EXC_RETURN[3:0]提供的返回信息以及說明:xxx0:保留。0001:返回到Handler模式,異常返回時從主棧中讀取狀態,返回操作使用主棧。0011:保留。01x1:保留。1001:返回到Thread模式,異常返回時從主棧中讀取狀態;返回操作使用進程棧。1101:返回到Thread模式,異常返回時從進程棧中讀取狀態;返回操作使用進程棧。1x11:保留。

異常的處理

異常處理的退出返回時如果出現保留項,將導致一個應用故障的異常。

在Thread模式下,如果EXC_RETURN的值被PC載入,或是該值來自向量表或其他任何指令,則將該值看成地址,而非一個特殊的值。該地址區間被定義為不可執行區間,并導致一個內存管理故障。

異常的處理主講內容主講內容Speechcontent6.2異常的優先級6.1異常類型6.3異常處理6.4復位過程6.5多堆棧的設置6.6Abort模式

Cortex-M3處理器復位時,NVIC同時復位并控制內核從復位中釋放出來。復位的過程是可完全預知的。下面是對復位過程的描述。(1)NVIC復位,控制內核:NVIC清除其大部分寄存器。處理器處于Thread模式,特權訪問方式執行代碼,堆棧使用Main棧。(2)NVIC從復位中釋放內核:NVIC從復位中釋放內核。(3)內核配置堆棧:內核從向量表開始處讀取初始SP、Main_SP。(4)內核設置PC和LR:內核從向量表偏移中讀取初始PC,LR設置為0xFFFFFFFF。(5)運行復位程序:禁止NVIC中斷,并允許NMI和硬故障。

復位過程

向量表

在向量表的位置0處,僅需要包含4個值:棧頂地址。復位程序的入口地址。非屏蔽中斷(NMI)ISR的入口地址。硬故障ISR的入口地址。

當中斷運行時,不管向量表放在何處,向量總是指向所有可屏蔽異常的處理。同樣,如果使用SVC指令,則SVCallISR的位置也被定位。

復位過程啟動過程正常情況,系統復位之后會按如下步驟啟動,一個C/C++程序在運行時能完成最初的3步,然后調用main()函數。初始化變量:任何全局/靜態變量必須被設置,這包括初始化BSS變量為0,將非constant變量從ROM復制到RAM中。設置棧:如果使用一個以上的棧,其他棧的分組SP必須被初始化;當前SP可以被從Process改變成Main。初始化運行時:可選擇地調用C/C++運行時初始化代碼,以運行堆的使用、浮點或其他功能;通常是由C/C++庫中的main()函數實現。初始化所有外設:在中斷允許之前設置外設,初始化每個將要在應用程序中使用的外設。轉換ISR向量表:可選擇性地將向量表從代碼段(@0)轉到SRAM中的某個地方,這僅在優化性能或允許動態轉換時進行。

復位過程啟動過程設置可配置錯誤:允許可配置故障,設置它們的優先級。設置中斷:設置中斷的優先級和屏蔽。允許中斷:允許NVIC進行中斷處理,但在設置中斷允許的過程中不能發生中斷,如果超過32個中斷,將會使用不止一個的中斷允許設置寄存器。可以通過CPS或MSR指令使用PRIMASK寄存器,來屏蔽中斷直到準備好。改變特權訪問方式:如果需要,在Thread模式下可將特權訪問方式改為用戶訪問方式,這通常必須調用SVCall處理程序進行處理。循環:如果允許Sleep-on-exit,在第一個中斷或異常被處理后,不需要控制返回;如果Sleep-on-exit被選為允許或禁止,則這個循環可以實現清除和執行任務;如果沒有使用Sleep-on-exit,則循環將不受限制,當有必要時可使用WFI(Sleep-now)。復位服務子程序用來啟動應用程序和允許中斷。在中斷處理完成后,有3種方式可調用復位服務子程序,分別可參閱如下3個例子。

復位過程啟動過程

復位服務子程序用來啟動應用程序和允許中斷。在中斷處理完成后,有3種方式可調用復位服務子程序。

例1:純粹Sleep-on-exit的復位服務子程序(復位程序不進行主循環)。

復位過程voidreset(){ /*配置(初始化變量,如果需要初始化運行時,設置外設等)*/ /*允許中斷*/ nvic[INT_ENA]=1; /*在第一個異常后通常不會返回*/ nvic_regs[NV_SLEEP]|=NVSLEEP_ON_EXIT; while(1) wfi();}啟動過程

復位服務子程序用來啟動應用程序和允許中斷。在中斷處理完成后,有3種方式可調用復位服務子程序。

例2:帶有通過WFI(WaitForInterrupt)選擇睡眠模式的復位服務子程序。

復位過程voidreset(){ externvolatileunsignedexc_req; //配置(初始化變量,如果需要初始化運行時,設置外設等) //允許中斷 nvic[INT_ENA]=1; while(1) { //為(exc_req=FALSE;exc_req==FALSE;)作相關工作 //進入睡眠模式,等待中斷 wfi(); //執行一些異常處理之后的檢查和清除工作 }}啟動過程

復位服務子程序用來啟動應用程序和允許中斷。在中斷處理完成后,有3種方式可調用復位服務子程序。

例3:選定的Sleep-on-exit,可被要求的ISR喚醒而產生復位子程序。

復位過程voidreset(){ //配置(初始化變量,如果需要初始化運行時,設置外設等) //允許中斷 nvic[INT_ENA]=1; while(1) { //系統處于睡眠狀態直到一個異常來清除Sleep-on-exit狀態,然后可進行異常之后的

//處理和清除 nvic_regs[NV_SLEEP]|=NVSLEEP_ON_EXIT; while(nvic_regs[NV_SLEEP]&NVSLEEP_ON_EXIT) //Sleep-now等待中斷來喚醒 wfi(); //執行一些異常處理之后的檢查和清除工作 }}主講內容主講內容Speechcontent6.2異常的優先級6.1異常類型6.3異常處理6.4復位過程6.5多堆棧的設置6.6Abort模式根據處理器的工作模式不同,應用程序可以使用Main和Process兩個不同的棧。處理器在進入異常處理和退出異常處理時,通常要在不同的工作模式、不同的代碼訪問方式、不同的堆棧之間切換。為了實現多堆棧,應用程序需執行下面的操作:用MSR指令設置Process_SP寄存器。如果使用MPU(MemoryProtectionUnit),可適當地保護棧。Thread模式下初始化棧和訪問方式。如果Thread模式下的訪問方式由特權方式變成用戶方式,僅可通過其他ISR(例如SVCall),才能使之從用戶方式返回到特權方式。

多堆棧的設置在Thread模式下所用的棧可在Main棧和Process棧之間切換,但是這樣做會影響對線程局部變量的訪問。因此,在Thread模式下最好通過一個ISR來改變所使用的棧。下面是一個切換過程:調用設置程序,完成:用MSR指令設置其他棧。如果有MPU,則允許MPU以支持基區。調用啟動程序。從設置程序中返回。

多堆棧的設置在Thread模式下所用的棧可在Main棧和Process棧之間切換,但是這樣做會影響對線程局部變量的訪問。因此,在Thread模式下最好通過一個ISR來改變所使用的棧。下面是一個切換過程:將Thread模式的訪問方式改為非特權方式(用戶方式)。使用SVC調用內核,內核將:使用MRS指令為當前用戶線程讀取SP,并將其保存在TCB(線程控制塊)中。使用MSR指令為下個線程設置SP,通常是Process_SP。如果需要,為新的當前線程設置MPU。返回到新的當前線程。

多堆棧的設置主講內容主講內容Speechcontent6.2異常的優先級6.1異常類型6.3異常處理6.4復位過程6.5多堆棧的設置6.6Abort模式在異常種類中有一些稱為故障,有4種事件能產生故障:取指令或從向量表加載向量時總線出錯。數據訪問時總線出錯。內部檢查錯誤,如未定義指令或試圖用BX指令改變狀態。在NVIC中的故障狀態寄存器將指出故障的原因。超越訪問方式特權或未管理區導致MPU故障Abort模式當處理器發生故障后,進入Abort模式,故障處理可分為兩類:固定優先級硬故障。優先權可設定的Local故障。Abort模式硬故障

如果故障由于優先級或可配置的故障處理程序被禁止而不能激活,此時所有這些故障均為硬故障。所有異常中,僅有復位和NMI能搶占固定優先硬故障。硬故障可以搶占復位、NMI和其他硬件之外的任何異常。

第二個總線故障不能逐步升級,因為一個同類型的故障不能搶占自身。這意味著如果被損壞的棧產生了一個故障,即使為處理程序進行的壓棧失敗了,故障處理程序仍能執行,但是棧中的內容已經被毀壞了。Abort模式Local故障和升級Local故障根據其產生的原因分類,可分成以下幾類:

復位:任何形式復位。讀取向量錯誤:讀取向量表入口地址——返回總線錯誤。uCode進棧錯誤:當使用硬件保存現場產生故障——返回總線錯誤。uCode進棧錯誤:當使用硬件保存現場產生故障——MPU訪問違規。uCode出棧錯誤:當使用硬件恢復現場時產生故障——返回總線失敗。uCode出棧錯誤:當使用硬件恢復現場時產生故障——MPU訪問違規。升級為硬故障:故障發生時,當前異常處理程序的優先級等于或高于新故障,或此故障優先級還沒有允許時,或可配置故障禁止。包括SVC、BKPT和其他各種故障。MPU不匹配:因為數據訪問產生MPU錯誤。MPU不匹配:因為指令地址產生MPU錯誤。Abort模式Local故障和升級Local故障根據其產生的原因分類,可分成以下幾類:

預取指令錯誤:由于取指令而產生的總線錯誤。僅當此指令被執行時,才會產生

溫馨提示

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

評論

0/150

提交評論