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