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