資源描述:
《06 異常中斷處理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、嵌入式ARM系統(tǒng)原理與實(shí)例開發(fā)北京大學(xué)出版社 出版楊宗德 編著2007年7月12ARM中斷類型及處理方式ARM處理器中斷處理程序設(shè)計(jì)第6章ARM異常中斷處理及程序設(shè)計(jì)3SWI中斷處理原理及應(yīng)用程序開發(fā)異常的概念異常將導(dǎo)致處理器停止當(dāng)前事務(wù)處理,轉(zhuǎn)而處理一個(gè)突發(fā)事件(這個(gè)突發(fā)事件包括外部或者內(nèi)部引起的)。例如一個(gè)外部中斷或者試圖執(zhí)行一個(gè)未定義的指令。在處理異常之前,為了在異常處理完成后能夠很好的返回到中斷處理之前的狀態(tài),在編寫程序的時(shí)候有必要將處理器當(dāng)前的狀態(tài)保護(hù)起來,另外,在同一時(shí)刻有可能出現(xiàn)多個(gè)異常中斷請
2、求。9/19/20213北京大學(xué)出版社出版 楊宗德編著ARM異常類型9/19/20214北京大學(xué)出版社出版 楊宗德編著異常處理當(dāng)一個(gè)異常發(fā)生后,該異常模式下的R14和SPSR使用以下順序來保存當(dāng)前CPU的狀態(tài):R14_=returnlink//返回地址保存在該模式下R14SPSR_=CPSR//CPSR保存在該模式下的SPSR中CPSR[4:0]=exceptionmodenumber//切換處理器模式CPSR[5]=0//CPU處于ARM狀態(tài)
3、if==ResetorFIQthen//如果是復(fù)位或者FIQCPSR[6]=1//禁止FIQ請求CPSR[7]=1//禁止IRQ請求PC=exceptionvectoraddress//指向中斷處理程序向量地址從異常處理程序中返回時(shí),需要將CPSR中的CPU狀態(tài)恢復(fù),同時(shí)將R14數(shù)據(jù)傳輸給PC,可以采用以下兩種方式自動(dòng)完成:在使用數(shù)據(jù)處理指令時(shí)帶上S位,且PC寄存器做為目標(biāo)寄存器。使用多寄存器加載指令加載CPSR,如LDM。9/19/20215北京大學(xué)出版社出版 楊宗德編著R
4、eset異常及處理當(dāng)系統(tǒng)復(fù)位信號產(chǎn)生后,ARM處理器當(dāng)立即中斷當(dāng)前正在執(zhí)行的指令。進(jìn)入復(fù)位處理時(shí),處理器將進(jìn)行以下操作:R14_svc=UNPREDICTABLEvalue//R14_svc不可知SPSR_svc=UNPREDICTABLEvalue//SPSR_svc不可知CPSR[4:0]=0b10011//處理器進(jìn)入svc模式CPSR[5]=0//執(zhí)行ARM狀態(tài)CPSR[6]=1//禁止FIQCPSR[7]=1//禁止IRQifhighvectorsconfiguredthen//指向復(fù)位向量地址PC
5、=0xFFFF0000elsePC=0x00000000當(dāng)復(fù)位后,ARM處理器PC指針將立刻指向0x00000000或0xFFFF0000地址,禁止所有外部中斷,運(yùn)行于SVC模式。9/19/20216北京大學(xué)出版社出版 楊宗德編著未定義指令異常及處理當(dāng)試圖執(zhí)行一個(gè)ARM處理器及其協(xié)處理器都無法識別的指令時(shí)將產(chǎn)生一個(gè)未定義指令異常。在沒有實(shí)際硬件支持時(shí),未定義指令異??梢员挥脕磉M(jìn)行一個(gè)協(xié)處理器的軟件仿真,或者其它軟件仿真功能。9/19/20217北京大學(xué)出版社出版 楊宗德編著未定義指令異常處理步驟R14_un
6、d=addressofnextinstructionaftertheundefinedinstruction//R14_und為下一指令地址SPSR_und=CPSR//存儲(chǔ)CPSR狀態(tài)CPSR[4:0]=0b11011//進(jìn)入未定義模式CPSR[5]=0//執(zhí)行ARM執(zhí)行//CPSR[6]isunchanged,允許FIQCPSR[7]=1//禁止IRQifhighvectorsconfiguredthen//指向未定義中斷向量PC=0xFFFF0004elsePC=0x000000049/19/2021
7、8北京大學(xué)出版社出版 楊宗德編著軟中斷異常及處理軟中斷異常是由SWI指令產(chǎn)生的,其將進(jìn)入使CPU進(jìn)入SVC模式,執(zhí)行以下操作:R14_svc=addressofnextinstructionaftertheSWIinstruction//R14_svc指向SWI下一條要執(zhí)行指令SPSR_svc=CPSR//備份CPSRCPSR[4:0]=0b10011//進(jìn)入SVC模式CPSR[5]=0//執(zhí)行ARM狀態(tài)指令/*CPSR[6]isunchanged*/CPSR[7]=1//禁止IRQifhighvector
8、sconfiguredthen//進(jìn)入異常處理PC=0xFFFF0008elsePC=0x000000089/19/20219北京大學(xué)出版社出版 楊宗德編著預(yù)取指異常及處理存儲(chǔ)異常是由存儲(chǔ)系統(tǒng)產(chǎn)生的,當(dāng)試圖讀取一個(gè)不可用指令時(shí),將產(chǎn)生一個(gè)存儲(chǔ)器異常信號來標(biāo)識所取指指令不可用。當(dāng)試圖執(zhí)行該指令時(shí)將產(chǎn)生一個(gè)預(yù)取異常,如果該指令并沒有被執(zhí)行(例如在管理操作時(shí)執(zhí)行分支指令)則不會(huì)產(chǎn)生一個(gè)預(yù)取異常。在ARMv5及以上版本,