文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.174525
中文引用格式: 盛蔚,賀彪,高彤. 基于RT-Thread的無人機數(shù)據(jù)記錄儀設計與實現(xiàn)[J].電子技術(shù)應用,2018,44(4):10-13.
英文引用格式: Sheng Wei,He Biao,Gao Tong. Design and implementation of UAV data recorder based on RT-Thread[J].Application of Electronic Technique,2018,44(4):10-13.
傳統(tǒng)的無人機數(shù)據(jù)記錄儀僅僅是記錄無人機在整個飛行過程中各狀態(tài)參數(shù)的機載電子設備,大多采用FPGA作為控制器,NAND Flash作為存儲單元,SRAM作為數(shù)據(jù)緩存,以并行的方式完成數(shù)據(jù)的緩存和處理[1-2],雖然也能實現(xiàn)飛行數(shù)據(jù)的有效存儲,但又產(chǎn)生了功耗大和體積大的問題。而且FPGA需要外部存儲模塊(如EEPROM或Flash)來存儲編程文件[2-3],相比于ARM內(nèi)置SRAM和Flash運行和存儲編程文件,這無疑增加了外圍電路的復雜性。此外,以NAND Flash作為大容量存儲設備,就必須設計相應的壞塊管理算法和擦寫平衡算法,在實際存儲過程中進行實時ECC校驗,并實時維護一個NAND Flash壞塊表,以防把數(shù)據(jù)寫入壞塊造成無法讀出[4-5],大大降低了系統(tǒng)的存儲效率。
日新月異的無人機應用場合要求數(shù)據(jù)記錄儀不僅要記錄飛行器的飛行狀態(tài),還要記錄各種任務設備的指令、數(shù)據(jù)和工作信息以便離線使用,功能舉例如下:
(1)存儲差分GPS基站和移動站的原始星歷數(shù)據(jù)做后差分解算,提高航測作業(yè)的位置解算精度;
(2)在靜止時和飛行時存儲導航傳感器的所有高頻原始數(shù)據(jù),進行離線噪聲建模,優(yōu)化濾波模型;
(3)在地面和機上分別記錄數(shù)據(jù)鏈上行和下行的指令和數(shù)據(jù),離線分析鏈路可靠性。
除此之外還有諸多功能等待開發(fā)和挖掘,但這些功能都要求數(shù)據(jù)的存儲必須滿足實時、可靠、低功耗、小型化和易存取等特點。本文結(jié)合無人機領(lǐng)域的實際應用需求,設計了一種基于嵌入式實時操作系統(tǒng)RT-Thread的數(shù)據(jù)記錄儀。
1 功能模塊選型
為滿足實時、可靠、低功耗、小型化、低成本和易存取的無人機數(shù)據(jù)記錄儀設計需求,從低功耗、小型化和低成本的角度考慮,ARM微處理器必然是最優(yōu)選擇;從滿足實時性和高可靠的角度考慮,在硬件平臺上移植嵌入式實時操作系統(tǒng),通過線程的時間片輪轉(zhuǎn)來保證無疑是最優(yōu)選擇;從易存取的角度考慮,使用SD卡作為存儲介質(zhì)能夠避免系統(tǒng)將CPU資源浪費在擦寫平衡和ECC校驗等環(huán)節(jié),使用USB進行數(shù)據(jù)讀取能提高數(shù)據(jù)讀取效率。
本文所設計的無人機數(shù)據(jù)記錄儀使用的硬件嵌入式平臺為STM32F4系列微處理器,使用該微處理器的SDIO模塊讀寫SD卡,接收、緩沖并存儲多路串口的輸入數(shù)據(jù),USB模塊讀取存儲的數(shù)據(jù),并移植了嵌入式實時操作系統(tǒng)RT-Thread進行線程調(diào)度和文件系統(tǒng)支持,主體架構(gòu)如圖1所示。
RT-Thread相較于?滋C/OS-III和FreeRTOS等嵌入式實時操作系統(tǒng)有很多優(yōu)點:首先是開源的,且符合POSIX規(guī)范,穩(wěn)定性高;支持Fatfs文件系統(tǒng),采用多級目錄結(jié)構(gòu),能夠?qū)Σ煌愋?、不同來源和不同用途的無人機數(shù)據(jù)進行更科學化的文件管理,且能夠與PC端實現(xiàn)文件互傳,便于數(shù)據(jù)導出;采用基于優(yōu)先級的全搶占式多線程調(diào)度算法和基于時間片的輪轉(zhuǎn)調(diào)度算法,使用內(nèi)核對象(包括信號量、互斥量等)進行線程同步,極大地優(yōu)化了線程的執(zhí)行和調(diào)度效率,提升了微處理器的數(shù)據(jù)存取性能,在此基礎(chǔ)上進行有效的硬件驅(qū)動開發(fā)和應用程序開發(fā)就能夠滿足無人機行業(yè)對數(shù)據(jù)存取的要求。
2 硬件驅(qū)動開發(fā)
硬件驅(qū)動的開發(fā)主要為3部分,包括在嵌入式實時操作系統(tǒng)RT-Thread的架構(gòu)上進行串口模塊、SDIO模塊和USB模塊的驅(qū)動開發(fā)。RT-Thread為這些模塊定義了中間層框架,這個框架向上和向下各提供一個接口,向下是底層驅(qū)動對硬件的接口,這個接口完成對硬件模塊的控制并從硬件獲得數(shù)據(jù),向上是與應用程序交互的接口,通過這個中間層框架,應用程序就可以通過統(tǒng)一的接口訪問底層硬件,即使硬件有所改動上層代碼幾乎不用改動,提高了系統(tǒng)的移植性[6]。
串口驅(qū)動主要包括串口的初始化程序以及中斷接收程序,以實現(xiàn)對外部輸入數(shù)據(jù)的快速響應。SDIO驅(qū)動主要包括SD卡的初始化程序、SD卡的產(chǎn)品信息讀取函數(shù)和SD卡讀寫函數(shù),用來實現(xiàn)對SD卡的功能配置,還需要在SD卡上運行Fatfs文件系統(tǒng),以文件系統(tǒng)的組織形式進行串口數(shù)據(jù)的快速存儲。USB驅(qū)動用于實現(xiàn)PC對SD卡中存儲數(shù)據(jù)的拷貝,以便在PC上進行處理和分析,這就需要開發(fā)USB的大容量存儲設備驅(qū)動[7],而USB主要通過描述符(descriptor)進行接口描述,本文按照如下結(jié)構(gòu)配置描述符[8]:一個設備描述符,采用USB2.0協(xié)議,并支持一個配置描述符;一個配置描述符,包含一個接口描述符;一個接口描述符,接口設備類為Mass Storage類,下設兩個端點;兩個端點描述符,一個IN端點和一個OUT端點負責數(shù)據(jù)接收和發(fā)送,并都采用塊傳輸形式,最大傳輸數(shù)據(jù)包長度為64 B。描述符配置完畢后,USB就可以響應大容量存儲的各類設備請求并按照標準的USB2.0協(xié)議進行數(shù)據(jù)傳輸了。
最后將這3個模塊的底層驅(qū)動與RT-Thread中間層框架實現(xiàn)對接,就可以通過調(diào)用RT-Thread應用層的標準設備接口進行應用程序開發(fā)了。
3 多線程數(shù)據(jù)緩沖存儲策略
在多通道數(shù)據(jù)量大且復雜度高的應用場合,如果把非周期字節(jié)流的接收和存儲放在一個線程里去執(zhí)行,難免會引發(fā)存儲設備的頻繁寫入,大容量存儲設備大多以塊而非字節(jié)為最小寫入單位,一次只寫入幾個字節(jié)與寫入整塊的時間相同,一次只寫入幾個字節(jié)必然造成CPU資源的浪費,而存儲設備的讀取和寫入往往是線程中最耗時的環(huán)節(jié),這樣勢必會降低整體系統(tǒng)的存儲效率。如果恰巧在線程執(zhí)行過程中有新的數(shù)據(jù)到來,CPU就無法及時響應,勢必會影響實時性,造成數(shù)據(jù)損失。
為保證數(shù)據(jù)存儲的完整和可靠,且不過多占用CPU資源影響其他線程調(diào)度,本文創(chuàng)新地提出了多線程數(shù)據(jù)緩沖技術(shù),遵循“先接收后緩沖再存儲”的原則,即設計3個線程分別接收數(shù)據(jù)、緩沖數(shù)據(jù)和存儲數(shù)據(jù),并合理分配CPU資源,讓接收線程處理的數(shù)據(jù)最少,緩沖線程處理的數(shù)據(jù)適中,存儲線程處理的數(shù)據(jù)最多。根據(jù)LIU C L和LAYLAND J在文獻[9]中提出并證明的結(jié)論,在實時操作系統(tǒng)中,單調(diào)速率調(diào)度(RMS)算法的線程設置必須滿足周期越短,優(yōu)先級越高的規(guī)律,因此上述3個線程的優(yōu)先級設置應滿足“執(zhí)行周期遞增,優(yōu)先級遞減”的原則,具體線程設計思路如圖2所示。
在實際數(shù)據(jù)到來后,處于最高優(yōu)先級的接收線程可以快速響應并將接收到的字節(jié)流及時寫入一級緩沖區(qū),一級緩沖區(qū)的大小可以設置為256 B左右,一級緩沖區(qū)存滿后則通知緩沖線程執(zhí)行;處于中等優(yōu)先級的緩沖線程啟動后就迅速把一級緩沖區(qū)的數(shù)據(jù)拷貝到二級緩沖區(qū)中,并將一級緩沖區(qū)清零,數(shù)據(jù)指針復位,使其不影響下一次接收任務的正常寫入,二級緩沖區(qū)的大小可以設置為2 048 B左右,必須顯著大于一級緩沖區(qū)的大小,二級緩沖區(qū)存滿后則通知存儲線程執(zhí)行;處于低優(yōu)先級的存儲線程啟動后就迅速把二級緩沖區(qū)中的數(shù)據(jù)拷貝到三級緩沖區(qū)中,并將二級緩沖區(qū)清零,數(shù)據(jù)指針復位,使其不影響下一次二級緩沖區(qū)的正常寫入,三級緩沖區(qū)設置成一個隊列結(jié)構(gòu),從二級緩沖區(qū)拷貝過來的數(shù)據(jù)就按照隊列依次寫入三級緩沖區(qū),由于SD卡一次最小寫入單位是512 B,為提高對存儲設備的寫入效率,就必須嚴格控制寫入SD卡的字節(jié)數(shù)為512的整數(shù)倍,寫入SD卡完成后再將剩余數(shù)據(jù)的指針移到三級緩沖區(qū)的開頭,并將下一次移進來的數(shù)據(jù)放在這些數(shù)據(jù)的末尾,保證下一次寫入數(shù)據(jù)的正確性和高效率,而且每個線程執(zhí)行完成后都同步計算至下次觸發(fā)的超時時間,保證緩沖區(qū)的數(shù)據(jù)即使不滿也能通過觸發(fā)超時逐步轉(zhuǎn)存最后寫入SD卡,程序執(zhí)行流程如圖3所示。
通過以上3個線程和三級緩沖區(qū)對數(shù)據(jù)進行處理后,相較于使用一個單一線程進行數(shù)據(jù)接收和存儲,完全避免了數(shù)據(jù)丟失問題和SD卡頻繁寫入的資源浪費問題,拆分后串口3個線程的CPU時間片輪轉(zhuǎn)過程如圖4所示。
從操作系統(tǒng)多線程調(diào)度的時間片輪轉(zhuǎn)來看[10],接收線程處理的數(shù)據(jù)量最小,其占用的CPU時間片也很少,即使在緩沖線程和存儲線程的執(zhí)行過程中有數(shù)據(jù)輸入,接收線程也可以搶占較低優(yōu)先級的緩沖線程和存儲線程得以執(zhí)行,保證不丟失任何輸入數(shù)據(jù)。而且由于接收線程執(zhí)行時間短,執(zhí)行完畢后緩沖線程和存儲線程也能從之前被搶占的地方繼續(xù)執(zhí)行,將數(shù)據(jù)流匯聚成數(shù)據(jù)塊再進行寫入,顯著提高數(shù)據(jù)的存儲效率,降低SD卡讀寫的耗時。
4 系統(tǒng)性能測試
為驗證軟硬件設計的正確性和高效性,接下來進行了小批量試制,系統(tǒng)實物如圖5所示,并在試制完成的數(shù)據(jù)記錄儀上進行系統(tǒng)性能測試。
擬定如下測試方案:連接PC和數(shù)據(jù)記錄儀,通過上位機軟件向數(shù)據(jù)記錄儀的3個串口同時以115 200的波特率發(fā)送不同數(shù)據(jù),頻率均為10 Hz,數(shù)據(jù)量均為1 000 B/次,模仿無人機應用中的高頻次連續(xù)數(shù)據(jù),分別以單線程接收存儲和多線程數(shù)據(jù)緩沖存儲兩種方法進行測試,在數(shù)據(jù)記錄儀進行數(shù)據(jù)存儲的同時PC上也通過上位機軟件進行發(fā)送數(shù)據(jù)的同步存儲,連續(xù)不間斷工作24小時進行壓力測試,完成后通過USB口將數(shù)據(jù)記錄儀存儲的3個不同文件拷貝到PC上,以上位機存儲的發(fā)送數(shù)據(jù)為基準,計算兩種方法的數(shù)據(jù)存儲率、CPU實際占用率和SD卡讀寫次數(shù),結(jié)果如圖6所示。
通過這個測試方案不僅驗證了整個系統(tǒng)軟硬件設計的可靠性,還對單線程存儲策略和多線程數(shù)據(jù)緩沖存儲策略進行了對比。測試結(jié)果表明,多線程數(shù)據(jù)緩沖存儲策略因為增加了線程的調(diào)度,雖然增加了CPU的實際占用率,但這與其帶來的數(shù)據(jù)存儲率的顯著提升相比是微不足道的,而且這種方式大幅降低了存儲設備同等數(shù)據(jù)量下的讀寫頻次,延長了存儲設備的使用壽命,明顯優(yōu)于單線程存儲策略,且在長時間、大數(shù)據(jù)輸入壓力測試的情況下仍能維持很好的數(shù)據(jù)存儲性能,數(shù)據(jù)存儲率為100%,達到了設計的預期效果。最后進行實際應用測試,準備兩個數(shù)據(jù)記錄儀,將一個數(shù)據(jù)記錄儀安裝在小型四旋翼無人機上,存儲無人機飛行數(shù)據(jù)和差分GPS移動站接收機的后差分數(shù)據(jù),另一個在地面存儲差分GPS基站接收機的后差分數(shù)據(jù),進行實際多頻次高強度飛行后利用第三方軟件進行后差分解算。經(jīng)測試,數(shù)據(jù)均無丟包,工作均正常,能夠滿足高強度飛行任務的需要。
5 結(jié)論
本文以實際無人機行業(yè)應用為牽引,設計了一款基于RT-Thread的實時、可靠、低功耗、小型化和易存取的無人機數(shù)據(jù)記錄儀,通過多線程數(shù)據(jù)緩沖存儲策略實現(xiàn)了大量連續(xù)數(shù)據(jù)輸入條件下的高效率、高可靠存儲,并能通過USB連接線將存儲的數(shù)據(jù)快速導出到PC中進行事后分析,能夠滿足日益復雜的無人機行業(yè)應用對數(shù)據(jù)記錄儀的要求。另外,多線程和多級緩沖區(qū)的數(shù)據(jù)處理模式不僅局限于嵌入式領(lǐng)域,對于需要多通道數(shù)據(jù)處理的個人計算機和服務器軟件開發(fā)也有一定的借鑒作用。
參考文獻
[1] 韓勇豪.一種大容量無人機飛行數(shù)據(jù)記錄儀的研制[D].南京:南京航空航天大學,2012.
[2] 葉艷.大容量無人機數(shù)據(jù)記錄儀的數(shù)據(jù)卸載及處理技術(shù)研究[D].南京:南京航空航天大學,2014.
[3] 劉光輝,周軍,于曉洲.低成本無人飛行器機載數(shù)據(jù)記錄儀的設計與實現(xiàn)[J].測控技術(shù),2011,30(1):10-12.
[4] 張勝勇,高世杰,吳志勇,等.基于FPGA的NAND Flash壞塊處理方法[J].計算機工程,2010(6):239-240,243.
[5] 彭卓文,楊新民,王勝紅.基于FPGA控制的高速大容量NAND Flash存儲模塊設計[J].電子設計工程,2017,25(7):111-114,118.
[6] 曹成.嵌入式實時操作系統(tǒng)RT-Thread原理分析與應用[D].濟南:山東科技大學,2011.
[7] 薛園園.USB應用開發(fā)技術(shù)大全[M].北京:人民郵電出版社,2007.
[8] 陸斌.低功耗嵌入式網(wǎng)管系統(tǒng)和USB大容量存儲設備的設計和開發(fā)[D].北京:北京郵電大學,2013.
[9] LIU C L,LAYLAND J.Scheduling algorithms for multipro-gramming in a hard real time environment[J].Journal of the ACM,1973,20(1):46-61.
[10] 張博.嵌入式實時操作系統(tǒng)中的數(shù)據(jù)緩沖技術(shù)[J].電子世界,2014(4):24-25.
作者信息:
盛 蔚,賀 彪,高 彤
(北京航空航天大學 儀器科學與光電工程學院,北京100191)