2
(1.西南科技大學 信息工程學院,四川 綿陽 621010; 2.四川理工學院 人工智能重點實驗室,四川 自貢 643000;3.成都理工大學 地質(zhì)災害防治與地質(zhì)環(huán)境保護國家重點實驗,四川 成都 610059)
隨著地震勘探技術向高密度空間采樣和多波多分量數(shù)據(jù)采集方向發(fā)展[1],多路并行地震數(shù)據(jù)采集成為地震勘探的關鍵技術環(huán)節(jié)。傳統(tǒng)的地震數(shù)據(jù)采集站一般是野外工作的嵌入式系統(tǒng),無關具體平臺,其采集驅(qū)動實現(xiàn)方式一般分為裸機驅(qū)動[2-3]、帶操作系統(tǒng)的應用層驅(qū)動[4-5]和操作系統(tǒng)之下的內(nèi)核驅(qū)動[6-7]。但是裸機驅(qū)動需要操作大量底層寄存器,不適用于大量地震數(shù)據(jù)采集的采集與傳輸,而應用層驅(qū)動又需依靠頻繁的API系統(tǒng)調(diào)用接口實現(xiàn)硬件控制,且控制實時性差。若單道數(shù)據(jù)采集的系統(tǒng)調(diào)用量過大,實時性低,占用大量CPU、內(nèi)存等資源,就會嚴重限制地震采集單元向多通道、大數(shù)據(jù)量的方向發(fā)展。
針對上述問題,在Linux 3.0.35內(nèi)核下,以總線設備驅(qū)動模型為指導[8],提出一種單路SPI驅(qū)動多路ADC并行采集的驅(qū)動,并在驅(qū)動實現(xiàn)過程中簡化系統(tǒng)調(diào)用,減小內(nèi)核和用戶空間的切換頻率,然后通過歸類并分離實現(xiàn)實時操作與非實時操作的改進方式,增加數(shù)據(jù)采集單元的工作效率,提高其數(shù)據(jù)可靠性。
地震采集站主要是用于地震資料的采集、存儲與傳輸[9]。本地震數(shù)據(jù)采集單元主要由前級MEMS檢波器組、濾波電路、多路獨立ADC并行采集單元、多路復用接口和Cortex-A9處理器及其外圍存儲單元構(gòu)成。圖1為地震數(shù)據(jù)采集單元的總體結(jié)構(gòu)。針對目前存在的實時性不高以及系統(tǒng)調(diào)用頻繁問題,本文的ADC數(shù)據(jù)采集驅(qū)動主要由Cortex-A9處子框中的用戶空間實現(xiàn)轉(zhuǎn)到內(nèi)核空間實現(xiàn)。
圖1 地震數(shù)據(jù)采集單元的系統(tǒng)總體結(jié)構(gòu)
在Linux內(nèi)核中,利用Linux內(nèi)核的SPI子系統(tǒng)總線掛接外設ADS1282單元[10]后,還需:① 在板級支持文件中填寫SPI口參數(shù)信息(如時鐘、電平模式等)和ADS1282與Cortex-A9的GPIO連接信息等,配置相關的網(wǎng)絡服務、編譯內(nèi)核映像uImage和BootLoader,制作文件系統(tǒng)燒寫系統(tǒng)并重啟;② 設備注冊,將ADS1282外設單元抽象成字符設備掛載到SPI總線上,填充設備描述結(jié)構(gòu),申請設備號、內(nèi)存等資源,使用cdev_init實現(xiàn)設備名和描述結(jié)構(gòu)的互聯(lián);③ 驅(qū)動注冊,注冊與設備同名的驅(qū)動名,填充驅(qū)動描述結(jié)構(gòu),申請中斷、異步通知、乒乓緩存等資源。
ADS1282地震數(shù)據(jù)采集驅(qū)動的內(nèi)核實現(xiàn)流程如圖2所示。首先,初始化ADS1282外設,按照SPI協(xié)議發(fā)送命令配置RESET、PWDN、SYNC、DIN引腳,讀SampleRate(采樣率S)和SecondPerFile(每ns寫1個地震文件)參數(shù),準備進入連續(xù)采集狀態(tài);然后,Linux中斷頂半部等待DRDY信號中斷,底半部利用SPI單字節(jié)讀寫函數(shù)依次將數(shù)據(jù)寫入乒乓緩存;最后,數(shù)據(jù)采集完成,創(chuàng)建內(nèi)核線程,直接調(diào)用具體的VFS文件系統(tǒng)讀寫函數(shù)實現(xiàn)乒乓緩存到地震數(shù)據(jù)文件中的拷貝,并采用異步信號(軟中斷)通知應用程序數(shù)據(jù)寫文件完成。
圖2 ADS1282內(nèi)核驅(qū)動實現(xiàn)流程框圖
在用戶空間測試驅(qū)動和設備能否正常工作。首先打開ADS1282設備;其次讀取配置文件中SampleRate和SecondPerFile參數(shù),并通過ioctl函數(shù)實現(xiàn)應用程序?qū)?nèi)核參數(shù)的控制;最后阻塞等待異步通知,添加文件頭地震數(shù)據(jù)文件(包括采集站IP、采集時間戳等信息)。此外,應用程序還提供了“停止采集”命令控制接口,用于用戶終止ADC連續(xù)采集。驅(qū)動測試應用程序流程圖如圖3所示。
系統(tǒng)調(diào)用把應用程序的請求傳給內(nèi)核,調(diào)用相應的內(nèi)核函數(shù)完成所需的處理,再將處理結(jié)果返回[11]。本文主要在GPIO中斷控制和寫地震數(shù)據(jù)文件部分實現(xiàn)了系統(tǒng)調(diào)用的簡化。
圖3 驅(qū)動測試應用程序流程圖
針對常規(guī)的嵌入式應用層驅(qū)動不能如裸機般直接對GPIO進行方向操作或是電平置高置低的問題,采用內(nèi)核中斷頂半部與底半部相結(jié)合[12]的方式減少了大量的系統(tǒng)調(diào)用。應用程序只能通過文件I/O方式將待用的GPIO引腳從內(nèi)核導出,產(chǎn)生/sys/class/gpio/gpioN目錄,對其中value文件進行讀寫實現(xiàn)gpio中斷控制、電平控制等。而本驅(qū)動的DRDY引腳與Cortex-A9直連,中斷頂半部通過直接讀取DRDY硬件脈沖來簡化文件I/O的系統(tǒng)調(diào)用,且避免了由于select函數(shù)輪詢value文件值延遲而造成的數(shù)據(jù)采集不實時問題。
針對寫地震數(shù)據(jù)文件部分存在大量系統(tǒng)調(diào)用的問題,為了實現(xiàn)內(nèi)核空間到用戶空間的數(shù)據(jù)拷貝,常用的方式是內(nèi)核使用copy_to_user函數(shù)結(jié)合應用層write系統(tǒng)調(diào)用,優(yōu)化方式主要由內(nèi)核和用戶空間采用mmap內(nèi)存映射方式實現(xiàn)數(shù)據(jù)傳輸,但要頻繁進行內(nèi)存映射與解映射。因此,本驅(qū)動直接在數(shù)據(jù)采集完成后,在內(nèi)核中調(diào)用具體的VFS(虛擬文件系統(tǒng))讀寫函數(shù)ext3_file_operations結(jié)構(gòu)的do_sync_write函數(shù)直接將緩存數(shù)據(jù)寫入文件,實現(xiàn)寫文件的同時省略了從write到VFS讀寫函數(shù)的調(diào)用過程。
根據(jù)實時性對地震數(shù)據(jù)采集驅(qū)動實現(xiàn)的必要操作歸類,硬實時部分主要是對DRDY控制與多路數(shù)據(jù)的快速緩存,軟實時操作包括將數(shù)據(jù)從緩存存入文件,加入系統(tǒng)時間戳,并用異步通知信號告知應用程序數(shù)據(jù)寫文件完成,非實時操作主要是給數(shù)據(jù)文件添加IP地址等文件頭。
本驅(qū)動在中斷頂半部函數(shù)中實現(xiàn)了對DRDY的實時硬件監(jiān)控,在底半部實現(xiàn)多路數(shù)據(jù)的乒乓緩存。由于地震數(shù)據(jù)的高精度時間同步要求,在單個文件采集開始或者完成時均須加上當前的系統(tǒng)時間,涉及到引起阻塞或睡眠的函數(shù),因此不能直接在頂半部中緩存數(shù)據(jù)。而添加文件頭等非實時操作便由應用程序在監(jiān)測到異步信號后再對數(shù)據(jù)文件進行完善。由于異步通知的引入避免了應用程序一直輪詢設備狀態(tài),更提高了本驅(qū)動的實時性。
以i.mx6q[13]Cortex-A9處理器為例,搭載3路32位A/D芯片ADS1282,在Linux 3.0.35內(nèi)核下進行了采集驅(qū)動的實現(xiàn)。采集單元硬件連線如圖4所示。測試設置SPI主時鐘為2 MHz,采樣率SampleRate為4000 Hz,SecondPerFile為5 s,每個地震數(shù)據(jù)文件由3×20000個采樣點組成。
圖4 地震數(shù)據(jù)采集單元硬件連接圖
測試單道ADS1282的數(shù)據(jù)采集功能,并采用Matlab讀取采集的地震數(shù)據(jù)文件,繪圖顯示波形曲線如圖5所示。
① 將ADS1282差分輸入端直接短接,測試采集板等效輸入噪聲水平及其幅頻曲線,如圖5(a)和圖5(b)所示;
② 輸入100 Hz 1 mV的標準正弦波信號,測試ADS1282采集效果及其幅頻曲線,如圖5(c)和圖5(d)所示;
③ 輸入人工敲擊地震波信號,測試ADS1282采集信號及其幅頻曲線,如圖5(e)和圖5(f)所示。
對比文件IO方式實現(xiàn)的應用層驅(qū)動與本內(nèi)核驅(qū)動對單次寫地震數(shù)據(jù)文件的耗時情況,可繪制圖6所示兩種驅(qū)動完成單次采集的耗時對比圖。
圖5 ADS1282內(nèi)核驅(qū)動功能測試
圖6 兩種驅(qū)動單次采集操作的耗時對比
實驗采用內(nèi)核驅(qū)動和應用層驅(qū)動分別采集100個數(shù)據(jù)文件。由圖6分析可知,相對于傳統(tǒng)的應用層驅(qū)動,內(nèi)核驅(qū)動確實減少了系統(tǒng)調(diào)用,同時提高了數(shù)據(jù)傳輸速度,完成同樣的采集、數(shù)據(jù)轉(zhuǎn)換、存儲操作,內(nèi)核驅(qū)動相較于應用程序用時少了約90 ms,效率更高。根據(jù)4000 Hz的采樣率計算,DRDY信號間隔約250 μs,多耗時90 ms意味著寫文件的操作會影響ADC采集,甚至會丟失有效地震信號。
采用統(tǒng)計分析的方式,對系統(tǒng)調(diào)用的減少量進行分析。實驗采用應用層驅(qū)動和內(nèi)核驅(qū)動各采集20000個采樣點時各類系統(tǒng)調(diào)用次數(shù)的總量,如表1所示。
根據(jù)統(tǒng)計結(jié)果分析,內(nèi)核驅(qū)動程序和測試程序部分的系統(tǒng)調(diào)用主要集中在測試程序中打開設備,ioctl設備參數(shù)以及系統(tǒng)時鐘獲取部分,因此明顯比ADS1282應用層驅(qū)動減少了各類系統(tǒng)調(diào)用的次數(shù)。而應用層驅(qū)動的系統(tǒng)調(diào)用量主要集中在查詢與GPIO相連的DRDY_value文件和寫地震數(shù)據(jù)文件部分,因此,通過內(nèi)核驅(qū)動直接調(diào)用具體的VFS寫函數(shù)而非在用戶空間調(diào)用write系統(tǒng)調(diào)用的方式便可實現(xiàn)系統(tǒng)調(diào)用量的大大降低,從而提高采集的實時性。
根據(jù)ADS1282手冊可知,其支持的SPI時鐘為2~16 MHz,讀寫1 bit數(shù)據(jù)耗時t為62.5 ns~0.5 μs,而采樣率為S,即DRDY信號間隔為1/S。查閱ADG804手冊可知,其開關快速切換時間小于25 ns,若忽略采集時通道間切換時間,則其通道可擴展的理論最大道數(shù)N=1/(S·32·t)。以SPI時鐘2 MHz,采樣率4 kHz為例,其通道可擴展數(shù)N=1/(4000×32×0.5×10-6),約15道。實測一個DRDY間隔(250 μs)內(nèi),采集3路數(shù)據(jù)加上3路通道切換耗時60~65 μs,則該地震數(shù)據(jù)采集單元可擴展成12路ADC同時采集。
表1 兩種驅(qū)動系統(tǒng)調(diào)用量統(tǒng)計
本文設計了一種基于Linux的ADC地震數(shù)據(jù)采集內(nèi)核驅(qū)動,支持外部3路ADS1282并行地震數(shù)據(jù)采集。通過在內(nèi)核驅(qū)動實現(xiàn)過程中簡化系統(tǒng)調(diào)用過程,歸類實時性與非實時性操作,解決了地震數(shù)據(jù)采集過程中應用層驅(qū)動存在系統(tǒng)調(diào)用頻繁、硬件控制實時性不高以及數(shù)據(jù)采集效率低下等問題。測試部分,在i.mx6q平臺上、Linux 3.0.35內(nèi)核下,首先完成了ADS1282內(nèi)核驅(qū)動的功能測試,并給出了采集驅(qū)動的功能測試;其次給出了驅(qū)動寫數(shù)據(jù)文件的耗時測試,根據(jù)耗時減少說明內(nèi)核驅(qū)動的實時性有所提高;最后統(tǒng)計了應用層驅(qū)動和內(nèi)核驅(qū)動的系統(tǒng)調(diào)用量,隨后給出了多路擴展性分析??傊?,本驅(qū)動相較于應用層驅(qū)動所采集的數(shù)據(jù)效果好,引入的噪聲少,工作效率高,實時性更好,具備多路可擴展的特點。本設計已經(jīng)應用到復雜山地多波寬頻帶地震數(shù)據(jù)采集儀器中并取得良好的實際應用效果。