版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
北京工業(yè)職業(yè)技術(shù)學(xué)院嵌入式系統(tǒng)應(yīng)用主講:
XXX老師STM32異常和中斷處理學(xué)習(xí)目標(biāo)掌握了解熟悉異常處理的過(guò)程復(fù)位過(guò)程多堆棧的設(shè)置13異常的類型、位置和優(yōu)先級(jí)2異常優(yōu)先級(jí)及分組異?;顒?dòng)等級(jí)Abort模式主講內(nèi)容主講內(nèi)容Speechcontent6.2異常的優(yōu)先級(jí)6.1異常類型6.3異常處理6.4復(fù)位過(guò)程6.5多堆棧的設(shè)置6.6Abort模式ARMCortex-M3異常:復(fù)位、不可屏蔽中斷、外部中斷、故障(Fault)等。異常類型、位置及優(yōu)先級(jí)
異常的類型異常類型偏
移優(yōu)先級(jí)描
述—0—復(fù)位時(shí),加載向量表中第一項(xiàng)作為棧頂?shù)刂窂?fù)位1-3(最高)電源開(kāi)啟和熱復(fù)位時(shí)調(diào)用,在執(zhí)行第一條指令時(shí),優(yōu)先級(jí)下降到最低,異步故障不可中斷屏蔽2-2除了復(fù)位,它不能被其他任何中斷中止或搶占,異步故障硬故障3-1如果故障由于優(yōu)先級(jí)或可配置的故障處理程序被禁止而不能激活,此時(shí)所有這些故障均為硬故障,同步故障存儲(chǔ)管理4可配置存儲(chǔ)保護(hù)單元不匹配,包括不可訪問(wèn)和不匹配,同步故障;也用于MPU不可用或不存在的情況,以支持默認(rèn)存儲(chǔ)映射的從不執(zhí)行區(qū)域總線故障5可配置預(yù)取出錯(cuò),存儲(chǔ)器訪問(wèn)錯(cuò)誤,以及其地址/存儲(chǔ)器相關(guān)的錯(cuò)誤;當(dāng)為精確的總線故障時(shí)是同步故障,不精確時(shí)為異步故障應(yīng)用故障6可配置應(yīng)用錯(cuò)誤,如執(zhí)行未定義的指令或試圖進(jìn)行非法的狀態(tài)轉(zhuǎn)換,同步故障—7~10—保留SVCall11可配置使用SVC指令進(jìn)行系統(tǒng)服務(wù)調(diào)用,同步故障調(diào)試監(jiān)視異常12可配置調(diào)試監(jiān)視異常,同步故障,但只在允許時(shí)有效;如果它的優(yōu)先級(jí)比當(dāng)前激活的處理程序的優(yōu)先級(jí)更低,則它不能激活—13—保留PendSV14可配置系統(tǒng)服務(wù)的可掛起請(qǐng)求,異步故障,只能由軟件掛起SysTick15可配置用于系統(tǒng)滴答定時(shí)器,異步故障外部中斷≥16可配置由核外發(fā)出的中斷,INTISR[239:0],傳遞給NVIC,都為異步故障主講內(nèi)容主講內(nèi)容Speechcontent6.2異常的優(yōu)先級(jí)6.1異常類型6.3異常處理6.4復(fù)位過(guò)程6.5多堆棧的設(shè)置6.6Abort模式優(yōu)先級(jí)NVIC支持通過(guò)軟件設(shè)置優(yōu)先級(jí)。通過(guò)寫中斷優(yōu)先級(jí)寄存器的PRI_N字段可以設(shè)置優(yōu)先級(jí),范圍為0~255。硬件優(yōu)先級(jí)隨著中斷號(hào)的增加而減小,優(yōu)先級(jí)0為最高優(yōu)先級(jí),255為最低優(yōu)先級(jí)。
軟件設(shè)置的優(yōu)先級(jí)權(quán)限高于硬件優(yōu)先級(jí)。例如,如果設(shè)置IRQ[0]的優(yōu)先級(jí)為1,IRQ[31]的優(yōu)先級(jí)為0,則IRQ[31]的優(yōu)先級(jí)比IRQ[0]的高。但通過(guò)軟件設(shè)置的優(yōu)先級(jí)對(duì)復(fù)位、不可屏蔽中斷和硬故障沒(méi)有影響。
當(dāng)多個(gè)中斷具有相同的優(yōu)先級(jí)時(shí),擁有最小中斷號(hào)的掛起中斷優(yōu)先執(zhí)行。例如,IRQ[0]和IRQ[1]的優(yōu)先級(jí)都為1,則IRQ[0]優(yōu)先執(zhí)行。
異常的優(yōu)先級(jí)優(yōu)先級(jí)分組NVIC支持優(yōu)先級(jí)分組,便于對(duì)大量的中斷進(jìn)行優(yōu)先級(jí)管理和控制。設(shè)定應(yīng)用中斷和復(fù)位控制寄存器中的PRIGROUP字段,將PRI_N字段分成兩部分:搶占優(yōu)先級(jí)和次要優(yōu)先級(jí)。搶占優(yōu)先級(jí)可認(rèn)為是優(yōu)先級(jí)分組,當(dāng)多個(gè)掛起的異常具有相同的搶占優(yōu)先級(jí)時(shí),次要優(yōu)先級(jí)就起作用。優(yōu)先級(jí)分組和次要優(yōu)先級(jí)共同作用確定了異常的優(yōu)先級(jí)。當(dāng)兩個(gè)掛起的異常具有完全相同的優(yōu)先級(jí)時(shí),硬件位置編號(hào)低的異常優(yōu)先被激活。
異常的優(yōu)先級(jí)優(yōu)先級(jí)分組
異常的優(yōu)先級(jí)PRIGROUP[2:0]分隔點(diǎn)位置搶占優(yōu)先級(jí)字段次要優(yōu)先級(jí)字段占先優(yōu)先級(jí)數(shù)量次占優(yōu)先級(jí)數(shù)量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無(wú)[7:0]0256優(yōu)先級(jí)分組對(duì)于少于8位的優(yōu)先級(jí)配置,寄存器的低位通常為0。例如,使用4位優(yōu)先級(jí),則通過(guò)PRI_N[7:4]設(shè)置優(yōu)先級(jí),而PRI_N[3:0]為0000。一個(gè)中斷只能在其搶占優(yōu)先級(jí)高于另一個(gè)中斷的搶占優(yōu)先級(jí)時(shí)才能發(fā)生搶占。
異常的優(yōu)先級(jí)優(yōu)先級(jí)對(duì)異常處理的影響搶占Pre-emption:當(dāng)新異常比當(dāng)前異?;蛉蝿?wù)有更高優(yōu)先級(jí)時(shí),則中斷當(dāng)前操作流,響應(yīng)新的中斷,并執(zhí)行新的ISR,于是就產(chǎn)生了中斷嵌套。異常產(chǎn)生時(shí),處理器的狀態(tài)將自動(dòng)入棧保存;與此同時(shí),相對(duì)應(yīng)的中斷向量被取出,保存處理器狀態(tài)后,將執(zhí)行ISR的第一條指令,進(jìn)入處理器流水線的執(zhí)行階段。尾鏈Tail-chain:用于加快中斷服務(wù)處理的機(jī)制。如果有新的ISR或任務(wù)比即將返回的ISR擁有更高優(yōu)先級(jí),則處理器狀態(tài)出棧被跳過(guò)而直接執(zhí)行新的ISR。
異常的優(yōu)先級(jí)優(yōu)先級(jí)對(duì)異常處理的影響返回Return:如果沒(méi)有掛起的異常,或沒(méi)有比棧中的ISR優(yōu)先級(jí)更高的異常,則處理器執(zhí)行出棧返回操作。ISR完成時(shí),將自動(dòng)通過(guò)出棧操作恢復(fù)進(jìn)入ISR之前的處理器狀態(tài)。在恢復(fù)處理器狀態(tài)的過(guò)程中,如果有一個(gè)新到的中斷比正在返回的ISR或任務(wù)擁有更高優(yōu)先級(jí),則拋棄當(dāng)前的操作并對(duì)新的中斷作尾鏈處理。遲到Late-arriving:用于加快搶占速度的機(jī)制。當(dāng)正在為先前到達(dá)的中斷保存處理器狀態(tài)時(shí),如果有一個(gè)更高優(yōu)先級(jí)的中斷到達(dá),則處理器選擇處理更高優(yōu)先級(jí)的中斷,并為該中斷獲取向量。但狀態(tài)保存不會(huì)因?yàn)橥淼蕉艿接绊?,因?yàn)閷?duì)于兩個(gè)中斷來(lái)說(shuō),保存處理器狀態(tài)操作都是一樣的,故保存狀態(tài)不被中斷而是繼續(xù)進(jìn)行,但保存完?duì)顟B(tài)之后會(huì)執(zhí)行遲到中斷的ISR的第一條指令,返回時(shí),則使用通常的尾鏈規(guī)則。
異常的優(yōu)先級(jí)異常活動(dòng)等級(jí)
當(dāng)沒(méi)有異常發(fā)生時(shí),處理器處在Thread模式下,當(dāng)進(jìn)入中斷處理或故障處理激活時(shí),處理器將進(jìn)入Handler模式。不同類型異常處理所對(duì)應(yīng)的處理器工作模式、訪問(wèn)特權(quán)級(jí)別以及棧的使用是有所不同的,也就是活動(dòng)等級(jí)不同。
異常的優(yōu)先級(jí)異
?;顒?dòng)等級(jí)特權(quán)級(jí)別棧無(wú)Thread模式特權(quán)或用戶主?;蜻M(jìn)程棧ISR異步搶占等級(jí)特權(quán)主棧故障處理同步搶占等級(jí)特權(quán)主棧復(fù)位Thread模式特權(quán)主棧異?;顒?dòng)等級(jí)
所有異常類型的轉(zhuǎn)換規(guī)則,包括觸發(fā)異常的事件、轉(zhuǎn)換類型、特權(quán)級(jí)別以及棧的使用情況如下所示。
異常的優(yōu)先級(jí)激活異常觸發(fā)事件轉(zhuǎn)換類型特權(quán)級(jí)別棧復(fù)位復(fù)位信號(hào)Thread特權(quán)或用戶主?;蜻M(jìn)程棧ISR或NMI設(shè)置掛起的軟件指令或硬件信號(hào)異步搶點(diǎn)特權(quán)主棧故障:硬故障總線故障無(wú)CP故障非法指令故障
逐步升級(jí)存儲(chǔ)器訪問(wèn)出錯(cuò)訪問(wèn)不存在的CP非法指令同步搶點(diǎn)特權(quán)主棧
調(diào)試監(jiān)視異常
中止未允許時(shí)的調(diào)試事件同步
特權(quán)
主棧SVCSVC指令
外部中斷
異?;顒?dòng)等級(jí)
所有異常類型的轉(zhuǎn)換規(guī)則,包括觸發(fā)異常的事件、轉(zhuǎn)換類型、特權(quán)級(jí)別以及棧的使用情況如下所示。
異常的優(yōu)先級(jí)次要異常觸發(fā)事件激活優(yōu)先作用Thread復(fù)位信號(hào)異步立即,優(yōu)先級(jí)最高ISR/NMIHW信號(hào)或設(shè)置掛起位異步根據(jù)優(yōu)先級(jí)進(jìn)行搶占或尾鏈監(jiān)視異常調(diào)試事件同步如果優(yōu)先級(jí)低于或等于當(dāng)前事件,硬故障SVCallSVC指令同步如果優(yōu)先級(jí)低于或等于當(dāng)前事件,硬故障PendSV軟件掛起請(qǐng)求鏈根據(jù)優(yōu)先級(jí)進(jìn)行搶占或尾鏈用法故障非法指令同步如果優(yōu)先級(jí)高于或等于當(dāng)前事件,硬故障無(wú)CP故障訪問(wèn)不存在的CP同步如果優(yōu)先級(jí)高于或等于當(dāng)前事件,硬故障總線故障存儲(chǔ)器訪問(wèn)出錯(cuò)同步如果優(yōu)先級(jí)高于或等于當(dāng)前事件,硬故障存儲(chǔ)管理MPU不匹配同步如果優(yōu)先級(jí)高于或等于當(dāng)前事件,硬故障硬故障逐步升級(jí)同步高于所有的NMI異常故障擴(kuò)展從可配置的故障處理中逐步升級(jí)請(qǐng)求鏈接將local處理的優(yōu)先級(jí)提高到與硬故障一樣,故可返回并鏈接到可配置的故障處理異?;顒?dòng)等級(jí)
所有異常類型的轉(zhuǎn)換規(guī)則,包括觸發(fā)異常的事件、轉(zhuǎn)換類型、特權(quán)級(jí)別以及棧的使用情況如下所示。
異常的優(yōu)先級(jí)次要異常觸發(fā)事件激活優(yōu)先作用Thread復(fù)位信號(hào)異步立即,優(yōu)先級(jí)最高ISR/NMIHW信號(hào)或設(shè)置掛起位異步根據(jù)優(yōu)先級(jí)進(jìn)行搶占或尾鏈監(jiān)視異常調(diào)試事件同步如果優(yōu)先級(jí)低于或等于當(dāng)前事件,硬故障SVCallSVC指令同步如果優(yōu)先級(jí)低于或等于當(dāng)前事件,硬故障PendSV軟件掛起請(qǐng)求鏈根據(jù)優(yōu)先級(jí)進(jìn)行搶占或尾鏈用法故障非法指令同步如果優(yōu)先級(jí)高于或等于當(dāng)前事件,硬故障無(wú)CP故障訪問(wèn)不存在的CP同步如果優(yōu)先級(jí)高于或等于當(dāng)前事件,硬故障總線故障存儲(chǔ)器訪問(wèn)出錯(cuò)同步如果優(yōu)先級(jí)高于或等于當(dāng)前事件,硬故障存儲(chǔ)管理MPU不匹配同步如果優(yōu)先級(jí)高于或等于當(dāng)前事件,硬故障硬故障逐步升級(jí)同步高于所有的NMI異常故障擴(kuò)展從可配置的故障處理中逐步升級(jí)請(qǐng)求鏈接將local處理的優(yōu)先級(jí)提高到與硬故障一樣,故可返回并鏈接到可配置的故障處理主講內(nèi)容主講內(nèi)容Speechcontent6.2異常的優(yōu)先級(jí)6.1異常類型6.3異常處理6.4復(fù)位過(guò)程6.5多堆棧的設(shè)置6.6Abort模式異常處理的進(jìn)入與處理
當(dāng)處理器處理異常發(fā)生時(shí),會(huì)將PC、處理器狀態(tài)寄存器(xPSR)、r0~r3、r12、LR等8個(gè)寄存器的信息一次保存到堆棧指針SP所指之處。完成操作后,SP指針后移8個(gè)字。
如果NVIC配置控制寄存器的STKALLGN位已經(jīng)被設(shè)置,則在壓棧之前會(huì)插入一個(gè)額外的字。從ISR返回后,處理器自動(dòng)彈出8個(gè)寄存器。中斷返回是通過(guò)LR寄存器傳遞數(shù)據(jù),故ISR可以是通常的C/C++函數(shù),而且不需要修飾符。
寄存器入棧之后,處理器將讀取向量表中的向量、更新PC、開(kāi)始執(zhí)行ISR。Cortex-M3處理器處理異常的詳細(xì)步驟如下所示。
異常的處理異常處理的進(jìn)入與處理
異常的處理操作是否可重新開(kāi)始步驟描
述8個(gè)寄存器入棧否將xPSR、PC、r0~r3、r12和LR保存到選定的棧中讀取向量表可以,遲到異??蓪?dǎo)致重新開(kāi)始從內(nèi)存中讀取向量表,通過(guò)ICode總線實(shí)現(xiàn),與DCode總線上的棧操作并行從向量表中讀取SP否只有在復(fù)位情況下,SP才回指到棧頂;除了選擇棧、入棧和出棧外,其他操作不修改SP更新PC否通過(guò)讀取向量表的特定位置來(lái)更新PC;只有在第一條指令開(kāi)始執(zhí)行后,遲到的異常才開(kāi)始被處理載入指令到流水線可以,搶占可以導(dǎo)致新的向量表讀取并載入流水線從向量表項(xiàng)所指的位置載入指令,與寄存器入棧同時(shí)進(jìn)行更新LR否LR被設(shè)成EXC_RETURN,以便退出異常異常處理的進(jìn)入與處理Cortex-M3提供了搶占、尾鏈及遲到等處理機(jī)制。當(dāng)發(fā)生異常時(shí),根據(jù)處理器當(dāng)前行為,進(jìn)入異常處理ISR的過(guò)程有所不同。處理器在不同情況下進(jìn)入異常處理ISR的過(guò)程如下所述。非存取指令:在完成當(dāng)前指令周期之后,在下一條指令之前進(jìn)入異常處理。單加載/存取指令:根據(jù)總線狀態(tài)完成或丟棄當(dāng)前指令;根據(jù)總線等待狀態(tài),確定是否在下個(gè)指令周期進(jìn)入異常處理。批量加載/存儲(chǔ)指令:完成或丟棄當(dāng)前寄存器傳輸并將連續(xù)計(jì)數(shù)器設(shè)給EPSR;根據(jù)總線允許或中斷可繼續(xù)指令(ICI)規(guī)則,確定是否在下個(gè)指令周期時(shí)進(jìn)入異常處理。異常入口點(diǎn):這是一個(gè)Late-arriving異常。如果有比正在被處理的異常優(yōu)先級(jí)高,處理器取消異常入口點(diǎn)并執(zhí)行后到的異常;后到的異常在中斷處理時(shí)會(huì)使用新的中斷向量;當(dāng)執(zhí)行一個(gè)新的處理程序,也就是第一個(gè)ISR指令時(shí),會(huì)應(yīng)用普通搶占規(guī)則,并不作為L(zhǎng)ate-arrival。異常處理中:如果新異常比處理器當(dāng)前處理的異常有更高的優(yōu)先級(jí),則處理器處理新異常。
異常的處理
異常處理的退出ISR的最后一條指令將PC的值更新為0xFFFFFFFX,也就是進(jìn)入異常時(shí)的LR值,這告訴處理器,ISR的工作已經(jīng)完成了,接下來(lái)要執(zhí)行異常退出步驟。當(dāng)從異常中返回時(shí),處理器可能會(huì)處于以下情況之一:尾鏈到一個(gè)已掛起的異常,該異常比棧中所有異常的優(yōu)先級(jí)都高;如果沒(méi)有掛起的異常,或是棧中最高優(yōu)先級(jí)的異常比掛起的最高優(yōu)先級(jí)異常具有更高的優(yōu)先級(jí),則返回到最近一個(gè)已壓棧的ISR;如果沒(méi)有異常已經(jīng)掛起或位于棧中,則返回到Thread模式。
異常的處理
異常處理的退出當(dāng)異常退出時(shí)將執(zhí)行下述操作:彈出8個(gè)寄存器:如果沒(méi)有搶占,則從EXC_RETURN指定的棧中彈出PC、XPSR、r0~r3、r12和LR,并更新SP。載入當(dāng)前活動(dòng)的中斷號(hào),反向棧對(duì)界調(diào)整:從棧中IPSR的位[8:0]中載入當(dāng)前活動(dòng)的中斷號(hào),處理器利用它確定跟蹤哪個(gè)異常返回,并在返回時(shí)清除相應(yīng)位。當(dāng)位[8:0]為零時(shí),處理器返回到Thread模式。選擇SP:如果返回到一個(gè)異常,SP為Main_SP;如果返回到Thread模式,SP為Main_SP或Process_SP。
異常的處理
異常處理的退出在ISR中可用以下指令作為最后一條指令將值0xFFFFFFFX加載到PC,以發(fā)送異常返回:POP/LDM,載入PC。LDR,PC作為目的地址。BX,使用任何寄存器進(jìn)行跳轉(zhuǎn)。
異常的處理
異常處理的退出當(dāng)采用這種方法返回時(shí),寫入到PC的值被截取,并且作為EXC_RETURN的值。下面描述了EXC_RETURN[3:0]提供的返回信息以及說(shuō)明:xxx0:保留。0001:返回到Handler模式,異常返回時(shí)從主棧中讀取狀態(tài),返回操作使用主棧。0011:保留。01x1:保留。1001:返回到Thread模式,異常返回時(shí)從主棧中讀取狀態(tài);返回操作使用進(jìn)程棧。1101:返回到Thread模式,異常返回時(shí)從進(jìn)程棧中讀取狀態(tài);返回操作使用進(jìn)程棧。1x11:保留。
異常的處理
異常處理的退出返回時(shí)如果出現(xiàn)保留項(xiàng),將導(dǎo)致一個(gè)應(yīng)用故障的異常。
在Thread模式下,如果EXC_RETURN的值被PC載入,或是該值來(lái)自向量表或其他任何指令,則將該值看成地址,而非一個(gè)特殊的值。該地址區(qū)間被定義為不可執(zhí)行區(qū)間,并導(dǎo)致一個(gè)內(nèi)存管理故障。
異常的處理主講內(nèi)容主講內(nèi)容Speechcontent6.2異常的優(yōu)先級(jí)6.1異常類型6.3異常處理6.4復(fù)位過(guò)程6.5多堆棧的設(shè)置6.6Abort模式
Cortex-M3處理器復(fù)位時(shí),NVIC同時(shí)復(fù)位并控制內(nèi)核從復(fù)位中釋放出來(lái)。復(fù)位的過(guò)程是可完全預(yù)知的。下面是對(duì)復(fù)位過(guò)程的描述。(1)NVIC復(fù)位,控制內(nèi)核:NVIC清除其大部分寄存器。處理器處于Thread模式,特權(quán)訪問(wèn)方式執(zhí)行代碼,堆棧使用Main棧。(2)NVIC從復(fù)位中釋放內(nèi)核:NVIC從復(fù)位中釋放內(nèi)核。(3)內(nèi)核配置堆棧:內(nèi)核從向量表開(kāi)始處讀取初始SP、Main_SP。(4)內(nèi)核設(shè)置PC和LR:內(nèi)核從向量表偏移中讀取初始PC,LR設(shè)置為0xFFFFFFFF。(5)運(yùn)行復(fù)位程序:禁止NVIC中斷,并允許NMI和硬故障。
復(fù)位過(guò)程
向量表
在向量表的位置0處,僅需要包含4個(gè)值:棧頂?shù)刂?。?fù)位程序的入口地址。非屏蔽中斷(NMI)ISR的入口地址。硬故障ISR的入口地址。
當(dāng)中斷運(yùn)行時(shí),不管向量表放在何處,向量總是指向所有可屏蔽異常的處理。同樣,如果使用SVC指令,則SVCallISR的位置也被定位。
復(fù)位過(guò)程啟動(dòng)過(guò)程正常情況,系統(tǒng)復(fù)位之后會(huì)按如下步驟啟動(dòng),一個(gè)C/C++程序在運(yùn)行時(shí)能完成最初的3步,然后調(diào)用main()函數(shù)。初始化變量:任何全局/靜態(tài)變量必須被設(shè)置,這包括初始化BSS變量為0,將非constant變量從ROM復(fù)制到RAM中。設(shè)置棧:如果使用一個(gè)以上的棧,其他棧的分組SP必須被初始化;當(dāng)前SP可以被從Process改變成Main。初始化運(yùn)行時(shí):可選擇地調(diào)用C/C++運(yùn)行時(shí)初始化代碼,以運(yùn)行堆的使用、浮點(diǎn)或其他功能;通常是由C/C++庫(kù)中的main()函數(shù)實(shí)現(xiàn)。初始化所有外設(shè):在中斷允許之前設(shè)置外設(shè),初始化每個(gè)將要在應(yīng)用程序中使用的外設(shè)。轉(zhuǎn)換ISR向量表:可選擇性地將向量表從代碼段(@0)轉(zhuǎn)到SRAM中的某個(gè)地方,這僅在優(yōu)化性能或允許動(dòng)態(tài)轉(zhuǎn)換時(shí)進(jìn)行。
復(fù)位過(guò)程啟動(dòng)過(guò)程設(shè)置可配置錯(cuò)誤:允許可配置故障,設(shè)置它們的優(yōu)先級(jí)。設(shè)置中斷:設(shè)置中斷的優(yōu)先級(jí)和屏蔽。允許中斷:允許NVIC進(jìn)行中斷處理,但在設(shè)置中斷允許的過(guò)程中不能發(fā)生中斷,如果超過(guò)32個(gè)中斷,將會(huì)使用不止一個(gè)的中斷允許設(shè)置寄存器??梢酝ㄟ^(guò)CPS或MSR指令使用PRIMASK寄存器,來(lái)屏蔽中斷直到準(zhǔn)備好。改變特權(quán)訪問(wèn)方式:如果需要,在Thread模式下可將特權(quán)訪問(wèn)方式改為用戶訪問(wèn)方式,這通常必須調(diào)用SVCall處理程序進(jìn)行處理。循環(huán):如果允許Sleep-on-exit,在第一個(gè)中斷或異常被處理后,不需要控制返回;如果Sleep-on-exit被選為允許或禁止,則這個(gè)循環(huán)可以實(shí)現(xiàn)清除和執(zhí)行任務(wù);如果沒(méi)有使用Sleep-on-exit,則循環(huán)將不受限制,當(dāng)有必要時(shí)可使用WFI(Sleep-now)。復(fù)位服務(wù)子程序用來(lái)啟動(dòng)應(yīng)用程序和允許中斷。在中斷處理完成后,有3種方式可調(diào)用復(fù)位服務(wù)子程序,分別可參閱如下3個(gè)例子。
復(fù)位過(guò)程啟動(dòng)過(guò)程
復(fù)位服務(wù)子程序用來(lái)啟動(dòng)應(yīng)用程序和允許中斷。在中斷處理完成后,有3種方式可調(diào)用復(fù)位服務(wù)子程序。
例1:純粹Sleep-on-exit的復(fù)位服務(wù)子程序(復(fù)位程序不進(jìn)行主循環(huán))。
復(fù)位過(guò)程voidreset(){ /*配置(初始化變量,如果需要初始化運(yùn)行時(shí),設(shè)置外設(shè)等)*/ /*允許中斷*/ nvic[INT_ENA]=1; /*在第一個(gè)異常后通常不會(huì)返回*/ nvic_regs[NV_SLEEP]|=NVSLEEP_ON_EXIT; while(1) wfi();}啟動(dòng)過(guò)程
復(fù)位服務(wù)子程序用來(lái)啟動(dòng)應(yīng)用程序和允許中斷。在中斷處理完成后,有3種方式可調(diào)用復(fù)位服務(wù)子程序。
例2:帶有通過(guò)WFI(WaitForInterrupt)選擇睡眠模式的復(fù)位服務(wù)子程序。
復(fù)位過(guò)程voidreset(){ externvolatileunsignedexc_req; //配置(初始化變量,如果需要初始化運(yùn)行時(shí),設(shè)置外設(shè)等) //允許中斷 nvic[INT_ENA]=1; while(1) { //為(exc_req=FALSE;exc_req==FALSE;)作相關(guān)工作 //進(jìn)入睡眠模式,等待中斷 wfi(); //執(zhí)行一些異常處理之后的檢查和清除工作 }}啟動(dòng)過(guò)程
復(fù)位服務(wù)子程序用來(lái)啟動(dòng)應(yīng)用程序和允許中斷。在中斷處理完成后,有3種方式可調(diào)用復(fù)位服務(wù)子程序。
例3:選定的Sleep-on-exit,可被要求的ISR喚醒而產(chǎn)生復(fù)位子程序。
復(fù)位過(guò)程voidreset(){ //配置(初始化變量,如果需要初始化運(yùn)行時(shí),設(shè)置外設(shè)等) //允許中斷 nvic[INT_ENA]=1; while(1) { //系統(tǒng)處于睡眠狀態(tài)直到一個(gè)異常來(lái)清除Sleep-on-exit狀態(tài),然后可進(jìn)行異常之后的
//處理和清除 nvic_regs[NV_SLEEP]|=NVSLEEP_ON_EXIT; while(nvic_regs[NV_SLEEP]&NVSLEEP_ON_EXIT) //Sleep-now等待中斷來(lái)喚醒 wfi(); //執(zhí)行一些異常處理之后的檢查和清除工作 }}主講內(nèi)容主講內(nèi)容Speechcontent6.2異常的優(yōu)先級(jí)6.1異常類型6.3異常處理6.4復(fù)位過(guò)程6.5多堆棧的設(shè)置6.6Abort模式根據(jù)處理器的工作模式不同,應(yīng)用程序可以使用Main和Process兩個(gè)不同的棧。處理器在進(jìn)入異常處理和退出異常處理時(shí),通常要在不同的工作模式、不同的代碼訪問(wèn)方式、不同的堆棧之間切換。為了實(shí)現(xiàn)多堆棧,應(yīng)用程序需執(zhí)行下面的操作:用MSR指令設(shè)置Process_SP寄存器。如果使用MPU(MemoryProtectionUnit),可適當(dāng)?shù)乇Wo(hù)棧。Thread模式下初始化棧和訪問(wèn)方式。如果Thread模式下的訪問(wèn)方式由特權(quán)方式變成用戶方式,僅可通過(guò)其他ISR(例如SVCall),才能使之從用戶方式返回到特權(quán)方式。
多堆棧的設(shè)置在Thread模式下所用的棧可在Main棧和Process棧之間切換,但是這樣做會(huì)影響對(duì)線程局部變量的訪問(wèn)。因此,在Thread模式下最好通過(guò)一個(gè)ISR來(lái)改變所使用的棧。下面是一個(gè)切換過(guò)程:調(diào)用設(shè)置程序,完成:用MSR指令設(shè)置其他棧。如果有MPU,則允許MPU以支持基區(qū)。調(diào)用啟動(dòng)程序。從設(shè)置程序中返回。
多堆棧的設(shè)置在Thread模式下所用的??稍贛ain棧和Process棧之間切換,但是這樣做會(huì)影響對(duì)線程局部變量的訪問(wèn)。因此,在Thread模式下最好通過(guò)一個(gè)ISR來(lái)改變所使用的棧。下面是一個(gè)切換過(guò)程:將Thread模式的訪問(wèn)方式改為非特權(quán)方式(用戶方式)。使用SVC調(diào)用內(nèi)核,內(nèi)核將:使用MRS指令為當(dāng)前用戶線程讀取SP,并將其保存在TCB(線程控制塊)中。使用MSR指令為下個(gè)線程設(shè)置SP,通常是Process_SP。如果需要,為新的當(dāng)前線程設(shè)置MPU。返回到新的當(dāng)前線程。
多堆棧的設(shè)置主講內(nèi)容主講內(nèi)容Speechcontent6.2異常的優(yōu)先級(jí)6.1異常類型6.3異常處理6.4復(fù)位過(guò)程6.5多堆棧的設(shè)置6.6Abort模式在異常種類中有一些稱為故障,有4種事件能產(chǎn)生故障:取指令或從向量表加載向量時(shí)總線出錯(cuò)。數(shù)據(jù)訪問(wèn)時(shí)總線出錯(cuò)。內(nèi)部檢查錯(cuò)誤,如未定義指令或試圖用BX指令改變狀態(tài)。在NVIC中的故障狀態(tài)寄存器將指出故障的原因。超越訪問(wèn)方式特權(quán)或未管理區(qū)導(dǎo)致MPU故障Abort模式當(dāng)處理器發(fā)生故障后,進(jìn)入Abort模式,故障處理可分為兩類:固定優(yōu)先級(jí)硬故障。優(yōu)先權(quán)可設(shè)定的Local故障。Abort模式硬故障
如果故障由于優(yōu)先級(jí)或可配置的故障處理程序被禁止而不能激活,此時(shí)所有這些故障均為硬故障。所有異常中,僅有復(fù)位和NMI能搶占固定優(yōu)先硬故障。硬故障可以搶占復(fù)位、NMI和其他硬件之外的任何異常。
第二個(gè)總線故障不能逐步升級(jí),因?yàn)橐粋€(gè)同類型的故障不能搶占自身。這意味著如果被損壞的棧產(chǎn)生了一個(gè)故障,即使為處理程序進(jìn)行的壓棧失敗了,故障處理程序仍能執(zhí)行,但是棧中的內(nèi)容已經(jīng)被毀壞了。Abort模式Local故障和升級(jí)Local故障根據(jù)其產(chǎn)生的原因分類,可分成以下幾類:
復(fù)位:任何形式復(fù)位。讀取向量錯(cuò)誤:讀取向量表入口地址——返回總線錯(cuò)誤。uCode進(jìn)棧錯(cuò)誤:當(dāng)使用硬件保存現(xiàn)場(chǎng)產(chǎn)生故障——返回總線錯(cuò)誤。uCode進(jìn)棧錯(cuò)誤:當(dāng)使用硬件保存現(xiàn)場(chǎng)產(chǎn)生故障——MPU訪問(wèn)違規(guī)。uCode出棧錯(cuò)誤:當(dāng)使用硬件恢復(fù)現(xiàn)場(chǎng)時(shí)產(chǎn)生故障——返回總線失敗。uCode出棧錯(cuò)誤:當(dāng)使用硬件恢復(fù)現(xiàn)場(chǎng)時(shí)產(chǎn)生故障——MPU訪問(wèn)違規(guī)。升級(jí)為硬故障:故障發(fā)生時(shí),當(dāng)前異常處理程序的優(yōu)先級(jí)等于或高于新故障,或此故障優(yōu)先級(jí)還沒(méi)有允許時(shí),或可配置故障禁止。包括SVC、BKPT和其他各種故障。MPU不匹配:因?yàn)閿?shù)據(jù)訪問(wèn)產(chǎn)生MPU錯(cuò)誤。MPU不匹配:因?yàn)橹噶畹刂樊a(chǎn)生MPU錯(cuò)誤。Abort模式Local故障和升級(jí)Local故障根據(jù)其產(chǎn)生的原因分類,可分成以下幾類:
預(yù)取指令錯(cuò)誤:由于取指令而產(chǎn)生的總線錯(cuò)誤。僅當(dāng)此指令被執(zhí)行時(shí),才會(huì)產(chǎn)生
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)老院工作人員獎(jiǎng)懲制度
- 企業(yè)員工培訓(xùn)與職業(yè)發(fā)展路徑制度
- 2026河北邯鄲市曲周縣醫(yī)院招聘人事代理人員26人備考題庫(kù)附答案
- 交通宣傳教育材料制作與發(fā)放制度
- 2026湖北省定向天津大學(xué)選調(diào)生招錄考試備考題庫(kù)附答案
- 2026甘肅銀行股份有限公司招聘校園考試備考題庫(kù)附答案
- 2026福建福州市馬尾海關(guān)單證資料管理崗位輔助人員招聘1人參考題庫(kù)附答案
- 2026西藏日喀則市亞?wèn)|縣糧食公司人員招聘1人參考題庫(kù)附答案
- 公共交通服務(wù)質(zhì)量投訴處理制度
- 2026重慶大學(xué)附屬涪陵醫(yī)院年衛(wèi)生專業(yè)技術(shù)人員招聘22人參考題庫(kù)附答案
- 美術(shù)培訓(xùn)策劃書
- 貸款業(yè)務(wù)貸后管理
- 太原師范學(xué)院簡(jiǎn)介
- 人教版七年級(jí)英語(yǔ)上冊(cè)期末復(fù)習(xí)真題分類練習(xí) 專題05 完形填空(15空)20題(原卷版)
- 2026年湘西民族職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性考試題庫(kù)新版
- 2025年北京版(2024)小學(xué)數(shù)學(xué)一年級(jí)下冊(cè)(全冊(cè))教學(xué)設(shè)計(jì)(附目錄 P160)
- 2025年護(hù)士考編高頻考題及解析(共900 題)
- 2025年及未來(lái)5年中國(guó)天然氣制氫行業(yè)市場(chǎng)全景評(píng)估及發(fā)展戰(zhàn)略規(guī)劃報(bào)告
- 士官考學(xué)數(shù)學(xué)試卷及答案
- 生產(chǎn)安全事故調(diào)查分析規(guī)則
- 2021??低旸S-AT1000S超容量系列網(wǎng)絡(luò)存儲(chǔ)設(shè)備用戶手冊(cè)
評(píng)論
0/150
提交評(píng)論