1 引言 ARM7TDMI體系的中斷向量的地址是動態分配在中斷向量控制器的寄存器中,例如,意法半導體(ST)公司生產的STR71x系列ARM微控制器,其增強型的中斷控制器(EIC)的EIC_IVR寄存器(中斷向量寄存器)、EIC_SIRn寄存器(源中斷寄存器)都是用于存儲相關中斷通道的中斷服務程序在存儲器中的地址,內核響應IRQ中斷后,再根據當前對應的中斷通道的中斷向量進行散轉,執行相應的中斷服務程序。對于一般的8位MCU,通常是將向量中斷人口固定分配ROM中,例如MCS-51單片機各個中斷的人口地址是固定的。兩者相比,ARM的中斷體系具有較大的靈活性,但卻降低了安全性和可靠性;MCU的中斷向量體系雖然失去了靈活性,但確保了系統的安全性和可靠性。 在系統長時間運行和強干擾的作用下,保存在寄存器中的ARM的各個中斷地址很容易受干擾信號的影響。當中斷向量地址被改寫后,程序必定跑飛,這種情況是無法忍受的,特別是在工控系統中。針對這種情況,本文提出了基于STR71x系列ARM微控制器將中斷向量固化到ROM的思路,可以提高系統的安全性和可靠性。 2 STR71x結構分析 STR71x系列是意法半導體(ST)公司生產的基于ARM7TDMI內核的微控制器,片上集成高達256 KB+16 KB的Flash和64 KB的RAM,擁有豐富的外設和增強的I/O功能,具有高性價比。STR71x內部有一個獨立的增強型中斷控制器,可完成多個中斷通道的硬件處理、中斷優先級決策和自動產生中斷向量等功能,如圖1所示。 EIC中的優先級解碼器是一個不斷計算掛起IRQ最高優先級的組合模塊,當決策出最高優先級中斷后,它把EIC_IVR寄存器(中斷向量寄存器)更新為最高優先級中斷服務程序的地址,并且拉低nIRQ內部信號。軟件讀取EIC_IVR寄存器的內容后。獲得當前中斷通道所對應的中斷服務程序的地址,從而散轉執行對應的中斷服務程序。而在讀取EIC_IVR寄存器值的一個時鐘周期后,EIC_CICR寄存器(當前中斷通道寄存器)被更新為當前響應的IRQ中斷通道的標號,EIC_CIPR寄存器(當前中斷優先級寄存器)被更新為當前響應的IRQ中斷通道的優先級。 中斷向量寄存器EIC_IVR是一個32位的寄存器,其中,高16位IVR[31:16]不依賴于當前響應的中斷。對于所有的IRQ中斷通道來說,這16位都是相同的,它是在初始化時由用戶程序配置的。而低16位IVR[15:0]則依賴于當前響應的中斷(即當前具有最高優先級的有效中斷),并且它是當前系統響應的中斷通道所對應的EIC_SIR寄存器中源中斷向量(SIV)的副本。EIC_SIRn是通道n的源中斷寄存器,其高16位SIV[31:16]是中斷通道n對應的中斷服務程序的存儲器地址的低16位。EIC_IVR寄存器的高16位IVR[31:16]與EIC_SIRn的高16位SIV[31:16]構成了中斷通道n對應的中斷服務程序的存儲器地址的首址。 3 IRQ中斷防御體系的構建 根據上面的分析可知,STR71x ARM中各個IRQ中斷通道的中斷服務程序入口地址是動態存放在EIC_IVR、EIC_SIRn等可讀寫的寄存器中,即存放在RAM中的,這樣很容易受干擾信號影響。當這些寄存器中的中斷服務程序地址被干擾信號改寫,產生中斷時,系統肯定無法正確進入相應的中斷服務程序,系統程序必定跑飛。所以,保護各個IRQ中斷通道的中斷服務程序入口地址就顯得相當必要。 軟件根據EIC_IVR寄存器中存放的地址去散轉執行對應的中斷服務程序的具體實現代碼。下面列舉了ST公司公布的標準固件代碼中關于IRQ中斷部分處理的代碼: 在上述程序中,系統響應中斷后,首先把R0~R12、SPSR等寄存器入棧保護,然后再通過讀取E-IC_IVR寄存器獲得當前響應的中斷通道所對應的中斷服務程序入口地址。 由前面的分析可知,EIC_CICR寄存器是存儲當前響應的IRQ中斷通道的標號,EIC_CICR寄存器在此成為構建防御體系的關鍵,利用它可將中斷向量固化到ROM中。 在構建的防御體系中,EIC響應IRQ中斷,軟件讀取一次EIC_IVR后,EIC_CICR寄存器更新當前響應的IRQ中斷通道的標號,然后獲取此標號的值,跳轉到固化在ROM的對應當前中斷通道的中斷服務程序入口,執行所響應的中斷通道的中斷服務程序。在上述所列出代碼的基礎上,修改了代碼如下,實現防御體系的構建。 比較修改前后的代碼,修改后每次執行的代碼只比原來增加了5條指令,中斷響應處理的實時性有所下降,但是,在高速的ARM微控制器上,犧牲5條指令周期的時間來換取系統的可靠和安全是完全值得的。 一般情況下,程序員不會對未使能的中斷通道編寫中斷服務程序,故此,在32個IRQ中斷通道散轉向量表中,可以把沒有使能的中斷通道直接鏈接到復位向量進行強行復位,代碼如下: 4 結束語 本文提出的IRQ中斷防御體系的構建,通過了Kell ARM3.04的開發環境調試。并成功應用在基于STR71x ARM微控制器的某數控切割加工的控制系統。在持續一個月的系統運行測試中,對在程序中沒有構建IRQ中斷防御體系的系統(簡稱“A系統”)和構建了IRQ中斷防御體系的系統(簡稱“B系統”)相比較,發現A系統曾經出現過兩次的程序跑飛現象,而B系統的運行穩定,未出現程序跑飛的情況?梢,采用了該防御體系后,大大提高ARM微控制器的抗干擾能力,增強了系統的可靠性和安全性。 |