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