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