S3C4480X平臺上μC/OS-Ⅱ的中斷系統(tǒng)設計
引 言
嵌入式實時系統(tǒng)要求系統(tǒng)有很好的實時性,能夠及時處理各種異常事件,因此中斷系統(tǒng)是嵌入式實時系統(tǒng)的重要組成部分,其時間和空間性能對嵌入式實時系統(tǒng)性能的影響至關重要。要想縮短嵌入式實時系統(tǒng)的中斷響應時間并提高系統(tǒng)中斷處理效率,合理地設計中斷系統(tǒng)非常關鍵。S3C44BOX是三星公司基于ARM7TDMI內核的微處理器,支持IRQ和FIQ中斷請求,同時還支持向量中斷,以縮短中斷響應時間。嵌入式實時操作系統(tǒng)μC/OS-II提供了簡單的中斷管理機制對系統(tǒng)中斷進行統(tǒng)一管理,但是對于不同的微處理器沒有給出具體的中斷處理方法。本文在深入分析S3C448OX中斷控制系統(tǒng)和μC/OS-II中斷管理機制的基礎上,進行中斷系統(tǒng)設計,使之能更好地滿足實際應用的需求。
1 S3C4480X中斷系統(tǒng)
圖1所示為S3C44BOX的中斷系統(tǒng)結構框圖。中斷控制器的任務是在片內外圍和片外中斷源組成的多重中斷發(fā)生時,經(jīng)過優(yōu)先級判斷、選擇其中一個中斷;通過IRQ或FIQ向ARM7內核發(fā)出IRQ或FIQ中斷請求,ARM7內核從中斷控制器中獲取中斷信息,然后對中斷進行處理,控制中斷設備的操作過程。
當ARM7內核接收到中斷控制器的中斷請求時會自動執(zhí)行以下幾步操作,以實現(xiàn)中斷環(huán)境保護和程序跳轉:
①將程序狀態(tài)寄存器CPSR的內容保存到將要執(zhí)行的中斷模式的程序狀態(tài)保存寄存器SPSR中,以實現(xiàn)對處理器當前狀態(tài)、中斷屏蔽位和各條件標志位的保存。
②設置當前CPSR中的相應位,屏蔽相應中斷并切換處理器模式。
③將引起中斷指令的下一條指令的地址(斷點地址)保存到中斷模式的子程序鏈接寄存器LR中,使中斷服務程序執(zhí)行完后能正確返回原程序。
④給程序計數(shù)器PC強制賦值,使程序從相應的向量地址開始執(zhí)行中斷服務程序。
當中斷服務程序執(zhí)行完后,需要執(zhí)行以下幾步操作從中斷服務程序中返回:
①從中斷模式堆棧中恢復所有修改過的通用寄存器(RO~R12)。
②將中斷模式SPSR寄存器的內容復制到CPSR中,恢復被中斷模式程序的工作狀態(tài)。
③將LR的內容賦給PC,使PC返回到相應的指令處。
④清除CPSR中的中斷禁止標志位。
在中斷返回的過程中,②和③需要同時完成。
2 μC/OS-II中斷處理過程
μC/OS-II提供了函數(shù)OSIntEnter()和OSIntExit(),用于中斷處理。函數(shù)OSIntEnter()通知操作系統(tǒng)進入中斷服務程序,函數(shù)OSIntExit()在中斷服務程序返回時進行相應的處理。μC/OS-II的中斷響應過程如圖2所示。進入中斷服務程序時,首先將全部CPU寄存器存入當前任務棧,然后調用函數(shù)OSIntEnter(),或者將中斷嵌套層數(shù)計數(shù)器,即全局變量OSIntNesting直接加1,通知μC/OS-II進入中斷服務程序,執(zhí)行用戶代碼進行中斷服務。中斷服務完成后調用函數(shù)OSIntExit(),將變量
OSIntNesting減1。當OSIntNesting減到O時,所有中斷執(zhí)行完畢,此時μC/OS-II要判斷是否有優(yōu)先級較高的任務被中斷服務程序喚醒。如果有優(yōu)先級高的任務進入就緒態(tài),μC/OS-II就返回到優(yōu)先級高的任務執(zhí)行;否則,返回到當前任務繼續(xù)執(zhí)行。
通過對μC/OS-II中斷處理過程的分析可知,μC/OS-II只是提供了簡單的中斷管理機制,對于中斷進入時的中斷環(huán)境保護、中斷退出時的中斷環(huán)境恢復、中斷嵌套處理和堆棧分配等問題沒有給出具體的處理方法。另外,對于不同的處理器,其中斷處理的方法也不一樣,所以在不同的處理器上移植μC/OS-II后,要根據(jù)處理器的具體特點,進行中斷系統(tǒng)的設計。
3 中斷系統(tǒng)設計
在中斷系統(tǒng)設計過程中,所有的IRQ中斷納入操作系統(tǒng)的管理范圍,由操作系統(tǒng)統(tǒng)一管理;FIQ中斷獨立于操作系統(tǒng)之外,不受操作系統(tǒng)管理。因此,中斷系統(tǒng)的設計包括兩部分:IRQ中斷和FIQ中斷。
3.1 中斷系統(tǒng)結構
S3C44BOX提供了IRQ和FIQ兩種中斷方式。ARM中設計FIQ中斷是為了在快速處理的場合使用,但是進入操作系統(tǒng)進行管理的任何中斷都需做一些同樣的前期準備工作和后期結束工作,包括為被中斷的任務保存環(huán)境等。如果把FIQ中斷納入操作系統(tǒng)進行管理,則FIQ中斷的優(yōu)勢并不明顯,因此,在中斷系統(tǒng)的設計過程中沒有將FIQ中斷納入操作系統(tǒng)的管理范圍,而是由用戶單獨進行FIQ中斷服務程序的設計。
S3C4480X針對IRQ中斷方式,提供了向量中斷方式,這樣在中斷發(fā)生時可以減少中斷程序的跳轉次數(shù),進而縮短中斷響應時間;但是μC/OS-II移植到S3C44B0X處理器上之后,所有的IRQ中斷都要由操作系統(tǒng)進行統(tǒng)一的管理,即在中斷發(fā)生時程序都要跳轉到統(tǒng)一的入口處進行中斷環(huán)境保護,然后執(zhí)行中斷服務程序。如果采用向量中斷,不但不能縮短中斷的響應時間,反而在中斷發(fā)生時由于程序要跳轉到統(tǒng)一的入口處而延長中斷的響應時間。
由上面的分析可知,中斷系統(tǒng)的設計中沒有將FIQ中斷納入操作系統(tǒng)的管理范圍,而是由用戶自己根據(jù)實際情況進行設計。一方面可以提供快速的中斷反應,另一方面增強了系統(tǒng)的靈活性;同時,由于向量中斷用于操作系統(tǒng)不能加快中斷的反應速度,所以在中斷系統(tǒng)的設計中也沒有使用向量中斷方式。中斷系統(tǒng)的結構如圖3所示。當發(fā)生IRQ中斷時,處理器會從地址Ox18處取指令,執(zhí)行0x18處的跳轉指令,跳轉到統(tǒng)一的中斷人口,進行中斷分發(fā)和環(huán)境保護后執(zhí)行具體的中斷服務程序。IRQ中斷處理的過程由操作系統(tǒng)統(tǒng)一管理。與IRQ中斷相比,F(xiàn)IQ中斷處理過程比較簡單,當發(fā)生FIQ中斷時,處理器會執(zhí)行地址0x20處的跳轉指令直接轉到具體的中斷服務程序。
3.2 ARM處理器運行模式
ARM處理器有7種運行模式:用戶模式(USR)、系統(tǒng)模式(SYS)、管理模式(SVC)、中止模式(ABT)、未定義模式(UND)、普通中斷模式(IRQ)和快速中斷模式(FIQ)。處理器在不同的情況下處于不同的模式中。在中斷系統(tǒng)的設計中,主要涉及SVC、UND、IRQ和FIQ四種模式。
在ARM處理器中,SVC模式通常是操作系統(tǒng)內核代碼的運行模式,μC/OS-II內核中主要代碼在SVC模式下運行,系統(tǒng)任務代碼運行在SVC模式下。
IRQ/FIQ模式是在發(fā)生IRQ/FIQ中斷后處理器強制進入的模式,用于中斷處理。ARM處理器在發(fā)生IRQ/FIQ中斷時自動改寫IRQ/FIQ模式中的LR寄存器,LR保存被中斷模式的返回地址(進入中斷前的PC值),以便中斷退出時能夠正確返回到被中斷模式;同時,LR也是每個模式下函數(shù)調用的返回地址寄存器。也就是說,LR寄存器具有保存函數(shù)返回地址和中斷返回地址兩種功能,LR的雙重功能在中斷嵌套程序設計中會發(fā)生沖突。
如果用IRQ/FIQ模式嵌套中斷自身,則本模式的LR被改寫后,本模式下原有的函數(shù)返回地址就無法還原。因此,應該在關閉中斷的條件下,在IRQ/FIQ模式中進行基本的環(huán)境保護后,將中斷服務程序切換到SYS模式下運行。這種處理方式能夠保證產(chǎn)生中斷嵌套時,被中斷的模式是SYS模式而不是IRQ/FIQ模式自身,IRQ/FIQ模式中的LR保存著回到SYS模式的返回地址,SYS模式中的LR未被破壞,保存著函數(shù)返回地址。在移植中使用UND模式替代SYS模式作為中斷服務的運行模式,這樣可以實現(xiàn)中斷嵌套的功能。
3.3 中斷嵌套方式
嵌套應該采用半嵌套方式,并不需要完全嵌套方式。“半嵌套”是指不同設備中斷之間可以嵌套,但是同一設備中斷不能嵌套。這樣設計既照顧了系統(tǒng)實時性的要求,又能讓系統(tǒng)具有更明確和穩(wěn)定的行為;否則,如果開發(fā)完全嵌套,中斷服務的堆??臻g就存在不確定性,甚至中斷響應時間上限也存在不確定性,這些顯然不能滿足嵌入式實時系統(tǒng)的需求。
通過設置CPSR寄存器的中斷屏蔽位F/I來屏蔽系統(tǒng)的中斷,這樣的保護稱為“硬保護”;通過設置中斷屏蔽寄存器中的相應位以屏蔽某一具體的中斷,這樣的保護稱為“設備保護”。要實現(xiàn)半嵌套方式,需要在中斷進入和退出時,在適當?shù)臅r候進行兩種保護方式的切換:
①在進入設備保護后還沒有讀取數(shù)據(jù)時退出硬保護。
②在即將退出ISR,使能設備中斷位之前,再次恢復系統(tǒng)的硬保護。
具體的實現(xiàn)過程如圖4所示。
3.4 IRQ中斷設計
IRQ中斷處理過程中涉及中斷環(huán)境保護、處理器運行模式切換和中斷環(huán)境恢復等過程。中斷處理過程如下:
中斷入口條件:IRQ中斷屏蔽,LR是被中斷模式的PC值,SPSR是被中斷模式的當前處理器狀態(tài)值,SP是IRQ模式的當前堆棧指針值。
①在IRQ模式下保存環(huán)境。
②判斷是否為第一層中斷,如果不是程序跳轉到④。
③設置中斷嵌套層數(shù)變量OSIntNesting值為1,切換到SVC模式以便將IRQ模式堆棧中保存的中斷環(huán)境保存到任務堆棧中,當前任務SP指針保存到任務控制塊中;然后切換到UND模式準備執(zhí)行中斷服務程序ISR,程序跳轉到⑤。
④中斷嵌套層數(shù)變量OSIntNesting加1,切換到UND模式,將保存在IRQ模式下的任務環(huán)境拷貝到ISR的堆棧中,即UND模式堆棧中。
⑤調用IRQ中斷處理函數(shù),執(zhí)行中斷服務程序。
⑥中斷結束處理。屏蔽中斷,遞減中斷嵌套計數(shù),判斷是否為最后一層。如果不是,繼續(xù)執(zhí)行中斷服務;否則,執(zhí)行任務調度,使優(yōu)先級最高的任務運行。
⑦恢復上一層中斷服務程序ISR的環(huán)境,執(zhí)行上一層的中斷服務程序。
具體的中斷服務程序執(zhí)行流程如圖5所示。
3.5 FIQ中斷設計
μC/OS-II移植到S3C4480X之后,μC/OS-II沒有對FIQ中斷進行管理,這樣可以為系統(tǒng)保留一個快速響應的中斷源。如果在系統(tǒng)的設計過程中多個中斷源都配置為FIQ中斷,就要在中斷入口處進行中斷的分發(fā),然后進入相應的中斷服務程序中。這樣會增加中斷的響應時間,因此在系統(tǒng)設計中應該為FIQ中斷設置單獨的中斷源。由于μC/OS-II沒有對FIQ進行管理,所以FIQ中斷程序需由用戶單獨設計。FIQ中斷服務程序的執(zhí)行流程如圖6所示,發(fā)生FIQ中斷后系統(tǒng)進入FIQ模式進行簡單的環(huán)境保護,然后執(zhí)行中斷服務程序,最后恢復中斷環(huán)境返回。所有這些工作都是在FIQ模式下完成的。
4 系統(tǒng)測試
系統(tǒng)測試環(huán)境為北京恒豐銳科公司開發(fā)的hf44b0A三星ARM7開發(fā)板和μC/OS-II v2.61版本。系統(tǒng)測試包括3個部分:定時器中斷測試、IRQ中斷測試和FIQ中斷測試。首先對每一部分單獨進行測試,然后進行系統(tǒng)的總體測試。
(1)定時器中斷測試
μC/OS-II要求提供一個時鐘節(jié)拍(周期性定時中斷),來實現(xiàn)時間的延遲和超時功能。時鐘節(jié)拍每秒發(fā)生10~100次。本設計選用S3C44BOX的Timer0定時器產(chǎn)生系統(tǒng)的時鐘節(jié)拍,時鐘頻率為50 Hz。建立Task_main、Task_test和Task_led三個任務在每個任務中調用μC/OS-II系統(tǒng)延時函數(shù)OSTimeDly()實現(xiàn)不同時間長度的延時,通過串口輸出信號可以觀察到任務能夠按照預定的設置進行延時和調度。
(2)IRQ中斷測試
在定時器中斷測試過程中,Timer0中斷設置為IRQ中斷。在此基礎上再添加一個IRQ中斷,將S3C44B0X的外部中斷EINT4/5/6/7設置為按鍵中斷添加到系統(tǒng)中,當按鍵按下時點亮對應的LED燈,同時通過串口輸出按鍵信息。程序運行時,Timer0定時器按照固定的時間間隔發(fā)生中斷,在程序運行的過程中隨機按下任意按鍵,按鍵中斷能夠及時得到響應和準確返回。
(3)FIQ中斷測試
由于FIQ中斷不受操作系統(tǒng)管理,中斷響應速度快,因此將S3C44B0X的Timer2作為FIQ中斷。另外Tim-er2的中斷頻率較快(測試中設置為Timer0的10倍),通過串口輸出中斷信息,F(xiàn)IQ中斷能夠正常響應和返回。
在系統(tǒng)中同時設置上面的3種中斷,系統(tǒng)能夠穩(wěn)定地運行。
5 結 論
在嵌入式領域有各種類型的微處理器和操作系統(tǒng),將不同的微處理器和操作系統(tǒng)進行組合構成嵌入式系統(tǒng)后,就要根據(jù)兩者的特點進行中斷系統(tǒng)設計。針對S3C4480X和μC/OS-II進行中斷系統(tǒng)的設計,使μC/OS-II移植到S3C4480X系統(tǒng)后可以對中斷進行有效的管理,提高系統(tǒng)的執(zhí)行效率,其設計思想也可以應用到其他嵌入式中斷系統(tǒng)的設計中。但是,由于μC/OS-II本身的結構問題,所以在實際的應用中還需要進行具體的分析。