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