樊琦,余衛(wèi)東,陳文輝,程剛
(中國石油集團(tuán)測井有限公司,陜西 西安 710077)
EILog測井系統(tǒng)的采集箱體硬件采用基于cPCI(Compact PCI)總線的體系結(jié)構(gòu),前端軟件是基于Vx Works實(shí)時(shí)操作系統(tǒng)的應(yīng)用,在采集箱體中的單板計(jì)算機(jī)上運(yùn)行,是數(shù)據(jù)采集卡和測井采集控制管 理平 臺(tái) ACME[1](Acquisition Control Management Expert)的中間橋梁,承擔(dān)著命令下發(fā)和數(shù)據(jù)上傳的任務(wù)。伴隨著EILog系統(tǒng)大規(guī)模推廣應(yīng)用,作為核心組成部分的采集箱體也在不斷升級,以滿足不斷提升的測井作業(yè)要求。前端軟件在單板計(jì)算機(jī)和數(shù)據(jù)采集卡得到更新后,自身也需要升級來匹配硬件運(yùn)行。由此,引出了在軟硬件升級過程中遇到的精確延時(shí)和中斷管理等2個(gè)關(guān)鍵性問題。采集時(shí)序正確和運(yùn)行穩(wěn)定是保證數(shù)據(jù)采集的準(zhǔn)確性的重要因素,只有解決了這2個(gè)問題,采集前端軟件才能穩(wěn)定地通用于新舊硬件之上,采集到正確的井下數(shù)據(jù)。本文分析了問題產(chǎn)生的原因,闡述了對應(yīng)的解決方案并給出了具體的實(shí)現(xiàn)方法。改進(jìn)后的軟件在實(shí)際應(yīng)用中取得了良好的效果。
EILog系統(tǒng)采集箱體首批使用的是SBS公司的CT7型號(hào)單板計(jì)算機(jī),它采用Pentium III單核處理器,運(yùn)行Wind River公司的Vx Works5.4操作系統(tǒng)。EILog系統(tǒng)在高速AD采集等情況下需要微秒級的準(zhǔn)確定時(shí),而系統(tǒng)提供的延時(shí)函數(shù)在精確性方面不能滿足要求。在EILog推廣應(yīng)用初期采用簡單有效的處理方法是執(zhí)行空循環(huán)完成需要的延時(shí),即根據(jù)系統(tǒng)時(shí)鐘頻率和需要的延時(shí)計(jì)算出要執(zhí)行的空循環(huán)次數(shù)。但該方法在單板計(jì)算機(jī)更換為Advantech公司MIC3392型號(hào)以后就不再適用,處理器頻率的提升和核心的增加以及其他因素使得計(jì)算空循環(huán)的次數(shù)變得復(fù)雜,并且這個(gè)次數(shù)在每次系統(tǒng)運(yùn)行時(shí)是在一個(gè)范圍內(nèi)波動(dòng)而不是一個(gè)固定的數(shù)值。因此,采用固定次數(shù)的空循環(huán)完成延時(shí)不再是一個(gè)可靠的解決方案。
(1)task Delay()使調(diào)用該函數(shù)的任務(wù)延時(shí)n個(gè)tick(內(nèi)核時(shí)鐘周期)。該方法缺點(diǎn)是task Delay(n)表示任務(wù)延時(shí)至第n個(gè)系統(tǒng)時(shí)鐘到來的時(shí)刻,task-Delay有接近1個(gè)tick的誤差存在。
(2)WatchDog看門狗[2]在經(jīng)過指定的延時(shí)后,實(shí)現(xiàn)在系統(tǒng)時(shí)鐘ISR的上下文中運(yùn)行指定的程序。如果利用看門狗定時(shí)器實(shí)現(xiàn)延時(shí),則存在與task-Delay()一樣的精度上的缺陷,并且與中斷服務(wù)程序的約束一樣,看門狗定時(shí)掛接的程序編寫有一定的限制。
(3)sleep()和nanosleep()是系統(tǒng)提供的延時(shí)函數(shù)接口。sleep()以秒為單位,nanosleep()參數(shù)可精確到納秒,但傳參是時(shí)鐘的結(jié)構(gòu)體,實(shí)際上只能做到大于或等于這個(gè)時(shí)間。因?yàn)閟leep()或nanosleep()函數(shù)延時(shí)的時(shí)間基準(zhǔn)仍是tick,調(diào)用此函數(shù)的任務(wù)處于任務(wù)延時(shí)狀態(tài),這點(diǎn)與task Delay()一致。
(4)sys Timestamp()通過讀取該定時(shí)器當(dāng)前計(jì)數(shù)值獲取高精度定時(shí)。使用sys Timestamp Freq()函數(shù)可以得到系統(tǒng)時(shí)間的頻率,它反映的是CPU定時(shí)器的基準(zhǔn)頻率。但該法依靠查詢方式實(shí)現(xiàn),頻繁使用非常影響系統(tǒng)執(zhí)行效率。
(5)輔助時(shí)鐘利用目標(biāo)板上CPU的另一個(gè)定時(shí)器(除了系統(tǒng)時(shí)鐘之外)中斷實(shí)現(xiàn),容易實(shí)現(xiàn)毫秒級甚至微秒級定時(shí)。但是使用上存在缺陷,不能實(shí)現(xiàn)多個(gè)任務(wù)同時(shí)調(diào)用,且需占用CPU的1個(gè)時(shí)鐘資源。
以上的方案有的是精度不夠,有的是應(yīng)用場合不適用,因此使用空循環(huán)實(shí)現(xiàn)精確的“硬”延時(shí)成為了一個(gè)理想的選擇。
1.2.1 硬延時(shí)函數(shù)的設(shè)計(jì)
實(shí)現(xiàn)該延時(shí)函數(shù)的思想是在每次調(diào)用此函數(shù)時(shí)通過系統(tǒng)提供的sysClk ReteGet()函數(shù)和tick Get()函數(shù)刻度單位時(shí)間定時(shí)循環(huán)次數(shù)。因此在第1次調(diào)用時(shí)消耗的時(shí)間比請求的時(shí)間要長很多;當(dāng)系統(tǒng)時(shí)鐘頻率變化時(shí),需要重新刻度單位時(shí)間循環(huán)次數(shù)。
1.2.2 硬延時(shí)函數(shù)的實(shí)現(xiàn)
硬延時(shí)函數(shù)的主要實(shí)現(xiàn)步驟為
(1)得到要循環(huán)的定時(shí)參數(shù)u,判斷是否已有計(jì)算過delay Loop值。
(2)如果已有delay Loop值,則直接根據(jù)送入?yún)?shù)u和delay Loop雙重循環(huán),之后結(jié)束返回。
(3)否則根據(jù)系統(tǒng)設(shè)定的每秒tick數(shù)首次遞歸計(jì)算delay Loop。
(4)根據(jù)遞歸結(jié)果調(diào)整一次循環(huán)條件。
(5)根據(jù)調(diào)整后的循環(huán)條件再次遞歸計(jì)算delay Loop,在遞歸結(jié)束后即得到每微秒對應(yīng)的空循環(huán)次數(shù)。
其中,delay Loop是要計(jì)算和使用的每微秒對應(yīng)的空循環(huán)次數(shù);u為調(diào)用函數(shù)傳遞的延時(shí)參數(shù)(單位為μs);mpt為每秒系統(tǒng)的tick數(shù)。
下面給出實(shí)現(xiàn)代碼。
從實(shí)現(xiàn)代碼可以看出,如果延時(shí)函數(shù)是首次調(diào)用,那么將會(huì)通過遞歸計(jì)算delay Loop,完成刻度過程會(huì)消耗稍多的時(shí)間;如果不是首次調(diào)用,則函數(shù)直接通過傳入的參數(shù)和delay Loop運(yùn)行空循環(huán)完成延時(shí)。因此,在測井采集過程還沒有開始以前調(diào)用一次延時(shí)函數(shù)時(shí)很有必要的,并且為了刻度準(zhǔn)確,避免極端情況,在首次調(diào)用應(yīng)傳入一個(gè)較大的延時(shí)參數(shù)(如1 s)計(jì)算,使delay Loop更接近真實(shí)值。
計(jì)算機(jī)BIOS技術(shù)的發(fā)展也使部署在PCI總線上的數(shù)據(jù)采集卡中斷分配有了變化。在使用CT7時(shí),BIOS分配給板載設(shè)備(如網(wǎng)卡等)和PCI采集卡設(shè)備的中斷號(hào)都是不同的,不存在中斷沖突處理問題。在更新為MIC3392后,為了使PCI總線可以同時(shí)掛接更多的設(shè)備,BIOS允許不同的PCI設(shè)備使用相同的中斷號(hào),因此采集卡設(shè)備和網(wǎng)絡(luò)設(shè)備有分配到相同中斷號(hào)的可能性。
EILog之前采集數(shù)據(jù)是通過中斷號(hào)判斷數(shù)據(jù)來源于某塊采集卡,并且采集是通過“使能中斷-采集數(shù)據(jù)-關(guān)閉中斷”流程完成。
根據(jù)上面的實(shí)現(xiàn)代碼可以發(fā)現(xiàn),這樣做會(huì)導(dǎo)致2個(gè)問題:①在關(guān)閉中斷時(shí)會(huì)將與該采集卡相同中斷的其他設(shè)備中斷關(guān)閉;②采集數(shù)據(jù)時(shí)會(huì)將相同中斷號(hào)的設(shè)備發(fā)來的中斷信號(hào)全部響應(yīng)并且轉(zhuǎn)到中斷服務(wù)程序。
通過中斷號(hào)控制采集設(shè)備的使能與關(guān)閉已不能適用于新硬件的場合。這種在系統(tǒng)層面粗放的控制在沒有共享中斷的情況下是不會(huì)出問題的,在有中斷共享的情況下需要更精細(xì)的控制,將PCI設(shè)備的控制精確到每個(gè)獨(dú)立設(shè)備。
根據(jù)PCI規(guī)范[3],PCI有3個(gè)相互獨(dú)立的物理地址空間:設(shè)備存儲(chǔ)器地址空間、I/O地址空間和配置空間。配置空間是PCI所特有的1個(gè)物理空間。由于PCI支持設(shè)備即插即用,所以PCI設(shè)備不占用固定的內(nèi)存地址空間或I/O地址空間,而是由操作系統(tǒng)決定其映射的基址。
PCI總線通過橋芯片級連。按與CPU總線所隔的橋數(shù)目和同一層總線的掃描順序,從0開始依次編號(hào),擴(kuò)展最多到256,就是總線號(hào);在指定的局部總線上,按硬件掃描順序從0開始依次編號(hào),擴(kuò)展最多到32,就是設(shè)備號(hào);在1個(gè)多功能PCI設(shè)備上,按設(shè)備上配置存儲(chǔ)區(qū)的順序從0開始依次編號(hào),稱為功能號(hào),每個(gè)PCI設(shè)備最多可以實(shí)現(xiàn)8種功能,一般情況只有1個(gè)功能。這3個(gè)號(hào)組合起來就可確定唯一的1個(gè)PCI設(shè)備以及該設(shè)備上的某項(xiàng)功能。通過這3個(gè)參數(shù)(可組成PCI設(shè)備標(biāo)識(shí)符)就可操作PCI設(shè)備。
2.2.1 PCⅠ配置空間
PCI總線規(guī)范定義的配置空間總長度為256 B,配置信息按一定的順序和大小依次存放。前64 B的配置空間稱為配置頭,對于所有的設(shè)備都一樣,配置頭的主要功能是用來識(shí)別設(shè)備、定義主機(jī)訪問PCI卡的方式(I/O訪問或者存儲(chǔ)器訪問,還有中斷信息)。其余的192 B稱為本地配置空間,主要定義卡上局部總線的特性、本地空間基地址及范圍等。
2.2.2 PCⅠ配置空間的功能
配置空間中配置頭里的寄存器實(shí)現(xiàn)了很多功能,這里介紹重要的3類。
(1)設(shè)備識(shí)別
Vendor ID:廠商ID。
Device ID:設(shè)備ID。
Class Code:類代碼。共3字節(jié),分別是類代碼、子類代碼、編程接口。
Header Type:指示Header中從地址10 H到3FH區(qū)域的內(nèi)容格式,同時(shí)指示該設(shè)備是否為多功能設(shè)備。
(2)設(shè)備控制
Status:狀態(tài)寄存器。不同的位代表不同出錯(cuò)狀態(tài)。
Command:指令寄存器。不同的位代表不同的含義。
(3)基地址配置
Base Address:基地址寄存器。它報(bào)告設(shè)備寄存器或設(shè)備RAM在I/O端口地址空間(或物理地址空間)的地址。
2.3.1 Command寄存器
Command寄存器在PCI配置頭偏移04h的位置,長度為2 B。圖1是Command寄存器每一位的說明。
圖1 Command寄存器位說明
除第11~15位被保留外,Command寄存器的第0~10位均有對應(yīng)的功能,表1是對每一位功能說明。
表1 Command寄存器對應(yīng)各位功能簡要說明
2.3.2 改進(jìn)的采集方案和實(shí)現(xiàn)
根據(jù)PCI配置空間和表1可以發(fā)現(xiàn),欲單獨(dú)控制某一PCI設(shè)備使能與否,只要將該設(shè)備的Command寄存器的第10位進(jìn)行設(shè)置即可,而不需對這一PCI設(shè)備對應(yīng)的中斷號(hào)使能或者禁止。因此,使用Vx Works系統(tǒng)的PCI寄存器配置函數(shù)[4]即可完成采集數(shù)據(jù)時(shí)設(shè)備的禁止和使能操作。
(1)Vx Works PCI頭配置函數(shù)簡介
①寫PCI配置參數(shù):
pciConfigOut Word(p BusNo,p DeviceNo,p Func No,address,value);
說明:將值value寫入到由總線號(hào)、設(shè)備號(hào)和功能號(hào)決定的PCI設(shè)備address地址的寄存器。
②讀PCI配置參數(shù):
pciConfigIn Word(pBus No,pDeviceNo,p Func No,address,(int*)&value);
說明:將由總線號(hào)、設(shè)備號(hào)和功能號(hào)決定的PCI設(shè)備address地址的寄存器讀出到value。
類似地,Vx Works系統(tǒng)還提供有pciConfig Out Long()、pciConfigIn Long()、pciConfigOutByte()、pciConfigInByte()等函數(shù),它們的區(qū)別只是讀寫時(shí)的字節(jié)多少不同,用法均一樣,不再贅述。
(2)PCI設(shè)備中斷控制代碼實(shí)現(xiàn)
應(yīng)用上面的代碼即可以實(shí)現(xiàn)在使能和禁止采集卡中斷的發(fā)生而不會(huì)影響到與其中斷號(hào)相同的其他PCI設(shè)備,解決了前文提出的在中斷共享時(shí)使能和禁止PCI設(shè)備帶來的問題。
(1)通過對采集流程的延時(shí)算法升級和PCI采集卡精細(xì)控制的改進(jìn),升級后的EILog采集前端軟件能夠很好地運(yùn)行在新舊采集硬件上,提升了對硬件的兼容性。
(2)硬延時(shí)算法和PCI設(shè)備控制方法具有通用性。經(jīng)過測試,改進(jìn)的軟件目前已在ACME2.0測井采集控制平臺(tái)上正式應(yīng)用并取得了良好的效果。
[1] 陳江浩,陳文輝,余衛(wèi)東,等.ACME測井采集控制管理平臺(tái)開發(fā)與應(yīng)用 [J].石油儀器,2010,24(5):77-79.
[2] 程敬原.Vx Works軟件開發(fā)項(xiàng)目實(shí)例完全解析 [M].北京:中國電力出版社,2005:88-90.
[3] PCI-SIG.PCI Local Bus Specification Revision 3.0 [Z].2002:186-218.
[4] 李貴山,戚德虎.PCI局部總線開發(fā)者指南 [M].西安:西安電子科技大學(xué)出版社,1997:110-116.