專利名稱:基于PowerPC處理器結(jié)構(gòu)的分級(jí)任務(wù)切換方法
技術(shù)領(lǐng)域:
基于PowerPC處理器結(jié)構(gòu)的分級(jí)任務(wù)切換方法屬于嵌入式實(shí)時(shí)操作系統(tǒng)技術(shù)領(lǐng)域,尤其涉及基于PowerPC處理器結(jié)構(gòu)的嵌入式實(shí)時(shí)操作系統(tǒng)技術(shù)領(lǐng)域。
背景技術(shù):
任務(wù)切換機(jī)制是多任務(wù)實(shí)時(shí)操作系統(tǒng)的核心。其中,堆棧操作是任務(wù)切換的主要操作。堆棧操作的合理性,直接關(guān)系到操作系統(tǒng)的穩(wěn)定性和運(yùn)行效率。任務(wù)切換機(jī)制的主要任務(wù)是保存和恢復(fù)必要的程序運(yùn)行現(xiàn)場,使得程序可以在執(zhí)行過程中被打斷而不產(chǎn)生錯(cuò)誤結(jié)果。一方面,實(shí)時(shí)操作系統(tǒng)要求任務(wù)切換過程具有較高的速度;另一方面,嵌入式系統(tǒng)要求任務(wù)切換過程盡量節(jié)省資源。采用占先式調(diào)度的操作系統(tǒng),中斷處理過程和任務(wù)切換過程緊密聯(lián)系,任務(wù)切換所需的堆棧操作更為復(fù)雜。好的任務(wù)切換方法必須在保證系統(tǒng)可靠性的前提下,實(shí)現(xiàn)時(shí)間開銷和空間開銷的平衡。
目前,現(xiàn)存的嵌入式實(shí)時(shí)操作系統(tǒng)種類繁多,各具特色。比較著名的嵌入式實(shí)時(shí)操作系統(tǒng)包括VxWorks、pSOS、QNX、WinCE、μC/OS-II和各種嵌入式實(shí)時(shí)Linux等等。為了保證通用性,上述各種嵌入式實(shí)時(shí)操作系統(tǒng)的任務(wù)切換機(jī)制均采用與處理器無關(guān)的實(shí)現(xiàn)框架,針對(duì)不同類型的處理器只進(jìn)行細(xì)微的代碼改動(dòng),這種方式有利于減少代碼移植的工作量。但是,目前各種處理器在堆棧操作、尋址操作等方面的指令系統(tǒng)特征差別很大,如果針對(duì)特定的處理器結(jié)構(gòu)設(shè)計(jì)任務(wù)切換機(jī)制,將更有利于充分利用特定處理器的功能,提高在該處理器平臺(tái)上的運(yùn)行效率。
在現(xiàn)有的任務(wù)切換機(jī)制中,保存和恢復(fù)程序運(yùn)行現(xiàn)場(在多任務(wù)操作系統(tǒng)中即為用戶任務(wù)上下文,Context)是一次完成的,這個(gè)過程存在一些多余的操作,也就是說,程序運(yùn)行現(xiàn)場的一部分狀態(tài)實(shí)際上并沒有被改變,不需要保存。一些操作系統(tǒng)根據(jù)不同情況,保存用戶任務(wù)上下文的某一個(gè)或多個(gè)部分,以減少多余操作。但這種做法限制了后續(xù)程序的操作內(nèi)容,降低了系統(tǒng)的靈活性。
程序運(yùn)行現(xiàn)場在內(nèi)存中的保存位置有兩種不同選擇在用戶堆棧中或在系統(tǒng)堆棧中?,F(xiàn)有實(shí)時(shí)操作系統(tǒng)的任務(wù)切換機(jī)制只采用兩種堆棧中的一種。在存在中斷嵌套的系統(tǒng)中,只用用戶堆棧使得每個(gè)用戶任務(wù)都必須預(yù)留較大的堆棧空間;而只用系統(tǒng)堆棧則使得在發(fā)生任務(wù)調(diào)度時(shí)要進(jìn)行額外的堆棧調(diào)整,降低了速度。
發(fā)明內(nèi)容
針對(duì)現(xiàn)有實(shí)時(shí)操作系統(tǒng)的任務(wù)切換機(jī)制與處理器特性結(jié)合不夠緊密、切換過程中存在多余操作、堆棧使用不夠經(jīng)濟(jì)的問題,本發(fā)明基于PowerPC結(jié)構(gòu)指令體系堆棧操作指令可以批量分配堆??臻g的特殊功能,提出了分級(jí)任務(wù)切換方法,主要包括下列內(nèi)容1、分級(jí)入棧技術(shù)將用戶任務(wù)上下文劃分為基本、擴(kuò)展和可選部分。在中斷處理中,根據(jù)系統(tǒng)配置和任務(wù)調(diào)度性質(zhì)的不同,采用只有基本部分入棧、基本部分和擴(kuò)展部分入棧和全部上下文入棧三種方式。中斷處理過程首先執(zhí)行第一級(jí)入棧操作,保存上下文的基本部分,執(zhí)行中斷處理程序后,判斷任務(wù)調(diào)度要求,選擇執(zhí)行下一級(jí)入棧操作并激活調(diào)度器,或者恢復(fù)現(xiàn)場返回用戶任務(wù)。
2、用戶堆棧和系統(tǒng)堆棧間切換機(jī)制在中斷預(yù)處理中進(jìn)行堆棧切換,使用戶堆棧只保留用戶任務(wù)上下文,系統(tǒng)堆棧保留中斷服務(wù)程序上下文,降低用戶堆棧的負(fù)荷。
3、提供了系統(tǒng)配置接口,可供用戶進(jìn)行系統(tǒng)級(jí)和任務(wù)級(jí)兩種級(jí)別的配置。
4、提供了對(duì)用戶中斷服務(wù)程序的封裝。用戶可以自行編寫中斷服務(wù)程序,經(jīng)過封裝自動(dòng)生成實(shí)現(xiàn)上述機(jī)制的系統(tǒng)。
本發(fā)明的特征在于它除了實(shí)現(xiàn)由用戶任務(wù)來執(zhí)行激活新任務(wù)或申請(qǐng)調(diào)度的操作外,主要針對(duì)以操作系統(tǒng)代碼的形式來執(zhí)行由中斷程序激活任務(wù)而產(chǎn)生任務(wù)切換的情況;所述的操作系統(tǒng)代碼含有以下部分系統(tǒng)啟動(dòng)代碼放在MPC555微控制器地址0x100處,在系統(tǒng)上電復(fù)位時(shí)自動(dòng)執(zhí)行,依次含有硬件初始化、初始化堆棧、初始化就緒任務(wù)列表以及開始調(diào)度的操作。系統(tǒng)內(nèi)核操作代碼包括供系統(tǒng)啟動(dòng)代碼、用戶任務(wù)代碼、或中斷處理程序調(diào)用的激活任務(wù)、終止任務(wù)和按照規(guī)定策略從就緒任務(wù)列表中選取一個(gè)用戶任務(wù)再跳轉(zhuǎn)到該任務(wù)執(zhí)行的這樣一種調(diào)度器操作;系統(tǒng)內(nèi)核操作代碼支持搶占式調(diào)度,即當(dāng)用戶任務(wù)代碼或者中斷處理程序調(diào)用系統(tǒng)內(nèi)核操作激活一個(gè)高優(yōu)先級(jí)的用戶任務(wù)的時(shí)候,激活任務(wù)操作可以調(diào)用調(diào)度器選擇新激活的任務(wù),強(qiáng)制打斷正在運(yùn)行的優(yōu)先級(jí)較低的用戶任務(wù),而轉(zhuǎn)到激活的任務(wù)去執(zhí)行。
用戶任務(wù)代碼任務(wù)由用戶自定義。該用戶任務(wù)可以調(diào)用系統(tǒng)內(nèi)核操作,激活其他任務(wù)、申請(qǐng)調(diào)度或者終止自身的執(zhí)行。
就緒任務(wù)列表記錄當(dāng)前可以執(zhí)行的用戶任務(wù)信息,包括任務(wù)優(yōu)先級(jí)、用戶程序入口地址和用戶堆棧指針這三個(gè)數(shù)值。
中斷處理程序操作代碼它依次含有中斷處理程序入口、用戶中斷服務(wù)程序和中斷處理程序結(jié)束三個(gè)部分。其中,外部中斷處理程序放在MPC555微控制器的入口地址0x500處,計(jì)數(shù)器中斷處理程序放在入口地址0x900處,該中斷處理的優(yōu)先級(jí)高于用戶任務(wù)優(yōu)先級(jí),由用戶中斷服務(wù)程序激活了的新任務(wù),只能等中斷處理程序結(jié)束后再通過調(diào)度器來執(zhí)行。
所述的中斷處理程序,其框架依次包含保存現(xiàn)場、堆棧切換、調(diào)用用戶服務(wù)程序、中斷恢復(fù)處理四個(gè)步驟,現(xiàn)分述如下(1)保存現(xiàn)場在批量預(yù)留堆??臻g的條件下,分級(jí)入棧式的保存被打斷任務(wù)的執(zhí)行現(xiàn)場,即MPC555中CPU的各種寄存器的值。PowerPC處理器結(jié)構(gòu)下的寄存器遵循統(tǒng)一的PowerPC-EABI(基于PowerPC結(jié)構(gòu)的嵌入式系統(tǒng)代碼接口)規(guī)范。
首先,把用戶任務(wù)上下文即寄存器按內(nèi)容劃分為以下三個(gè)部分基本部分包括鏈接寄存器(LR)、機(jī)器狀態(tài)寄存器(MSR)、保存中斷結(jié)束后返回地址的機(jī)器狀態(tài)保存/恢復(fù)寄存器(SRR0)、保存中斷發(fā)生時(shí)MSR狀態(tài)的機(jī)器狀態(tài)保存/恢復(fù)寄存器(SRR1)、條件寄存器(CR)、整數(shù)異常寄存器(XER)、計(jì)數(shù)寄存器(CTR)及通用寄存器r0、r3~r12;在調(diào)用高級(jí)語言函數(shù)時(shí)應(yīng)當(dāng)保存。
擴(kuò)展部分包括通用寄存器r14~r31,只在任務(wù)調(diào)度時(shí)需要保存。
可選部分浮點(diǎn)寄存器f0~f31和浮點(diǎn)狀態(tài)寄存器FPSCR,只用于浮點(diǎn)計(jì)算情況下。
其次,在執(zhí)行任務(wù)過程中產(chǎn)生中斷時(shí),或者在執(zhí)行另一個(gè)中斷處理程序過程中產(chǎn)生中斷即中斷嵌套時(shí),在根據(jù)PowerPC處理器指令體系所定義的堆棧操作指令批量預(yù)留了保存完整上下文即全部寄存器內(nèi)容的條件下,只先執(zhí)行第一級(jí)入棧操作即只先執(zhí)行保留基本部分的操作;在中斷處理程序結(jié)束后若要進(jìn)行任務(wù)調(diào)度時(shí),再進(jìn)行第二級(jí)入棧操作保存擴(kuò)展部分或第二級(jí)和第三級(jí)保存可選部分的入棧操作,激活調(diào)度器,否則恢復(fù)現(xiàn)場返回用戶任務(wù)。
(2)堆棧切換使用戶堆棧只保留用戶任務(wù)上下文,系統(tǒng)堆棧保留中斷服務(wù)程序上下文,根據(jù)中斷層數(shù)或中斷處理結(jié)束后任務(wù)調(diào)度的情況使堆棧指針在用戶堆棧和系統(tǒng)堆棧之間進(jìn)行堆棧切換。
(3)調(diào)用用戶中斷服務(wù)程序中斷處理程序通過一個(gè)包括中斷索引地址和對(duì)應(yīng)的用戶中斷服務(wù)程序入口地址兩項(xiàng)的中斷查找表跳轉(zhuǎn)到用戶編寫的中斷服務(wù)程序;再通過系統(tǒng)定義的一個(gè)全局性的調(diào)度標(biāo)志來通知中斷處理程序是否需要進(jìn)行任務(wù)切換,該調(diào)度標(biāo)準(zhǔn)設(shè)在系統(tǒng)內(nèi)核操作代碼中,在第一層中斷處理程序進(jìn)行堆棧切換的同時(shí)置為0,當(dāng)用戶中斷服務(wù)程序要激活新任務(wù)時(shí),把調(diào)度標(biāo)志置為1,通知中斷服務(wù)程序需要進(jìn)行任務(wù)切換,它根據(jù)系統(tǒng)配置情況進(jìn)行第二級(jí)或第二、第三級(jí)入棧操作,把相應(yīng)寄存器的值寫入第一級(jí)入棧操作時(shí)預(yù)留的用戶堆棧空間里。
(4)中斷恢復(fù)處理若用戶中斷服務(wù)程序完成后,判斷不需要進(jìn)行任務(wù)切換,則中斷處理程序直接執(zhí)行恢復(fù)現(xiàn)場操作,返回被中斷的用戶任務(wù)。
經(jīng)過在MPC555平臺(tái)上初步測試,用本發(fā)明所述的方法從產(chǎn)生中斷到進(jìn)入用戶中斷處理程序所需時(shí)間比采用通用方法要少,提高了任務(wù)切換的效率。
圖1.清華OSEK操作系統(tǒng)內(nèi)核部分組成2.由中斷產(chǎn)生任務(wù)切換的流程示意3.MPC555微控制器結(jié)構(gòu)4.MPC555的CPU結(jié)構(gòu)框5.MPC555寄存器分類示意6.分級(jí)任務(wù)切換方法的實(shí)現(xiàn)程序框7.第一級(jí)入棧過程示意8.第二、第三級(jí)入棧過程示意9.中斷處理程序框架流程圖具體實(shí)施方式
本發(fā)明提出的方法是嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核的一部分,以操作系統(tǒng)代碼的形式實(shí)現(xiàn)。下面以清華大學(xué)自主開發(fā)的清華OSEK(汽車電子開放式系統(tǒng)及其相應(yīng)接口)操作系統(tǒng)、基于MPC555微控制器的硬件平臺(tái)環(huán)境為例,說明分級(jí)任務(wù)切換方法的具體實(shí)施方式
。
MPC555微控制器中,規(guī)定了多個(gè)程序入口地址。系統(tǒng)啟動(dòng)代碼放在入口地址0x100處,外部中斷處理程序放在入口地址0x500處、計(jì)數(shù)器中斷處理程序放在入口地址0x900處。當(dāng)系統(tǒng)上電復(fù)位時(shí),從0x100地址處開始執(zhí)行啟動(dòng)代碼。
運(yùn)行于MPC555平臺(tái)上的清華OSEK操作系統(tǒng)包括五部分啟動(dòng)代碼、系統(tǒng)內(nèi)核操作、用戶任務(wù)代碼、就緒任務(wù)列表和中斷處理程序。如附圖1所示。
啟動(dòng)代碼在系統(tǒng)上電復(fù)位時(shí)自動(dòng)執(zhí)行。第一步先進(jìn)行硬件初始化操作,即暫時(shí)禁止硬件中斷、設(shè)置系統(tǒng)時(shí)鐘頻率以及關(guān)閉軟件看門狗。這些操作的細(xì)節(jié)見表2說明。第二步操作是將堆棧指針寄存器和數(shù)據(jù)段基地址寄存器(在后面有詳細(xì)介紹)分別設(shè)置為系統(tǒng)堆棧和數(shù)據(jù)段的地址(具體數(shù)值由用戶指定)。第三步操作是將可以開始執(zhí)行的任務(wù)添加到就緒任務(wù)列表中。最后,啟動(dòng)代碼打開硬件中斷開關(guān)允許硬件中斷,再執(zhí)行系統(tǒng)內(nèi)核操作中的調(diào)度操作,開始執(zhí)行用戶任務(wù)。
系統(tǒng)內(nèi)核操作包括激活任務(wù)、終止任務(wù)和調(diào)度器三個(gè)操作。激活任務(wù)操作將一個(gè)用戶任務(wù)添加到就緒任務(wù)列表,終止任務(wù)操作將任務(wù)從就緒任務(wù)列表中刪除。調(diào)度器是任務(wù)切換機(jī)制的核心,按照一定的策略從就緒任務(wù)列表中選取一個(gè)用戶任務(wù),跳轉(zhuǎn)到該任務(wù)開始執(zhí)行。
用戶任務(wù)代碼是用戶編寫的一段程序,完成一定的功能,任務(wù)何時(shí)可以開始執(zhí)行、何時(shí)結(jié)束、進(jìn)行什么操作均由用戶自行定義,不屬于操作系統(tǒng)設(shè)計(jì)的內(nèi)容。用戶任務(wù)可以調(diào)用系統(tǒng)內(nèi)核操作,激活其他任務(wù)、申請(qǐng)調(diào)度或者終止自身的執(zhí)行。
就緒任務(wù)列表記錄當(dāng)前可以執(zhí)行的用戶任務(wù)信息,包括任務(wù)優(yōu)先級(jí)、用戶程序入口地址、用戶堆棧指針。這三個(gè)數(shù)值最初均由用戶自行定義。在系統(tǒng)運(yùn)行過程中,用戶代碼或者操作系統(tǒng)代碼都可以修改用戶堆棧指針的值,從而達(dá)到在堆棧中保存或者恢復(fù)數(shù)據(jù)的目的。如果一個(gè)任務(wù)放在就緒任務(wù)列表中,稱這些任務(wù)處于就緒態(tài)。
中斷處理程序是操作系統(tǒng)中相對(duì)獨(dú)立的一部分,這部分代碼放在中斷處理程序入口地址處。中斷處理程序通常只在啟動(dòng)代碼執(zhí)行完畢、進(jìn)入用戶任務(wù)之后才被允許執(zhí)行,它由系統(tǒng)中的硬件事件觸發(fā),何時(shí)執(zhí)行由運(yùn)行時(shí)的軟硬件狀態(tài)決定,在設(shè)計(jì)中無法預(yù)計(jì)。中斷處理程序可以調(diào)用系統(tǒng)內(nèi)核操作,激活新任務(wù),從而打亂用戶任務(wù)執(zhí)行的流程。
清華OSEK作為符合OSEK規(guī)范的操作系統(tǒng),具有如下特征1、每個(gè)任務(wù)用一個(gè)優(yōu)先級(jí)數(shù)值表示其重要程度。調(diào)度器選擇處于就緒任務(wù)列表中的最高優(yōu)先級(jí)的任務(wù)執(zhí)行。
2、支持搶占式調(diào)度,即一個(gè)優(yōu)先級(jí)高的用戶任務(wù)可以強(qiáng)制打斷一個(gè)優(yōu)先級(jí)低的用戶任務(wù)的執(zhí)行。
3、中斷處理程序優(yōu)先級(jí)高于用戶任務(wù)優(yōu)先級(jí)。在中斷處理程序中如果激活了新任務(wù),不能立刻進(jìn)行任務(wù)調(diào)度,而應(yīng)該等中斷處理程序結(jié)束后才進(jìn)行。所以,搶占式調(diào)度只發(fā)生在第一層中斷程序結(jié)束處。
在符合OSEK規(guī)范的操作系統(tǒng)中,發(fā)生任務(wù)調(diào)度有兩種可能情況。一種是用戶任務(wù)執(zhí)行了可能激活新任務(wù)的操作,另一種是用戶任務(wù)執(zhí)行被中斷,中斷處理程序激活新任務(wù)。在本發(fā)明實(shí)現(xiàn)的系統(tǒng)中,對(duì)第一種情況的處理和目前其他操作系統(tǒng)的處理基本一致,主要針對(duì)第二種情況進(jìn)行改進(jìn)。
由中斷處理程序激活任務(wù)而產(chǎn)生任務(wù)切換的情況見附圖2所示。用戶中斷服務(wù)程序調(diào)用系統(tǒng)內(nèi)核操作,激活希望執(zhí)行的任務(wù),將其添加到用戶任務(wù)列表。中斷處理程序在結(jié)束的時(shí)候,調(diào)用調(diào)度器,如果新激活的任務(wù)優(yōu)先級(jí)比正在執(zhí)行的當(dāng)前任務(wù)優(yōu)先級(jí)高,就將原來處于執(zhí)行狀態(tài)的當(dāng)前任務(wù)切換為就緒態(tài),然后將新激活的任務(wù)作為當(dāng)前運(yùn)行任務(wù),跳轉(zhuǎn)到該任務(wù)的代碼,開始執(zhí)行。
MPC555微控制器的結(jié)構(gòu)見附圖3所示。它主要包括精簡指令CPU、內(nèi)部存儲(chǔ)器、外部設(shè)備和總線接口。其中,和本發(fā)明相關(guān)的主要是前兩部分。內(nèi)部存儲(chǔ)器是操作系統(tǒng)代碼和數(shù)據(jù)的存放空間,精簡指令CPU是代碼的運(yùn)行環(huán)境。精簡指令CPU的結(jié)構(gòu)如附圖4所示。它包括一系列寄存器和處理單元。本發(fā)明所涉及的硬件部分主要是CPU中的寄存器,如圖4中淺色框標(biāo)出的部分。寄存器保留了程序運(yùn)行過程的所有瞬時(shí)信息。MPC555的寄存器全集見附圖5,其中,用戶程序運(yùn)行需要用到的寄存器如表1所示。
表1 PowerPC結(jié)構(gòu)處理器主要寄存器列表
按照PowerPC-EABI規(guī)范,通用寄存器r1在操作系統(tǒng)中作為系統(tǒng)堆棧的指針,又稱為堆棧寄存器(簡稱SP)。
在PowerPC硬件體系結(jié)構(gòu)中,中斷處理程序代碼根據(jù)其類型的不同,放在內(nèi)存的不同起始地址處。當(dāng)硬件產(chǎn)生中斷信號(hào)以后,CPU響應(yīng)中斷,自動(dòng)切換到相應(yīng)的入口地址執(zhí)行指令。
在清華OSEK操作系統(tǒng)中,本發(fā)明提出的方法被作為操作系統(tǒng)核心代碼的一部分實(shí)現(xiàn)并封裝起來,在系統(tǒng)生成的時(shí)候放置在MPC555處理器規(guī)定的外部中斷入口地址0x500、計(jì)數(shù)器中斷入口地址0x900處(還可以視用戶要求增加入口地址),成為中斷處理程序框架。這一框架包括保存現(xiàn)場、堆棧切換、調(diào)用用戶處理程序、中斷恢復(fù)處理四個(gè)步驟。附圖6為本發(fā)明所述方法具體實(shí)施的程序框圖。
假設(shè)系統(tǒng)原來在運(yùn)行某一任務(wù),當(dāng)中斷產(chǎn)生時(shí),如附圖6中標(biāo)有“中斷響應(yīng)”的箭頭所示,CPU當(dāng)前指令指針由指向任務(wù)程序改為指向中斷處理程序入口,開始執(zhí)行本發(fā)明設(shè)計(jì)的中斷處理程序框架。
中斷處理程序框架的第一步操作是保存被打斷任務(wù)的執(zhí)行現(xiàn)場,也就是CPU的各種寄存器的值。PowerPC處理器結(jié)構(gòu)下的寄存器遵循統(tǒng)一的規(guī)范(PowerPC-EABI規(guī)范),有嚴(yán)格的用途劃分,在堆棧中的位置也有嚴(yán)格要求。
在PowerPC處理器結(jié)構(gòu)中,LR保存函數(shù)調(diào)用時(shí)的返回地址,MSR保存程序運(yùn)行過程的處理器配置狀態(tài),SRR0保存中斷結(jié)束后的返回地址,SRR1保存中斷發(fā)生時(shí)的MSR狀態(tài),CR、XER保存整數(shù)運(yùn)算、邏輯運(yùn)算和浮點(diǎn)運(yùn)算指令設(shè)置的標(biāo)志位,CTR用于程序循環(huán)計(jì)數(shù)。這些寄存器是程序運(yùn)行過程必不可少的。因此,一段程序如果被打斷后恢復(fù)執(zhí)行,必須恢復(fù)這些寄存器原來的狀態(tài),才能使程序運(yùn)行正常。
根據(jù)PowerPC-EABI規(guī)范,通用寄存器r0~r31中,r1為堆棧指針,r2、r13為系統(tǒng)小數(shù)據(jù)段的基地址,這幾個(gè)寄存器的內(nèi)容不會(huì)被用戶任務(wù)破壞。r0、r3~r12用于函數(shù)調(diào)用時(shí)傳入和返回參數(shù),不論用戶任務(wù)或者中斷處理程序,都可能修改這些寄存器的值。所以在任務(wù)切換過程中和中斷處理中都必須保留這些寄存器的值。
r14~r31用于保存臨時(shí)變量,如果一段程序需要用到這些寄存器,應(yīng)該先保存它的數(shù)值,在這段程序退出的時(shí)候恢復(fù)。如果用戶任務(wù)執(zhí)行過程發(fā)生中斷,中斷處理程序而不激活新任務(wù),那么中斷處理程序結(jié)束的時(shí)候會(huì)恢復(fù)這些寄存器中改動(dòng)的部分,返回用戶程序的時(shí)候就像沒有修改過一樣,所以,一般的中斷處理過程中不需要保存這些寄存器。而如果中斷處理程序激活了新任務(wù),則新任務(wù)可能修改這些寄存器,并且無法預(yù)計(jì)什么時(shí)候會(huì)切換回原來的用戶任務(wù),這個(gè)時(shí)候,就必須在中斷處理程序中把這些寄存器保存下來。
浮點(diǎn)寄存器用于浮點(diǎn)計(jì)算,只有當(dāng)用戶程序進(jìn)行浮點(diǎn)運(yùn)算時(shí)才會(huì)改動(dòng)。一般而言,操作系統(tǒng)核心代碼以及絕大部分中斷處理程序都不需要使用浮點(diǎn)寄存器。浮點(diǎn)狀態(tài)寄存器保存浮點(diǎn)運(yùn)算時(shí)設(shè)置的標(biāo)志,隨浮點(diǎn)寄存器一起被改動(dòng)。
依據(jù)以上規(guī)定,可將寄存器、也就是程序上下文劃分為三個(gè)部分1.基本部分包括寄存器LR、MSR、SRR0、SRR1、CR、XER、CTR及通用寄存器r0、r3~r12。這些寄存器在調(diào)用高級(jí)語言函數(shù)時(shí)內(nèi)容可能被破壞,需要保存。
2.擴(kuò)展部分通用寄存器r14~r31,這些寄存器只在任務(wù)調(diào)度時(shí)需要保存。
3.可選部分浮點(diǎn)寄存器f0~f31和浮點(diǎn)狀態(tài)寄存器FPSCR,只對(duì)使用浮點(diǎn)計(jì)算的用戶任務(wù)有意義。
在符合OSEK規(guī)范的操作系統(tǒng)中,如果中斷是在執(zhí)行任務(wù)時(shí)產(chǎn)生的,那么視中斷處理的結(jié)果,有可能只需要保存第1部分也有可能需要保存第1、2部分或者全部三部分,這是無法預(yù)測的。如果中斷是在執(zhí)行另一個(gè)中斷處理程序時(shí)產(chǎn)生的,則只需要保留第1部分。
本發(fā)明采用折中辦法,即留出保留全部內(nèi)容的空間,但只先執(zhí)行保留第1部分的操作。這樣,既能兼顧各種可能的處理結(jié)果,又減少了不必要的操作,而且不違反PowerPC-EABI規(guī)范對(duì)寄存器存放位置的規(guī)定。
為方便敘述,設(shè)保存上下文第1部分所需的內(nèi)存空間字節(jié)數(shù)為S1,保存1、2部分所需內(nèi)存空間為S2,保存全部內(nèi)容所需空間為S3。在MPC555處理器中,S1=80,S2=152,S3=416。
PowerPC處理器指令體系所定義的堆棧操作指令與i386等處理器體系定義的逐字push/pop(即只在堆棧指針的頂部進(jìn)行數(shù)據(jù)存取,指針每次只能上移或下移一個(gè)數(shù)據(jù)單元)不同,采用預(yù)留堆??臻g和偏移地址訪問(指針可以一次移動(dòng)多個(gè)數(shù)據(jù)單元的位置,可以對(duì)堆棧內(nèi)部進(jìn)行數(shù)據(jù)存取操作)。本發(fā)明利用這一特性,批量預(yù)留了堆??臻g。程序首先執(zhí)行stwu指令,將堆棧指針上移,留出S2或S3的空間(視系統(tǒng)配置的結(jié)果,詳敘見后),但是只將基本部分的值保存到堆棧中,占S1空間。如附圖7所示。
由于第一級(jí)入棧操作時(shí)預(yù)留了保存完整上下文的空間,這樣,后面如果進(jìn)行第二級(jí)入棧操作將不需要重新分配空間和作額外的調(diào)整,提高了處理效率。
保存現(xiàn)場之后,中斷處理程序框架進(jìn)行堆棧切換。首先,將用來記錄中斷層數(shù)的變量加一,如果是第一層中斷,則將堆棧指針由指向被打斷任務(wù)的用戶堆棧區(qū)改為指向系統(tǒng)堆棧區(qū)。這樣,當(dāng)發(fā)生中斷嵌套時(shí),中斷處理程序的程序現(xiàn)場在系統(tǒng)堆棧中保存,而用戶任務(wù)的程序現(xiàn)場是在堆棧切換前保存的,在用戶堆棧區(qū)。這樣,既降低了用戶堆棧的負(fù)荷,又便于進(jìn)行任務(wù)調(diào)度。如果是嵌套中斷,由于第一層中斷處理程序已經(jīng)進(jìn)行了切換,堆棧指針已經(jīng)指向系統(tǒng)堆棧區(qū),無須再進(jìn)行切換。
隨后,中斷處理程序框架通過查詢中斷查找表,跳轉(zhuǎn)到用戶編寫的中斷服務(wù)程序。中斷查找表包括中斷索引地址和對(duì)應(yīng)的用戶中斷服務(wù)程序入口地址兩項(xiàng)。中斷索引地址是MPC555處理器定義的一個(gè)序數(shù)表,用不同的中斷請(qǐng)求號(hào)表示不同的引起中斷的硬件。發(fā)生中斷的時(shí)候,MPC555的SIVEC寄存器記錄了當(dāng)前應(yīng)該處理的中斷請(qǐng)求號(hào)。用戶在編寫中斷服務(wù)程序時(shí)只需實(shí)現(xiàn)自己所要的處理功能,并將函數(shù)入口地址填入中斷查找表相應(yīng)中斷請(qǐng)求號(hào)的表項(xiàng)中。中斷處理程序框架通過讀取SIVEC,就可以檢索中斷查找表中對(duì)應(yīng)中斷請(qǐng)求號(hào)的表項(xiàng),轉(zhuǎn)到對(duì)應(yīng)的用戶中斷服務(wù)程序地址執(zhí)行。
操作系統(tǒng)中定義了一個(gè)全局標(biāo)志,稱為調(diào)度標(biāo)志。中斷處理程序框架在第一層中斷處理程序進(jìn)行堆棧切換的同時(shí),將調(diào)度標(biāo)志置為0,然后再執(zhí)行用戶編寫的中斷服務(wù)程序。用戶中斷服務(wù)程序如果想激活新任務(wù),需要調(diào)用系統(tǒng)內(nèi)核操作才能實(shí)現(xiàn),操作系統(tǒng)會(huì)在系統(tǒng)內(nèi)核操作中將調(diào)度標(biāo)志置為1,以通知中斷服務(wù)程序框架需要進(jìn)行任務(wù)切換。
從用戶中斷服務(wù)程序返回本程序后,進(jìn)入中斷恢復(fù)處理步驟。這一步驟包括多個(gè)判斷分支和對(duì)應(yīng)的任務(wù)切換操作。
在中斷恢復(fù)處理步驟中,將記錄中斷層數(shù)的變量減一,判斷是否為第一層中斷。如果是不是第一層中斷,不需要進(jìn)行堆棧切換,而且按照OSEK規(guī)范的要求,不能進(jìn)行任務(wù)調(diào)度。于是程序執(zhí)行恢復(fù)現(xiàn)場操作將從堆棧中讀出上下文基本部分的寄存器值,逐一放到CPU對(duì)應(yīng)的寄存器中,然后執(zhí)行中斷返回指令rfi。這時(shí),CPU的當(dāng)前指令指針會(huì)指回上一層中斷處理程序,繼續(xù)執(zhí)行上一次層中斷。如果是第一層中斷,則進(jìn)行堆棧切換,使堆棧指針指回用戶任務(wù)區(qū)。
隨后,中斷處理程序框架判斷調(diào)度標(biāo)志是否為1,如果是,則需要進(jìn)行任務(wù)切換,應(yīng)進(jìn)行第二級(jí)入棧操作,將擴(kuò)展部分和可選部分的寄存器填入堆棧中已經(jīng)預(yù)留好的空間。如果系統(tǒng)配置選擇該任務(wù)使用可選部分的寄存器,則CPU中擴(kuò)展部分和可選部分寄存器的值都應(yīng)寫入第一級(jí)入棧操作時(shí)預(yù)留的堆??臻g里。如果系統(tǒng)配置選擇該任務(wù)不使用可選部分,則只將擴(kuò)展部分寄存器寫入。如附圖8所示。
清華OSEK操作系統(tǒng)按照OSEK實(shí)現(xiàn)語言規(guī)范(OSEK-OIL),提供了系統(tǒng)配置接口,通過該接口用戶可以進(jìn)行系統(tǒng)級(jí)和任務(wù)級(jí)兩種級(jí)別的配置,即指定所有用戶任務(wù)或者個(gè)別用戶任務(wù)使用或不使用可選部分的寄存器。
經(jīng)過上述操作以后,用戶堆棧中保存的上下文結(jié)構(gòu)與從一個(gè)任務(wù)切換到另一個(gè)任務(wù)時(shí)的上下文結(jié)構(gòu)完全一樣,所有任務(wù)都可以通過調(diào)度器被掛起或執(zhí)行。中斷處理程序執(zhí)行最后一步操作,調(diào)用調(diào)度器,選擇應(yīng)該執(zhí)行的用戶任務(wù),從堆棧中恢復(fù)寄存器的值到CPU中,切換到該用戶任務(wù)執(zhí)行。
如果中斷處理完成后,判斷不需要進(jìn)行任務(wù)切換,則中斷處理程序直接執(zhí)行恢復(fù)現(xiàn)場操作,返回被中斷的用戶任務(wù)。
MPC555處理器由中斷處理程序或者調(diào)度器切換到上一層中斷處理程序或者用戶任務(wù)的機(jī)制如下在用戶任務(wù)代碼或者中斷處理程序代碼被打斷時(shí),保存現(xiàn)場的操作將該段代碼恢復(fù)執(zhí)行時(shí)的返回地址存入堆棧中,當(dāng)前面所述過程中執(zhí)行恢復(fù)現(xiàn)場操作時(shí),又將返回地址寫入SRR0寄存器,然后調(diào)度器或者中斷處理程序執(zhí)行中斷返回指令rji,CPU就將當(dāng)前指令指針指向SRR0所指的地址,從而實(shí)現(xiàn)了切換到用戶任務(wù)代碼或者上一層中斷處理程序代碼的功能。
上述整個(gè)中斷處理程序框架的詳細(xì)流程圖見附圖9。
本發(fā)明的方法,在清華OSEK操作系統(tǒng)中進(jìn)行了應(yīng)用,作為中斷處理程序的核心,在系統(tǒng)中成功嵌入了時(shí)鐘中斷、CAN總線中斷和串口中斷。經(jīng)過在MPC555平臺(tái)上初步測試,采用上述方法,從產(chǎn)生中斷到進(jìn)入用戶中斷處理程序只需要13微秒;而如果采用通用的方法,需要23~33微秒。由此可見,本發(fā)明所述的方法提高了任務(wù)切換的效率。本發(fā)明實(shí)施方式中涉及的主要MPC555硬件操作如表2所示。
本發(fā)明所述方法適用于所有PowerPC處理器結(jié)構(gòu)的微控制器。
表2主要MPC555硬件操作列表
權(quán)利要求
1.基于PowerPC處理器結(jié)構(gòu)的分級(jí)任務(wù)切換方法,以操作系統(tǒng)代碼的形式實(shí)現(xiàn)任務(wù)的切換,其特征在于它除了實(shí)現(xiàn)由用戶任務(wù)來執(zhí)行激活新任務(wù)或申請(qǐng)調(diào)度的操作外,主要針對(duì)以操作系統(tǒng)代碼的形式來執(zhí)行由中斷程序激活任務(wù)而產(chǎn)生任務(wù)切換的情況;所述的操作系統(tǒng)代碼含有以下部分系統(tǒng)啟動(dòng)代碼放在MPC555微控制器地址0x100處,在系統(tǒng)上電復(fù)位時(shí)自動(dòng)執(zhí)行,依次含有硬件初始化、初始化堆棧、初始化就緒任務(wù)列表以及開始調(diào)度的操作;系統(tǒng)內(nèi)核操作代碼包括供系統(tǒng)啟動(dòng)代碼、用戶任務(wù)代碼、或中斷處理程序調(diào)用的激活任務(wù)、終止任務(wù)和按照規(guī)定策略從就緒任務(wù)列表中選取一個(gè)用戶任務(wù)再跳轉(zhuǎn)到該任務(wù)執(zhí)行的這樣一種調(diào)度器操作;系統(tǒng)內(nèi)核操作代碼支持搶占式調(diào)度,即當(dāng)用戶任務(wù)代碼或者中斷處理程序調(diào)用系統(tǒng)內(nèi)核操作激活一個(gè)高優(yōu)先級(jí)的用戶任務(wù)的時(shí)候,激活任務(wù)操作可以調(diào)用調(diào)度器選擇新激活的任務(wù),強(qiáng)制打斷正在運(yùn)行的優(yōu)先級(jí)較低的用戶任務(wù),而轉(zhuǎn)到激活的任務(wù)去執(zhí)行;用戶任務(wù)代碼任務(wù)由用戶自定義;該用戶任務(wù)可以調(diào)用系統(tǒng)內(nèi)核操作,激活其他任務(wù)、申請(qǐng)調(diào)度或者終止自身的執(zhí)行;就緒任務(wù)列表記錄當(dāng)前可以執(zhí)行的用戶任務(wù)信息,包括任務(wù)優(yōu)先級(jí)、用戶程序入口地址和用戶堆棧指針這三個(gè)數(shù)值;中斷處理程序操作代碼它依次含有中斷處理程序入口、用戶中斷服務(wù)程序和中斷處理程序結(jié)束三個(gè)部分;其中,外部中斷處理程序放在MPC555微控制器的入口地址0x500處,計(jì)數(shù)器中斷處理程序放在入口地址0x900處,該中斷處理的優(yōu)先級(jí)高于用戶任務(wù)優(yōu)先級(jí),由用戶中斷服務(wù)程序激活了的新任務(wù),只能等中斷處理程序結(jié)束后再通過調(diào)度器來執(zhí)行;所述的中斷處理程序,其框架依次包含保存現(xiàn)場、堆棧切換、調(diào)用用戶服務(wù)程序、中斷恢復(fù)處理四個(gè)步驟,現(xiàn)分述如下(1)保存現(xiàn)場在批量預(yù)留堆??臻g的條件下,分級(jí)入棧式的保存被打斷任務(wù)的執(zhí)行現(xiàn)場,即MPC555中CPU的各種寄存器的值;PowerPC處理器結(jié)構(gòu)下的寄存器遵循統(tǒng)一的PowerPC-EABI(基于PowerPC結(jié)構(gòu)的嵌入式系統(tǒng)代碼接口)規(guī)范;首先,把用戶任務(wù)上下文即寄存器按內(nèi)容劃分為以下三個(gè)部分基本部分包括鏈接寄存器(LR)、機(jī)器狀態(tài)寄存器(MSR)、保存中斷結(jié)束后返回地址的機(jī)器狀態(tài)保存/恢復(fù)寄存器(SRR0)、保存中斷發(fā)生時(shí)MSR狀態(tài)的機(jī)器狀態(tài)保存/恢復(fù)寄存器(SRR1)、條件寄存器(CR)、整數(shù)異常寄存器(XER)、計(jì)數(shù)寄存器(CTR)及通用寄存器r0、r3~r12;在調(diào)用高級(jí)語言函數(shù)時(shí)應(yīng)當(dāng)保存;擴(kuò)展部分包括通用寄存器r14~r31,只在任務(wù)調(diào)度時(shí)需要保存;可選部分浮點(diǎn)寄存器f0~f31和浮點(diǎn)狀態(tài)寄存器FPSCR,只用于浮點(diǎn)計(jì)算情況下;其次,在執(zhí)行任務(wù)過程中產(chǎn)生中斷時(shí),或者在執(zhí)行另一個(gè)中斷處理程序過程中產(chǎn)生中斷即中斷嵌套時(shí),在根據(jù)PowerPC處理器指令體系所定義的堆棧操作指令批量預(yù)留了保存完整上下文即全部寄存器內(nèi)容的條件下,只先執(zhí)行第一級(jí)入棧操作即只先執(zhí)行保留基本部分的操作;在中斷處理程序結(jié)束后若要進(jìn)行任務(wù)調(diào)度時(shí),再進(jìn)行第二級(jí)入棧操作保存擴(kuò)展部分或第二級(jí)和第三級(jí)保存可選部分的入棧操作,激活調(diào)度器,否則恢復(fù)現(xiàn)場返回用戶任務(wù);(2)堆棧切換使用戶堆棧只保留用戶任務(wù)上下文,系統(tǒng)堆棧保留中斷服務(wù)程序上下文,根據(jù)中斷層數(shù)或中斷處理結(jié)束后任務(wù)調(diào)度的情況使堆棧指針在用戶堆棧和系統(tǒng)堆棧之間進(jìn)行堆棧切換;(3)調(diào)用用戶中斷服務(wù)程序中斷處理程序通過一個(gè)包括中斷索引地址和對(duì)應(yīng)的用戶中斷服務(wù)程序入口地址兩項(xiàng)的中斷查找表跳轉(zhuǎn)到用戶編寫的中斷服務(wù)程序;再通過系統(tǒng)定義的一個(gè)全局性的調(diào)度標(biāo)志來通知中斷處理程序是否需要進(jìn)行任務(wù)切換,該調(diào)度標(biāo)準(zhǔn)設(shè)在系統(tǒng)內(nèi)核操作代碼中,在第一層中斷處理程序進(jìn)行堆棧切換的同時(shí)置為0,當(dāng)用戶中斷服務(wù)程序要激活新任務(wù)時(shí),把調(diào)度標(biāo)志置為1,通知中斷服務(wù)程序需要進(jìn)行任務(wù)切換,它根據(jù)系統(tǒng)配置情況進(jìn)行第二級(jí)或第二、第三級(jí)入棧操作,把相應(yīng)寄存器的值寫入第一級(jí)入棧操作時(shí)預(yù)留的用戶堆??臻g里;(4)中斷恢復(fù)處理若用戶中斷服務(wù)程序完成后,判斷不需要進(jìn)行任務(wù)切換,則中斷處理程序直接執(zhí)行恢復(fù)現(xiàn)場操作,返回被中斷的用戶任務(wù)。
全文摘要
基于PowerPC處理器結(jié)構(gòu)的分級(jí)任務(wù)切換方法,屬于嵌入式實(shí)時(shí)操作系統(tǒng)領(lǐng)域,其特征在于它針對(duì)PowerPC處理器結(jié)構(gòu)的特殊性,把用戶任務(wù)上下文劃分為基本、擴(kuò)展和可選三部分,在中斷處理中,根據(jù)系統(tǒng)配置和任務(wù)調(diào)度情況,采用只有基本部分入棧、基本和擴(kuò)展部分入棧和全部上下文入棧三種方式;中斷處理程序首先執(zhí)行基本部分入棧,執(zhí)行中斷處理后判斷任務(wù)調(diào)度性質(zhì),選擇執(zhí)行下一級(jí)入棧操作、調(diào)用調(diào)度器,或者恢復(fù)現(xiàn)場返回用戶任務(wù)。減少了不必要的堆棧操作。作為清華大學(xué)汽車電子開放式系統(tǒng)的一部分,在MPC555平臺(tái)上實(shí)施。測試表明,它提高了任務(wù)切換的效率,加快了系統(tǒng)運(yùn)行速度。
文檔編號(hào)G06F9/48GK1490722SQ03157389
公開日2004年4月21日 申請(qǐng)日期2003年9月19日 優(yōu)先權(quán)日2003年9月19日
發(fā)明者孫曉民, 蔡云鵬 申請(qǐng)人:清華大學(xué)