展子靜
(中電科思儀科技股份有限公司微波儀器事業(yè)部,山東青島,266555)
監(jiān)測(cè)接收機(jī)在設(shè)計(jì)實(shí)時(shí)性控制軟件多任務(wù)框架的過程中,已經(jīng)顧及到整機(jī)所需的實(shí)時(shí)性,具體表現(xiàn)在以下幾個(gè)方面:
(1)設(shè)計(jì)定時(shí)刷新任務(wù),使得測(cè)量過程減少了冗余的刷新操作時(shí)間,在一定程度上節(jié)省了掃描循環(huán)的耗時(shí);
(2)通過耗時(shí)長(zhǎng)短和事件急迫程度,確定了較好的多任務(wù)優(yōu)先級(jí),保證了整機(jī)處理任務(wù)調(diào)度機(jī)制的性能;
(3)通過實(shí)時(shí)時(shí)鐘中斷,設(shè)置超時(shí)錯(cuò)誤,并調(diào)度相關(guān)的定時(shí)作業(yè);
但相對(duì)于整機(jī)所要求的功能和指標(biāo),如環(huán)境適應(yīng)性,掃描速度,屏幕刷新率, 測(cè)量/窗口切換時(shí)間等,還有不小的差距,這主要表現(xiàn)在以下方面:
(4)在CPU占用上,許多高耗時(shí)的工作仍然需要串行執(zhí)行,簡(jiǎn)單的計(jì)算一下,測(cè)量設(shè)置+消磁的時(shí)間將占去80ms時(shí)間,這還沒有計(jì)算其他的過程,僅此一項(xiàng),就已經(jīng)不滿足掃描次數(shù)15次/秒的指標(biāo)了;
(5)執(zhí)行一次全部刷新的時(shí)間太長(zhǎng),在軌跡(掃描的測(cè)量結(jié)果)全部顯示的情況下,3條正常檢波方式下的軌跡刷新就需要60ms左右時(shí)間,全部刷新的時(shí)間在100ms左右,這和屏幕刷新率的指標(biāo)要求也有差距。
解決這些問題,僅靠提高CPU執(zhí)行速度和硬件反映速度是不現(xiàn)實(shí)的,因此必須優(yōu)化整機(jī)軟件的執(zhí)行過程。在儀器的整個(gè)測(cè)量過程中,執(zhí)行最為頻繁的代碼和序列占比一般不超過整個(gè)軟件的10%,但其CPU等資源占用卻高達(dá)90%以上,因此優(yōu)化的對(duì)象將主要是這些關(guān)鍵的執(zhí)行序列;在整機(jī)多任務(wù)軟件框架已經(jīng)建立的情況下,關(guān)鍵執(zhí)行序列是可以確定下來的。
關(guān)鍵執(zhí)行序列應(yīng)該在監(jiān)測(cè)接收機(jī)最常工作的狀態(tài)下獲取,只有這樣,才能夠反映大部分時(shí)間下的執(zhí)行性能,而這種狀態(tài)下的性能也正是我們最關(guān)心的。我們把監(jiān)測(cè)接收機(jī)執(zhí)行性能歸結(jié)為兩種:突發(fā)事件響應(yīng)能力、常態(tài)任務(wù)執(zhí)行能力,諸如和使用者實(shí)現(xiàn)交互的按鍵、GPIB以及部分異常屬于突發(fā)事件,而監(jiān)測(cè)接收機(jī)執(zhí)行各種狀態(tài)下的掃描屬于常態(tài)執(zhí)行。使用者希望將監(jiān)測(cè)接收機(jī)設(shè)置在他所需要的狀態(tài)下進(jìn)行測(cè)量,當(dāng)然他最主要關(guān)注的是當(dāng)狀態(tài)設(shè)定完成后監(jiān)測(cè)接收機(jī)在沒有外界干擾的情況下完成掃描測(cè)量,因此常態(tài)執(zhí)行情況下參與掃描測(cè)量循環(huán)的執(zhí)行序列就是整機(jī)最為關(guān)鍵的軟件序列。
監(jiān)測(cè)接收機(jī)正常的掃描流程如圖1所示,可以看出大部分的執(zhí)行過程都是在測(cè)量主任務(wù)中完成的,使用實(shí)時(shí)時(shí)鐘進(jìn)行超時(shí)檢測(cè)和回掃消磁;由于刷新任務(wù)是定時(shí)器觸發(fā)的,該任務(wù)肯定會(huì)延長(zhǎng)掃描的執(zhí)行過程,因此關(guān)鍵路徑也必須包含刷新在內(nèi)。其中觸發(fā)掃描、結(jié)束掃描處理等過程均屬于判斷或者賦值,耗時(shí)不多,而整機(jī)狀態(tài)分解和信號(hào)分析功能并不是每次都執(zhí)行固定的內(nèi)容,并且和使用者的操作相關(guān),也可以不考慮;因此比較重要的是掃描過程以及定時(shí)刷新幾個(gè)部分的時(shí)間耗費(fèi),經(jīng)過一段時(shí)間的統(tǒng)計(jì),我們獲得了這些部分平均的執(zhí)行時(shí)間,如表1所示。
表1 關(guān)鍵序列個(gè)部分的執(zhí)行時(shí)間
圖1 正常掃描過程的執(zhí)行序列
從統(tǒng)計(jì)結(jié)果可以看出,即使回掃消磁和等待取樣的過程可以和刷新任務(wù)重疊,但測(cè)量設(shè)置時(shí)間+數(shù)據(jù)組裝時(shí)間+刷新時(shí)間都已經(jīng)達(dá)到150ms,如果犧牲刷新次數(shù)指標(biāo),可以采用150ms一次刷新,但掃描次數(shù)也僅有6-7次,如果保證掃描次數(shù)在12次/秒以上,在1秒鐘內(nèi)剩余的時(shí)間只有不到400ms,僅能掃描3-4次,無論如何都和指標(biāo)要求差的太遠(yuǎn)。因此對(duì)關(guān)鍵執(zhí)行序列中的這幾個(gè)處理過程進(jìn)行優(yōu)化是必須的。
編碼方面:軟件是逐漸積累的過程,從設(shè)計(jì)之初到最終的定型,改動(dòng)很大也很頻繁,在這個(gè)過程中難免會(huì)殘留一些并不是實(shí)現(xiàn)功能所必需的代碼(比如測(cè)試用的類Printf操作,或者一些變量,甚至一些循環(huán)體),在關(guān)鍵執(zhí)行序列中,應(yīng)逐個(gè)函數(shù)嚴(yán)格審查,確保代碼精煉。
減少硬件冗余操作:假設(shè)端口A是一個(gè)16位寄存器,它的16位輸出分別控制4種相互獨(dú)立的功能,我們的部分功能程序采用了如圖2所示的A類的實(shí)現(xiàn)方式:
圖2 端口操作的優(yōu)化
由于監(jiān)測(cè)接收機(jī)大部分硬件端口操作是通過SPI總線進(jìn)行的,實(shí)現(xiàn)單一的端口操作就需要較長(zhǎng)時(shí)間,而采用類似圖2中B的實(shí)現(xiàn)方式,則可以節(jié)省一次甚至多次的端口操作。
屏蔽調(diào)試輸出:在代碼中嵌入調(diào)試輸出代碼是一種普遍采用的調(diào)試方法,這些代碼往往在定型的版本中也不刪除,它們的執(zhí)行或者部分執(zhí)行也要消耗時(shí)間,較好的解決辦法是采用IF_DEBUG類似的宏定義,在不需要調(diào)試的場(chǎng)合#undef調(diào)試輸出。
監(jiān)測(cè)接收機(jī)在測(cè)量時(shí)主要用到本振、微波通道、射頻、中頻、信號(hào)采集等幾大部分,參數(shù)分解和硬件端口設(shè)置也主要集中在這幾個(gè)模塊。監(jiān)測(cè)接收機(jī)的本振包括3個(gè)主要的環(huán)路,這些環(huán)路由大量檢波、鑒相、反饋和積分等動(dòng)態(tài)電路單元組建而成,它們?cè)趨?shù)設(shè)置過程中達(dá)到穩(wěn)態(tài)鎖定的時(shí)間都比較長(zhǎng),特別是YTO環(huán)路,而在此過程中,系統(tǒng)不能設(shè)置其他的硬件端口,只能延時(shí)等待。此時(shí)僅本振設(shè)置(其中延時(shí)占絕大部分)就需要支出40-50ms的時(shí)間,是導(dǎo)致設(shè)置時(shí)間延長(zhǎng)的最大因素!因此如果能夠可以設(shè)置一種算法,可以有效縮短本振環(huán)路的設(shè)置時(shí)間,則整個(gè)測(cè)量設(shè)置時(shí)間就可以大大縮短,對(duì)于這個(gè)問題,我們經(jīng)嘗試后采用了如下的三種方法。
串行設(shè)置轉(zhuǎn)換為并行設(shè)置:本振控制通常的做法是多個(gè)環(huán)路逐次完成鎖定,這樣所有的延時(shí)都被串行累加(如圖3中第一部分所示);而實(shí)際上每個(gè)環(huán)路都是由設(shè)置過程、延時(shí)過程、鎖定判斷過程組成的,由于幾個(gè)環(huán)路的鎖定時(shí)間不同,通過合理安排各個(gè)環(huán)路的各個(gè)過程環(huán)節(jié)的執(zhí)行順序,可以實(shí)現(xiàn)多個(gè)環(huán)路鎖定過程(電路穩(wěn)定時(shí)間)的并行處理,采取所有環(huán)路設(shè)置→延時(shí)→小數(shù)環(huán)檢測(cè)→取樣環(huán)檢測(cè)→YTO閉環(huán)→YTO鎖定延時(shí)→YTO環(huán)檢測(cè)的方法,這樣就節(jié)省了至少一個(gè)環(huán)路的鎖定過程時(shí)間。(如圖3中第二部分所示)。
圖3 本振控制算法優(yōu)化示意圖
增加YTO環(huán)路鎖定誤差電壓檢測(cè)和補(bǔ)償算法:在YTO環(huán)路中,鎖相誤差電壓是影響環(huán)路鎖定的關(guān)鍵環(huán)節(jié),誤差電壓反饋給振蕩器驅(qū)動(dòng)電路作為振蕩器驅(qū)動(dòng)的微調(diào),而一旦誤差電壓穩(wěn)定后,振蕩器就能夠鎖定;因此如果能夠使得誤差電壓快速趨0穩(wěn)定,環(huán)路鎖定的時(shí)間必定大大縮短。為此我們?cè)O(shè)計(jì)了環(huán)路振蕩器的誤差電壓歸零算法,在本振閉環(huán)后,通過對(duì)誤差電壓的監(jiān)測(cè),將其數(shù)值按照換算關(guān)系直接補(bǔ)償給振蕩器的主調(diào)諧器(包括粗調(diào)和細(xì)調(diào)),實(shí)現(xiàn)在誤差電壓近似零的情況下實(shí)現(xiàn)鎖定,并獲得此時(shí)附加給主調(diào)諧器的補(bǔ)償量,當(dāng)本振以同樣的狀態(tài)進(jìn)行后續(xù)的掃描過程時(shí),在進(jìn)行本振預(yù)置時(shí)就將補(bǔ)償量植入,這樣YTO主環(huán)路從設(shè)置到最終的鎖定時(shí)間就可以大大縮短。(如圖3中第二部分所示)。
更改延時(shí)的實(shí)現(xiàn)方式:為實(shí)現(xiàn)YTO環(huán)路的鎖定延時(shí),我們最初采用的是很多次硬件端口操作的延時(shí)方法,實(shí)際上這種方法占用了大量的CPU時(shí)間,而采用vxWorks提供的延時(shí),雖然精度較低,但此時(shí)仍然能夠滿足我們的要求,而且在延時(shí)時(shí)軌跡處理和刷新任務(wù)可以獲得執(zhí)行時(shí)間,這樣更能提高CPU的時(shí)間利用率,也能夠提高整個(gè)過程的運(yùn)行效率。
通過以上的3種方法,本振的穩(wěn)態(tài)鎖定時(shí)間從50ms左右可以直接壓縮到10-15ms。
監(jiān)測(cè)接收機(jī)的中頻部分提供整機(jī)各種分辨率帶寬選擇,提供可以上下浮動(dòng)的增益或者衰減,而且精度都非常高,與此對(duì)應(yīng),中頻部分電路復(fù)雜度很高,控制參數(shù)較多,且大部分都是12位的DAC數(shù)據(jù),此外還有各種增益和帶寬轉(zhuǎn)換誤差補(bǔ)償數(shù)據(jù)。為了保證中頻部分的精度,對(duì)所有這些參數(shù)都設(shè)計(jì)了復(fù)雜的校準(zhǔn)算法,在溫度變化超過一定范圍后自動(dòng)調(diào)用中頻校準(zhǔn)程序,實(shí)現(xiàn)所有中頻參數(shù)的校準(zhǔn)。
校準(zhǔn)的結(jié)果是獲得DAC數(shù)值(也可以認(rèn)為是電壓)和相關(guān)中頻電路參數(shù)的一一映射關(guān)系,這些映射關(guān)系表示著DAC輸出電壓值和相關(guān)參數(shù)特性的曲線,如各級(jí)LC濾波器中心頻率/DAC電壓曲線、帶寬/DAC電壓曲線、增益/電壓曲線、對(duì)數(shù)保真度補(bǔ)償曲線等等;部分參數(shù)由于關(guān)聯(lián)性較強(qiáng),只能形成多元的映射關(guān)系,在數(shù)據(jù)構(gòu)成形式形成多維的校準(zhǔn)補(bǔ)償參數(shù)組,如晶體濾波器的中心、帶寬和對(duì)稱度和前置放大器的關(guān)系,一個(gè)參數(shù)的改變會(huì)引起該級(jí)濾波器所有特性發(fā)生漂移。同時(shí)由于DAC取值范圍廣(0-4095),所有這些曲線/曲面的數(shù)據(jù)量非常龐大,也正是由于這個(gè)原因,在設(shè)計(jì)之初,校準(zhǔn)程序直接把校準(zhǔn)結(jié)果數(shù)據(jù)保存在文件當(dāng)中,在中頻模塊參數(shù)設(shè)置時(shí),從文件中讀出,采用查表映射的方法,逐一完成各電路單元功能設(shè)置。顯然,文件的讀取速度受存儲(chǔ)介質(zhì)性能和文件系統(tǒng)效率的影響太大。使用WindView進(jìn)行執(zhí)行效能評(píng)測(cè)發(fā)現(xiàn),中頻部分參數(shù)設(shè)置是除本振外耗時(shí)最長(zhǎng)的,經(jīng)過深入的實(shí)驗(yàn)驗(yàn)證,超長(zhǎng)耗時(shí)就是由于文件訪問產(chǎn)生的。為降低設(shè)置過程的耗時(shí),必須將校準(zhǔn)數(shù)據(jù)裝載到內(nèi)存當(dāng)中,并為每個(gè)參數(shù)建立查找表和相關(guān)的快速搜索算法,如線性查找表和二叉樹搜索算法等。在VxWorks平臺(tái)下,由于頻繁的上下文切換原因,采用局部變量存放大量的數(shù)據(jù)不是很好的做法, 因此所有的這些查找表都需要直接以全局變量的形式定義,在儀器的整個(gè)運(yùn)行過程中一直有效。通過大量的存儲(chǔ)空間換取文件操作的耗時(shí),配合高效的查找算法,中頻設(shè)置耗時(shí)高的問題得以解決。
通過上述的優(yōu)化設(shè)計(jì),使得模塊設(shè)置的時(shí)間大大縮短,最長(zhǎng)不到15ms即可以完成設(shè)置工作。但如果顯示刷新任務(wù)的時(shí)間不進(jìn)行優(yōu)化,它所占用的時(shí)間比例仍然非常巨大。
通過對(duì)刷新過程利用WindView進(jìn)行分析,發(fā)現(xiàn)刷新任務(wù)的主要耗時(shí)在3條軌跡的刷新上。軌跡的刷新采用的是先擦除上次掃描結(jié)果然后刷新當(dāng)前掃描結(jié)果的方式,還需要根據(jù)軌跡坐標(biāo)判斷是否重繪網(wǎng)格線,整個(gè)過程如圖4中流程A所示。之所以采用這種刷新算法,是因?yàn)槲覀兯械睦L圖函數(shù)都是直接采用UGL下提供的諸如LineTo之類的接口函數(shù),在軟件執(zhí)行流中直接操作圖形設(shè)備,只有這樣才能有效避免刷新過程帶來的閃爍,也就是說從刷新算法過程本身無法實(shí)現(xiàn)優(yōu)化。
圖4 顯示刷新流程優(yōu)化算法
VxWorks下的WindML庫(kù)針對(duì)某些型號(hào)的顯示控制器支持雙緩沖刷新模式,它的基本原理如下:圖形設(shè)備對(duì)應(yīng)兩個(gè)顯示內(nèi)存映像,其中一個(gè)內(nèi)存映像映射到物理圖形設(shè)備,而正在執(zhí)行的刷新操作的對(duì)象是圖形設(shè)備的另外一個(gè)內(nèi)存映像,操作結(jié)束后,使用切換功能將被操作的映像映射到圖形設(shè)備,而解除映射的映像可以接收刷新操作,雙緩沖模式有兩個(gè)優(yōu)點(diǎn),對(duì)內(nèi)存操作的速度比直接操作圖形緩沖區(qū)快,同時(shí)雙緩沖操作可以最大程度地避免閃爍。因此,我們把原來直接操作圖形設(shè)備的流程改為雙緩沖操作,流程簡(jiǎn)化為圖4流程B所示,并且確實(shí)改善了刷新速度(降低到不足30ms)。
通過各種優(yōu)化手段,關(guān)鍵序列中的耗時(shí)大大降低,例如在80ms的定時(shí)刷新率下,刷新耗時(shí)約占350ms,采用本章第一節(jié)所用的測(cè)量狀態(tài),在沒有狀態(tài)變更的情況下,掃描一次的時(shí)間耗費(fèi)不到35ms,在1秒鐘之內(nèi),掃描次數(shù)可達(dá)20次左右。優(yōu)化前后的WindView截圖如圖5和圖6所示。
圖5 優(yōu)化前250ms內(nèi)完成1次刷新,在1秒鐘內(nèi)僅有4-5次完全完成
圖6 優(yōu)化后,在250ms內(nèi)完成5次掃描
本文從實(shí)時(shí)性的角度出發(fā),分析了高性能監(jiān)測(cè)接收機(jī)在指標(biāo)體系約束下對(duì)其控制軟件的實(shí)時(shí)性需求,根據(jù)這些需求選擇合適的軟硬件控制平臺(tái),分析監(jiān)測(cè)接收機(jī)所要處理的各種事件,重點(diǎn)進(jìn)行其處理流程和多任務(wù)體系框架的設(shè)計(jì)實(shí)現(xiàn),并根據(jù)指標(biāo)要求和實(shí)驗(yàn)結(jié)果進(jìn)行了關(guān)鍵實(shí)時(shí)序列的優(yōu)化設(shè)計(jì)。
本文研究?jī)?nèi)容完成后,首先在監(jiān)測(cè)接收機(jī)控制體系上取得突破,掌握了具有較高實(shí)時(shí)性的控制軟件多任務(wù)框架設(shè)計(jì)方法,滿足應(yīng)用領(lǐng)域越來越高的測(cè)試需求,使得能夠使監(jiān)測(cè)接收機(jī)相關(guān)實(shí)時(shí)性、測(cè)試速度的性能指標(biāo)有很大提高;其次通過實(shí)際的工程實(shí)踐和系統(tǒng)分析,探索出提高監(jiān)測(cè)接收機(jī)實(shí)時(shí)性和多任務(wù)調(diào)度效率的技術(shù)措施,為類似項(xiàng)目提供一些參照和可行的設(shè)計(jì)方法。