蘭天,郭堅(jiān),張紅軍,董振輝,韋涌泉
北京空間飛行器總體設(shè)計(jì)部,北京 100094
對(duì)星上時(shí)間進(jìn)行有效管理是保證航天器安全、可靠運(yùn)行的必要條件。星上時(shí)間管理通常包括時(shí)間恢復(fù)、時(shí)間校準(zhǔn)、時(shí)間維護(hù)、時(shí)間分發(fā)、時(shí)間獲取等幾個(gè)部分[1-6]。
時(shí)間恢復(fù)是在星載計(jì)算機(jī)異常切機(jī)、復(fù)位后,能夠讓星上時(shí)間延續(xù)切機(jī)、復(fù)位前的狀態(tài),并盡可能保證時(shí)間精度。時(shí)間校準(zhǔn)是通過(guò)直接授時(shí)、集中校時(shí)、均勻校時(shí)等手段,保證天地時(shí)統(tǒng)和航天器器間時(shí)統(tǒng),修正航天器守時(shí)誤差。時(shí)間維護(hù)是根據(jù)任務(wù)需要選擇高穩(wěn)晶振,控制航天器時(shí)鐘漂移,提升守時(shí)精度。時(shí)間分發(fā)是以秒脈沖、時(shí)間廣播等手段,為航天器中各時(shí)間用戶提供高精度時(shí)間。時(shí)間獲取是為星載計(jì)算機(jī)的程控、自主管理、自主健康等功能提供可靠、精確的判據(jù)。
航天軟件是具備強(qiáng)實(shí)時(shí)性特點(diǎn)的中斷驅(qū)動(dòng)型嵌入式軟件。在航天軟件中準(zhǔn)確獲取星上時(shí)間的主要挑戰(zhàn)是中斷搶占、中斷嵌套造成的數(shù)據(jù)競(jìng)爭(zhēng)。為保證星上時(shí)間獲取準(zhǔn)確性,首先要有效識(shí)別需要獲取星上時(shí)間的應(yīng)用場(chǎng)景,對(duì)相應(yīng)場(chǎng)景中不同優(yōu)先級(jí)的中斷間數(shù)據(jù)競(jìng)爭(zhēng)進(jìn)行有效的檢測(cè)和識(shí)別[7-13]。在此基礎(chǔ)上,合理設(shè)計(jì)中斷服務(wù)程序[14-15]和相應(yīng)的星上時(shí)間獲取方法[17-18],以預(yù)防因數(shù)據(jù)競(jìng)爭(zhēng)造成星上時(shí)間獲取異常。
航天器大多選擇82C54作為計(jì)時(shí)芯片,并將其配置為秒定時(shí)器使用[16]。在星載計(jì)算機(jī)軟件中維護(hù)一個(gè)含有秒部與毫秒部的星上時(shí)間,配合82C54一起完成航天器的時(shí)間維護(hù)。隨著航天器的功能、性能需求的演進(jìn),82C54定時(shí)器產(chǎn)生的秒中斷往往不再是航天器中優(yōu)先級(jí)最高的中斷。秒中斷與其他中斷間時(shí)序的不確定性可能導(dǎo)致出現(xiàn)中斷搶占和中斷嵌套,造成獲取到的星時(shí)與實(shí)際星時(shí)差1s的問(wèn)題。為了解決這一問(wèn)題,前人在硬件措施[17]和軟件措施[18]上均進(jìn)行了有益的探索。
本文首先對(duì)以往工程實(shí)踐中的4種軟件實(shí)現(xiàn)的星上時(shí)間獲取方法進(jìn)行了分析,明確其適用和不適用的數(shù)據(jù)競(jìng)爭(zhēng)場(chǎng)景。然后,針對(duì)工程應(yīng)用中遇到的處理器自動(dòng)清除中斷未決寄存器,導(dǎo)致現(xiàn)有星上時(shí)間獲取方法無(wú)法適用的問(wèn)題,提出了一種不依賴中斷狀態(tài)的星上時(shí)間獲取方法。
航天器的星上時(shí)間通常由數(shù)據(jù)管理分系統(tǒng)或綜合電子分系統(tǒng)的星載計(jì)算機(jī)維護(hù)。在星載計(jì)算機(jī)軟件中維護(hù)一個(gè)有秒部和毫秒部的時(shí)間,同時(shí)采用82C54定時(shí)器芯片進(jìn)行秒計(jì)時(shí),即將82C54定時(shí)器產(chǎn)生中斷的周期定為1 s。
在初始化時(shí),對(duì)82C54進(jìn)行定時(shí)周期配置,82C54芯片自動(dòng)開(kāi)始倒數(shù)時(shí)間,當(dāng)?shù)褂?jì)時(shí)到1時(shí),82C54芯片輸出一個(gè)寬度為1個(gè)時(shí)鐘周期的中斷信號(hào),并重新加載計(jì)數(shù)值,開(kāi)始下一輪秒計(jì)時(shí),如圖1所示。星載計(jì)算機(jī)軟件響應(yīng)中斷進(jìn)入秒中斷服務(wù)程序后,對(duì)軟件維護(hù)的星上時(shí)間進(jìn)行加1 s的操作。在任意時(shí)刻,軟件可通過(guò)軟件維護(hù)的星上時(shí)間和82C54內(nèi)的毫秒計(jì)時(shí),計(jì)算得到準(zhǔn)確的星上時(shí)間。
在星載計(jì)算機(jī)軟件中,星上時(shí)間獲取問(wèn)題的關(guān)鍵在于:
1)82C54計(jì)時(shí)動(dòng)作與軟件維護(hù)秒值的動(dòng)作相互獨(dú)立,82C54在產(chǎn)生秒中斷后隨即開(kāi)始下一秒的計(jì)時(shí),不會(huì)等待軟件。
2)軟件獲取星上時(shí)間的動(dòng)作與軟件維護(hù)秒值的動(dòng)作之間存在對(duì)星上時(shí)間秒部的數(shù)據(jù)競(jìng)爭(zhēng)。在中斷搶占、中斷嵌套等工況下獲取星上時(shí)間,有可能出現(xiàn)秒中斷服務(wù)程序與星上時(shí)間獲取動(dòng)作兩者之間相互搶占的情況。此時(shí),會(huì)出現(xiàn)星上時(shí)間秒部的數(shù)據(jù)完整性問(wèn)題和星上時(shí)間秒部與毫秒部的數(shù)據(jù)匹配性問(wèn)題。
針對(duì)星上時(shí)間秒部的數(shù)據(jù)完整性問(wèn)題,可將軟件維護(hù)秒值的動(dòng)作、星上時(shí)間獲取函數(shù)中計(jì)算當(dāng)前星時(shí)的操作封裝為原子操作,通過(guò)關(guān)中斷保證數(shù)據(jù)完整性。
針對(duì)星上時(shí)間秒部與毫秒部的數(shù)據(jù)匹配性問(wèn)題,需綜合考慮比秒中斷優(yōu)先級(jí)更高的中斷數(shù)量、高優(yōu)先級(jí)中斷中獲取星上時(shí)間的時(shí)機(jī)、操作系統(tǒng)是否允許中斷嵌套等因素,合理設(shè)計(jì)星上時(shí)間獲取方法,準(zhǔn)確判斷秒中斷服務(wù)程序中是否維護(hù)過(guò)秒值,根據(jù)判斷結(jié)果決定是否對(duì)獲取到的時(shí)間進(jìn)行加1 s修正。
在現(xiàn)有航天器中,獲取星上時(shí)間的常見(jiàn)方法有4種[18],針對(duì)這4種方法在不同中斷場(chǎng)景下的適用性進(jìn)行了分析。
2.2.1 方法1
不關(guān)中斷,取2次82C54計(jì)數(shù),根據(jù)計(jì)數(shù)值是否發(fā)生翻轉(zhuǎn)判斷是否存在數(shù)據(jù)競(jìng)爭(zhēng)。方法1的星上時(shí)間獲取函數(shù)具體步驟如下:
1)第1次從82C54取毫秒值。
2)取軟件中保存的星時(shí)。
3)第2次從82C54取毫秒值。
4)比較2次從82C54取的毫秒值。若第2次取的毫秒值小于第一次取到的值,則認(rèn)為在取時(shí)間過(guò)程中發(fā)生過(guò)82C54定時(shí)中斷。重新讀取軟件中保存的星時(shí),用新讀到的星時(shí)和第2次取到的82C54毫秒值一起計(jì)算出當(dāng)前星時(shí),此時(shí)該時(shí)間已經(jīng)是在秒中斷服務(wù)程序中維護(hù)過(guò)的時(shí)間。
方法1適用于在比秒中斷優(yōu)先級(jí)低的中斷、任務(wù)中獲取星上時(shí)間,但不適用于在比秒中斷高的中斷中獲取星上時(shí)間。
如圖2所示,在T1時(shí)刻中斷A發(fā)生,在中斷A的中斷服務(wù)程序執(zhí)行過(guò)程中,在T2時(shí)刻取星上時(shí)間時(shí),發(fā)生秒中斷。由于中斷A的優(yōu)先級(jí)高于秒中斷,秒中斷需要等到T3時(shí)刻才能維護(hù)軟件中的星時(shí)。在這種工況下,方法1中第2次取到的軟件星時(shí)是和實(shí)際星上時(shí)間之間有1 s誤差的時(shí)間。
圖2 單個(gè)高優(yōu)先級(jí)中斷搶占秒中斷Fig.2 The second interrupt preempted by a single high-priority interrupt
2.2.2 方法2
關(guān)中斷,取2次82C54計(jì)數(shù),根據(jù)計(jì)數(shù)值是否翻轉(zhuǎn)判斷是否存在數(shù)據(jù)競(jìng)爭(zhēng)。方法2的星上時(shí)間獲取函數(shù)具體步驟如下:
1)關(guān)中斷。
2)第1次從82C54取毫秒值。
3)取軟件中保存的星時(shí)。
4)第2次從82C54取毫秒值。
5)比較2次從82C54取的毫秒值。若第2次取的毫秒值小于第一次取到的值,則認(rèn)為在取時(shí)間過(guò)程中產(chǎn)生了82C54定時(shí)中斷,但由于處于關(guān)中斷狀態(tài),該中斷暫未被響應(yīng)。此時(shí),在取到的軟件星時(shí)基礎(chǔ)上加1 s,然后使用修正后軟件星時(shí)和第2次從82C54取到的毫秒值一起計(jì)算出當(dāng)前星時(shí)。
6)開(kāi)中斷。
方法2適用于在比秒中斷優(yōu)先級(jí)低的中斷、任務(wù)中獲取星上時(shí)間,也部分適用于在比秒中斷優(yōu)先級(jí)高的中斷中獲取星上時(shí)間。將方法2用于在比秒中斷優(yōu)先級(jí)高的中斷中獲取星上時(shí)間時(shí),只適用于單個(gè)高優(yōu)先級(jí)中斷嵌套秒中斷,且進(jìn)入高優(yōu)先級(jí)中斷后馬上取星上時(shí)間的場(chǎng)景。
如圖3所示,中斷A優(yōu)先級(jí)高于中斷B,中斷B優(yōu)先級(jí)高于秒中斷。在中斷A執(zhí)行過(guò)程中,秒中斷于T1時(shí)刻發(fā)生;由于中斷優(yōu)先級(jí),秒中斷需要等待到T3時(shí)刻才能維護(hù)軟件中的星上時(shí)間。若在中斷B中,于T2時(shí)刻需獲取星上時(shí)間,此時(shí)采用方法2,根據(jù)從82C54中2次取到的毫秒值大小無(wú)法檢測(cè)到秒中斷嵌套,軟件無(wú)法決定是否在取到的軟件星時(shí)基礎(chǔ)上進(jìn)行加1 s的操作。
圖3 多個(gè)高優(yōu)先級(jí)中斷搶占秒中斷Fig.3 The second interrupt preempted by multiple high-priority interrupts
2.2.3 方法3
關(guān)中斷,通過(guò)讀處理器中斷狀態(tài),判斷是否嵌套了秒中斷。方法3的星上時(shí)間獲取函數(shù)具體步驟如下:
1)關(guān)中斷。
2)第1次從82C54取毫秒值。
3)取軟件中保存的星時(shí)。
4)讀處理器中斷狀態(tài),判斷是否嵌套了秒中斷。若嵌套了秒中斷,則再次從82C54取毫秒值,依據(jù)該毫秒值和加1 s后的軟件星時(shí),計(jì)算得到當(dāng)前的星上時(shí)間。
5)開(kāi)中斷。
方法3通過(guò)判斷處理器中斷狀態(tài),檢測(cè)秒中斷是否被搶占或嵌套,克服了方法1、方法2中判斷82C54計(jì)數(shù)值翻轉(zhuǎn)在某些場(chǎng)景可能存在的漏判問(wèn)題。但是,該方法和方法1、方法2一樣,只適用于不允許中斷嵌套的場(chǎng)景。在允許中斷嵌套的場(chǎng)景,該方法無(wú)法判斷秒中斷被嵌套時(shí)是否維護(hù)過(guò)軟件星時(shí)。
如圖4所示,中斷A優(yōu)先級(jí)高于秒中斷,在秒中斷開(kāi)始執(zhí)行后,中斷A打斷秒中斷。中斷A在T2時(shí)刻需要獲取星時(shí),此時(shí)采用方法3,通過(guò)處理器中斷狀態(tài)寄存器檢測(cè)到秒中斷被嵌套時(shí),并不能確定秒中斷是否維護(hù)過(guò)時(shí)間。若秒中斷在T3時(shí)刻維護(hù)時(shí)間,則通過(guò)方法3可以獲得正確的星上時(shí)間;若秒中斷在T1時(shí)刻維護(hù)時(shí)間,則通過(guò)方法3獲得的星上時(shí)間比實(shí)際時(shí)間多1 s。
圖4 高優(yōu)先級(jí)中斷嵌套秒中斷Fig.4 A high-priority interrupt nested within a second interrupt
2.2.4 方法4
關(guān)中斷,通過(guò)讀處理器中斷狀態(tài)判斷是否嵌套了秒中斷,通過(guò)維護(hù)時(shí)間標(biāo)識(shí)判斷秒中斷內(nèi)是否已經(jīng)對(duì)星上時(shí)間進(jìn)行加1 s的操作。
在前期工程實(shí)踐中,針對(duì)方法1、方法2、方法3都不能在中斷嵌套場(chǎng)景下準(zhǔn)確獲取星上時(shí)間的問(wèn)題,項(xiàng)目組提出了一種高可靠的星載軟件時(shí)間管理方法[18]。
方法4涉及時(shí)間獲取函數(shù)、秒中斷服務(wù)程序、高優(yōu)先級(jí)任務(wù)等3個(gè)模塊。該方法通過(guò)一個(gè)“秒中斷維護(hù)星上時(shí)間”的全局標(biāo)識(shí)來(lái)識(shí)別秒中斷被嵌套時(shí)是否已維護(hù)過(guò)星上時(shí)間。
在秒中斷服務(wù)程序中,具體步驟如下:
1)設(shè)置“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)為“未維護(hù)”。
2)關(guān)中斷。
3)設(shè)置“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)為“已維護(hù)”。
4)維護(hù)軟件中保存的星上時(shí)間。
5)開(kāi)中斷。
在秒中斷之后的第1個(gè)高優(yōu)先級(jí)任務(wù)中,將“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)設(shè)置為“未維護(hù)”。
在時(shí)間獲取函數(shù)中,根據(jù)中斷狀態(tài)寄存器和“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)一起判斷是否在獲取時(shí)間時(shí)進(jìn)行加1s操作,具體步驟如下:
1)關(guān)中斷。
2)獲取軟件中的星時(shí)和82C54中的計(jì)數(shù)值,根據(jù)這2個(gè)值得到當(dāng)前的星上時(shí)間。
3)讀處理器的中斷狀態(tài)寄存器,檢查是否有秒中斷。若沒(méi)有秒中斷,則維持上一步計(jì)算得到的星上時(shí)間不變;若有秒中斷,則進(jìn)一步檢查“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)。若“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)為“已維護(hù)”,則維持之前計(jì)算的星上時(shí)間不變;若“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)為“未維護(hù)”,則在之前計(jì)算的星時(shí)基礎(chǔ)上加1 s,作為當(dāng)前的星上時(shí)間。
4)開(kāi)中斷。
通過(guò)上述操作,方法4克服了方法3無(wú)法適應(yīng)中斷嵌套場(chǎng)景的問(wèn)題。
針對(duì)4種方法的適用場(chǎng)景進(jìn)行比較,如表1所示。
表1 星上時(shí)間獲取方法適用性比較
從表1可見(jiàn),上述方法的適用場(chǎng)景如下:
1)方法1僅適用于在優(yōu)先級(jí)比秒中斷低的任務(wù)、中斷中使用;
2)方法2在方法1基礎(chǔ)上,增加了在禁止中斷嵌套的前提下,單個(gè)高優(yōu)先級(jí)中斷搶占秒中斷,且在進(jìn)入高優(yōu)先級(jí)中斷后馬上獲取星上時(shí)間的支持;
3)方法3在方法2的基礎(chǔ)上,增加了在禁止中斷嵌套的前提下,多個(gè)高優(yōu)先級(jí)中斷搶占秒中斷時(shí),在任意高優(yōu)先級(jí)中斷里獲取星上時(shí)間的支持;
4)方法4在方法3的基礎(chǔ)上,增加了允許中斷嵌套的場(chǎng)景下,在任意高優(yōu)先級(jí)中斷里獲取星上時(shí)間的支持。
可見(jiàn),方法4是現(xiàn)有方法中適用范圍最廣的一種星上時(shí)間獲取方法。某新型處理器進(jìn)入中斷后,處理器會(huì)自動(dòng)清除相應(yīng)的中斷狀態(tài),且該清除動(dòng)作無(wú)法通過(guò)軟件進(jìn)行配置。這使得采用方法4獲取星上時(shí)間時(shí),無(wú)法在高優(yōu)先級(jí)中斷中檢測(cè)出是否嵌套了秒中斷,進(jìn)而無(wú)法獲取準(zhǔn)確的星上時(shí)間。因此,針對(duì)現(xiàn)有星上時(shí)間獲取方法與處理器中斷狀態(tài)清除機(jī)制不匹配的問(wèn)題,提出了一種不依賴中斷狀態(tài)的星上時(shí)間獲取方法。
現(xiàn)有星上時(shí)間獲取方法判斷是否應(yīng)進(jìn)行加1 s操作時(shí),進(jìn)行了兩方面判斷:一是是否發(fā)生了秒中斷嵌套,二是是否在被嵌套的秒中斷過(guò)程中維護(hù)過(guò)星上時(shí)間。
首先,通過(guò)82C54內(nèi)計(jì)數(shù)值判斷是否發(fā)生秒中斷嵌套。分析了“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)值的變化與82C54計(jì)數(shù)值之間的關(guān)系,如圖5所示。
從圖5中可見(jiàn),T1時(shí)刻為秒中斷發(fā)生時(shí)刻;T2時(shí)刻為秒中斷服務(wù)程序內(nèi)關(guān)中斷后將“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)的值從“未維護(hù)”變?yōu)椤耙丫S護(hù)”的時(shí)刻;T3為在高優(yōu)先級(jí)任務(wù)中將“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)的值設(shè)為“未維護(hù)”的時(shí)刻。
圖5 星上時(shí)間維護(hù)標(biāo)識(shí)值變化與82C54計(jì)數(shù)值之間的關(guān)系Fig.5 The relationship between the change of onboard-time modifying mark and the 82C54 counter
設(shè)在任意時(shí)刻都可能獲取星上時(shí)間,在從T1到T2的時(shí)間段內(nèi)獲取星上時(shí)間時(shí),需要在星上時(shí)間獲取函數(shù)中進(jìn)行加1 s的操作;在T2時(shí)刻之后,直到下一次秒中斷產(chǎn)生之前,獲取星上時(shí)間時(shí)不需進(jìn)行加1 s的操作。
T2時(shí)刻是一個(gè)不固定的值,其大小與在秒中斷發(fā)生后(T1時(shí)刻之后),所有比秒中斷優(yōu)先級(jí)更高的中斷服務(wù)程序的總執(zhí)行時(shí)間有關(guān)。因此,需要一個(gè)輔助判據(jù)來(lái)確定當(dāng)前處于T2時(shí)刻之前還是之后。
該輔助判據(jù)可通過(guò)“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)實(shí)現(xiàn)。在T1時(shí)刻到T3時(shí)刻之間,可通過(guò)“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)的值來(lái)判斷是處于T2時(shí)刻之前還是之后。
但是,T3時(shí)刻同樣是一個(gè)不固定的值。在上章所述的方法4中,T3時(shí)刻取決于秒中斷服務(wù)程序之后高優(yōu)先任務(wù)第1次開(kāi)始運(yùn)行的時(shí)間。
秒中斷信號(hào)在T1時(shí)刻產(chǎn)生,82C54計(jì)數(shù)值也在T1時(shí)刻發(fā)生翻轉(zhuǎn)。在T1時(shí)刻到T3時(shí)刻之間,82C54計(jì)數(shù)值呈單調(diào)遞減趨勢(shì),換算成的時(shí)間呈單調(diào)遞增趨勢(shì)??赏ㄟ^(guò)選取一個(gè)合適的時(shí)間閾值來(lái)判斷是否處于T3時(shí)刻之前,該時(shí)間閾值應(yīng)在T2時(shí)刻的理論最大值到T3時(shí)刻的理論最小值之間。
T2時(shí)刻的理論最小值是T1時(shí)刻,T2時(shí)刻的理論最大值可通過(guò)分析軟件中所有優(yōu)先級(jí)比秒中斷高的中斷服務(wù)程序的最高出現(xiàn)頻率和最大執(zhí)行時(shí)間得到。T3時(shí)刻的理論最小值是T2時(shí)刻,T3時(shí)刻的理論最大值應(yīng)在下次秒中斷來(lái)臨時(shí)刻之前。
通過(guò)調(diào)研現(xiàn)有星上軟件設(shè)計(jì)情況,使用82C54計(jì)時(shí)的相鄰兩次秒中斷的間隔有下述2類:
1)軟件不需要產(chǎn)生秒脈沖信號(hào)。軟件在授時(shí)、校時(shí)導(dǎo)致毫秒部變化時(shí),僅將變化累積在軟件維護(hù)的星上時(shí)間上,不調(diào)整82C54定時(shí)器的加載值。在該設(shè)計(jì)狀態(tài)下,相鄰兩次秒中斷間隔時(shí)間為1 s。
2)軟件需要產(chǎn)生秒脈沖信號(hào)。在發(fā)生授時(shí)、校時(shí)導(dǎo)致毫秒部變化時(shí),軟件需要重置一次82C54加載值,以保證下次秒中斷產(chǎn)生時(shí)刻與秒脈沖對(duì)齊。為避免相鄰兩次秒中斷間隔過(guò)短,軟件會(huì)調(diào)整加載進(jìn)82C54的毫秒值,將相鄰兩次秒中斷的間隔時(shí)間限制在500 ms~1.5 s之間。
可見(jiàn),應(yīng)保證在T2時(shí)刻出現(xiàn)理論最大值的情況下,T3時(shí)刻的理論最大值小于500 ms。
通過(guò)靜態(tài)分析和單元測(cè)試,獲得了比秒中斷優(yōu)先級(jí)高的中斷服務(wù)程序的最大執(zhí)行時(shí)間,在該時(shí)間基礎(chǔ)上考慮設(shè)計(jì)余量,將T2時(shí)刻的理論最大值計(jì)為100 ms。
在軟件中引入節(jié)拍計(jì)數(shù)Ctimes以控制T2時(shí)刻與T3時(shí)刻間的時(shí)間間隔,即在秒中斷服務(wù)程序中將Ctimes的值清零;在每次運(yùn)行高優(yōu)先任務(wù)時(shí)將Ctimes的計(jì)數(shù)加1,之后檢測(cè)到該計(jì)數(shù)≥閾值N且“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)的值為“已維護(hù)”時(shí),將“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)的值修改為“未維護(hù)”。設(shè)高優(yōu)先級(jí)任務(wù)的周期為Ttask,T3時(shí)刻的實(shí)際值滿足下式:
(T1+N×Ttask)≤T3≤
(T2max+(N+1)×Ttask)
(1)
在本項(xiàng)目中,Ttask為100 ms,N值為2,結(jié)合上述T2max為100 ms,可知T3時(shí)刻的范圍是(T1+200 ms)到(T1+400 ms),滿足T3時(shí)刻的理論最大值應(yīng)小于500 ms的約束條件。
在上述分析基礎(chǔ)上,選擇門限值150 ms,作為判斷軟件是否處于T2時(shí)刻到T3時(shí)刻之間的判據(jù),并根據(jù)上述分析的結(jié)論重新設(shè)計(jì)了秒中斷服務(wù)程序和星上時(shí)間獲取函數(shù)。
秒中斷服務(wù)程序流程如圖6所示。在秒中斷服務(wù)程序中維護(hù)星上時(shí)間秒值,將該過(guò)程封裝成原子操作,過(guò)程中關(guān)中斷。
圖6 秒中斷服務(wù)程序流程Fig.6 Flow of second interrupt service procedure
星上時(shí)間獲取函數(shù)流程如圖7所示。星上時(shí)間獲取步驟如下:
圖7 星上時(shí)間獲取函數(shù)流程Fig.7 Flow of onboard time acquisition procedure
1)關(guān)中斷。
2)獲取軟件中的星時(shí)和82C54中的計(jì)數(shù)值,根據(jù)這兩個(gè)值得到當(dāng)前的星上時(shí)間。
3)根據(jù)82C54計(jì)數(shù)值換算的毫秒值,判斷當(dāng)前是否存在因中斷搶占、中斷嵌套導(dǎo)致秒中斷產(chǎn)生后未維護(hù)星上時(shí)間的可能。
若82C54毫秒值大于150 ms,認(rèn)為不存在可能,維持之前計(jì)算的星上時(shí)間不變;若82C54毫秒值不大于150 ms,認(rèn)為存在可能,進(jìn)一步檢查“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)。
4)在82C54毫秒值不大于150 ms時(shí),若“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)為“已維護(hù)”,則維持之前計(jì)算的星上時(shí)間不變;若“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)為“未維護(hù)”,則在之前計(jì)算的星時(shí)基礎(chǔ)上加1 s,作為當(dāng)前的星上時(shí)間。
5)開(kāi)中斷。
從上述步驟可見(jiàn),和本文1.2節(jié)中提到的4種方法一樣,該方法的復(fù)雜度保持在O(1)級(jí)別,計(jì)算復(fù)雜度相當(dāng)。對(duì)5種方法的代碼實(shí)現(xiàn)進(jìn)行了比較,本節(jié)所提方法的代碼規(guī)模與方法4相近。
針對(duì)該方法在各種中斷嵌套場(chǎng)景下的工作情況進(jìn)行了分析:
1)高優(yōu)先級(jí)中斷發(fā)生在兩次秒中斷之間,高優(yōu)先級(jí)中任意時(shí)刻獲取星上時(shí)間。此時(shí)又可細(xì)分為2種情況,一是高優(yōu)先級(jí)中斷發(fā)生在T2時(shí)刻到150 ms之間,即上一次秒中斷剛結(jié)束;二是高優(yōu)先級(jí)中斷發(fā)生在150 ms到下次秒中斷來(lái)臨之間。
若高優(yōu)先級(jí)中斷發(fā)生在T2時(shí)刻到150 ms之間,此時(shí)“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)的狀態(tài)已在秒中斷里被改寫為“已維護(hù)”,因此不會(huì)進(jìn)行加1 s操作。
若高優(yōu)先級(jí)中斷發(fā)生在150 ms到下次秒中斷來(lái)臨之間,此時(shí)82C54毫秒值大于150 ms,因此不會(huì)進(jìn)行加1 s操作。在高優(yōu)先級(jí)中斷發(fā)生在兩次秒中斷之間時(shí),該方法能夠準(zhǔn)確獲得星上時(shí)間。
2)高優(yōu)先級(jí)中斷先發(fā)生,高優(yōu)先級(jí)中斷處理過(guò)程中,秒中斷發(fā)生,高優(yōu)先級(jí)中斷中任意時(shí)刻獲取星上時(shí)間。
此時(shí),82C54毫秒值在圖5中的T1時(shí)刻到T2時(shí)刻,滿足不大于150 ms的條件;同時(shí),“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)在上一個(gè)秒中斷后的T3時(shí)刻被設(shè)為“未維護(hù)”,此時(shí)星上時(shí)間獲取函數(shù)中會(huì)進(jìn)行加1 s操作。秒中斷在高優(yōu)先級(jí)中斷處理過(guò)程中發(fā)生的場(chǎng)景下,該方法能夠正確獲取星上時(shí)間。
3)秒中斷先發(fā)生,高優(yōu)先級(jí)中斷在秒中斷維護(hù)星上時(shí)間之前嵌套秒中斷,在高優(yōu)先級(jí)中斷中任意時(shí)刻獲取時(shí)間。
此時(shí),82C54毫秒值在圖5中的T1時(shí)刻到T2時(shí)刻,滿足不大于150 ms的條件;同時(shí),“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)在上一個(gè)秒中斷后的T3時(shí)刻被設(shè)為“未維護(hù)”,此時(shí)星上時(shí)間獲取函數(shù)中會(huì)進(jìn)行加1 s操作。該方法能夠正確獲取星上時(shí)間。
4)秒中斷先發(fā)生,高優(yōu)先級(jí)中斷在秒中斷維護(hù)星上時(shí)間之后嵌套秒中斷,在高優(yōu)先級(jí)中斷中任意時(shí)刻獲取時(shí)間。
此時(shí),“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)的狀態(tài)已在秒中斷里被改寫為“已維護(hù)”,因此不會(huì)進(jìn)行加1 s操作。該方法能夠正確獲取星上時(shí)間。
為驗(yàn)證星上時(shí)間獲取方法功能正確性,通過(guò)修改秒中斷服務(wù)程序的方式,模擬高優(yōu)先級(jí)中斷嵌套秒中斷的工況,測(cè)試用秒中斷服務(wù)程序如圖8所示。
在試驗(yàn)中將前文分析的各種場(chǎng)景,歸結(jié)為在秒中斷服務(wù)程序中關(guān)中斷前發(fā)生中斷嵌套并取星上時(shí)間(測(cè)試點(diǎn)1)和在秒中斷服務(wù)程序中開(kāi)中斷后發(fā)生中斷嵌套并取星上時(shí)間(測(cè)試點(diǎn)2)2種情況。
在測(cè)試點(diǎn)1、2,直接調(diào)用本文提出的星上時(shí)間獲取方法,獲取星上時(shí)間并保存在特定RAM區(qū)內(nèi)。在軟件任務(wù)隊(duì)列中添加測(cè)試信息輸出任務(wù),該任務(wù)從RAM區(qū)讀出待輸出的測(cè)試數(shù)據(jù),將其組織成特定格式,通過(guò)1553B總線消息輸出測(cè)試數(shù)據(jù),并通過(guò)1553B總線監(jiān)視設(shè)備進(jìn)行監(jiān)視,如圖9、圖10所示。
圖10 星上時(shí)間獲取方法測(cè)試記錄Fig.10 Test record of onboard time acquisition method
從圖9中可見(jiàn),RT18是該航天器1553B總線網(wǎng)絡(luò)中的一個(gè)空閑RT地址,軟件將其用作測(cè)試,通過(guò)向該RT的不同子地址發(fā)送定制內(nèi)容的測(cè)試消息,實(shí)現(xiàn)對(duì)軟件內(nèi)部狀態(tài)的靈活監(jiān)視。
發(fā)往RT18子地址6的測(cè)試消息類型為BC-RT消息,消息含32個(gè)數(shù)據(jù)字。星上時(shí)間占用的6個(gè)字節(jié)中,第1~4字節(jié)為秒部,第5、6字節(jié)為毫秒部,高字節(jié)在前,低字節(jié)在后。在測(cè)試點(diǎn)1、2采集的星上時(shí)間被放置在測(cè)試消息中的固定位置,第1~6字節(jié)(從1開(kāi)始計(jì)數(shù))為圖8中測(cè)試點(diǎn)1獲取的星上時(shí)間,即模擬在秒中斷發(fā)生后,秒中斷服務(wù)程序還未維護(hù)星上時(shí)間時(shí)被高優(yōu)先級(jí)中斷嵌套,在高優(yōu)先級(jí)中斷中獲取的星上時(shí)間。在第17~22字節(jié)打印了圖8中測(cè)試點(diǎn)2獲取的星上時(shí)間,即模擬在秒中斷發(fā)生后,秒中斷服務(wù)程序完成對(duì)星上時(shí)間維護(hù)后被高優(yōu)先級(jí)中斷嵌套,在高優(yōu)先級(jí)中斷中獲取的星上時(shí)間。格式與測(cè)試點(diǎn)1一致。
圖8 測(cè)試用秒中斷服務(wù)程序Fig.8 Second interrupt service procedure for verification
從圖9中可見(jiàn),用本文提出的星上時(shí)間獲取方法在測(cè)試點(diǎn)1、2獲取的星上時(shí)間一致,沒(méi)有相差1 s的問(wèn)題,說(shuō)明該方法能夠正確識(shí)別出是否發(fā)生中斷嵌套及發(fā)生中斷嵌套時(shí)秒中斷服務(wù)程序是否維護(hù)過(guò)星上時(shí)間。
圖9 通過(guò)1553B消息監(jiān)視在2個(gè)測(cè)試點(diǎn)獲取的時(shí)間Fig.9 Monitoring the onboard time acquired at two test points by 1553B message
在秒中斷服務(wù)程序維護(hù)時(shí)間前獲取星上時(shí)間時(shí),該方法能夠正確對(duì)取到的時(shí)間進(jìn)行修正;在秒中斷服務(wù)程序維護(hù)時(shí)間后獲取星上時(shí)間時(shí),該方法不會(huì)進(jìn)行誤修正。
針對(duì)時(shí)間獲取功能的穩(wěn)定性進(jìn)行了長(zhǎng)時(shí)間拷機(jī)測(cè)試,通過(guò)總線監(jiān)視的過(guò)濾功能檢索出相關(guān)測(cè)試記錄,對(duì)星上時(shí)間獲取穩(wěn)定性進(jìn)行驗(yàn)證,如圖10所示。通過(guò)上述測(cè)試,驗(yàn)證了該星上時(shí)間獲取方法在秒中斷被嵌套時(shí),能夠穩(wěn)定、正確地獲取星上時(shí)間。
針對(duì)現(xiàn)有適用于中斷嵌套場(chǎng)景的星上時(shí)間獲取方法,存在對(duì)處理器中斷狀態(tài)的依賴,導(dǎo)致無(wú)法在新項(xiàng)目中移植使用的問(wèn)題,提出了一種不依賴中斷狀態(tài)的航天器星上時(shí)間獲取方法。
該方法在現(xiàn)有星上時(shí)間獲取方法基礎(chǔ)上[18],調(diào)整了對(duì)秒中斷嵌套的判定方法。將依據(jù)處理器中斷狀態(tài)判斷是否存在秒中斷嵌套,變?yōu)橐罁?jù)82C54中毫秒計(jì)數(shù)值判斷是否存在秒中斷嵌套,進(jìn)而依據(jù)“秒中斷維護(hù)星上時(shí)間”標(biāo)識(shí)判斷是否需要對(duì)當(dāng)前星上時(shí)間進(jìn)行加1 s修正。
修改后的方法不依賴硬件處理器的中斷狀態(tài),具有良好的可移植性。該方法已在火星探測(cè)器的多臺(tái)星載計(jì)算機(jī)上得到成功應(yīng)用,可為后續(xù)航天器軟件設(shè)計(jì)提供參考。